Skip to content

Commit

Permalink
mdss: rotator: Use FIFO kthread for rotator work
Browse files Browse the repository at this point in the history
Bug: 30891496
Change-Id: I65725fd7f8bd2b10543bf3fc3307308d9d11a9c0
Signed-off-by: Naseer Ahmed <[email protected]>
Signed-off-by: Francisco Franco <[email protected]>
  • Loading branch information
naseer authored and Razziell committed Feb 15, 2019
1 parent 7835162 commit e6de715
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
34 changes: 20 additions & 14 deletions drivers/video/msm/mdss/mdss_rotator.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = {
};

static struct mdss_rot_mgr *rot_mgr;
static void mdss_rotator_wq_handler(struct work_struct *work);
static void mdss_rotator_work_handler(struct kthread_work *work);

static int mdss_rotator_bus_scale_set_quota(struct mdss_rot_bus_data_type *bus,
u64 quota)
Expand Down Expand Up @@ -846,21 +846,26 @@ static int mdss_rotator_init_queue(struct mdss_rot_mgr *mgr)
{
int i, size, ret = 0;
char name[32];
struct sched_param param = { .sched_priority = 5 };

size = sizeof(struct mdss_rot_queue) * mgr->queue_count;
mgr->queues = devm_kzalloc(&mgr->pdev->dev, size, GFP_KERNEL);
if (!mgr->queues)
return -ENOMEM;

for (i = 0; i < mgr->queue_count; i++) {
snprintf(name, sizeof(name), "rot_workq_%d", i);
pr_debug("work queue name=%s\n", name);
mgr->queues[i].rot_work_queue = alloc_ordered_workqueue("%s",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_HIGHPRI, name);
if (!mgr->queues[i].rot_work_queue) {
ret = -EPERM;
snprintf(name, sizeof(name), "rot_thread_%d", i);
pr_info("work thread name=%s\n", name);
init_kthread_worker(&mgr->queues[i].worker);
mgr->queues[i].thread = kthread_run(kthread_worker_fn,
&mgr->queues[i].worker,
name);
if (IS_ERR(&mgr->queues[i].thread)) {
pr_err("Unable to start rotator thread: %d", i);
ret = -ENOMEM;
break;
}
sched_setscheduler(mgr->queues[i].thread, SCHED_FIFO, &param);

snprintf(name, sizeof(name), "rot_timeline_%d", i);
pr_debug("timeline name=%s\n", name);
Expand Down Expand Up @@ -890,8 +895,8 @@ static void mdss_rotator_deinit_queue(struct mdss_rot_mgr *mgr)
return;

for (i = 0; i < mgr->queue_count; i++) {
if (mgr->queues[i].rot_work_queue)
destroy_workqueue(mgr->queues[i].rot_work_queue);
if (mgr->queues[i].thread)
kthread_stop(mgr->queues[i].thread);

if (mgr->queues[i].timeline.timeline) {
struct sync_timeline *obj;
Expand Down Expand Up @@ -1028,7 +1033,7 @@ static void mdss_rotator_queue_request(struct mdss_rot_mgr *mgr,
entry = req->entries + i;
queue = entry->queue;
entry->output_fence = NULL;
queue_work(queue->rot_work_queue, &entry->commit_work);
queue_kthread_work(&queue->worker, &entry->commit_work);
}
}

Expand Down Expand Up @@ -1537,7 +1542,8 @@ static int mdss_rotator_add_request(struct mdss_rot_mgr *mgr,

entry->request = req;

INIT_WORK(&entry->commit_work, mdss_rotator_wq_handler);
init_kthread_work(&entry->commit_work,
mdss_rotator_work_handler);

ret = mdss_rotator_create_fence(entry);
if (ret) {
Expand Down Expand Up @@ -1589,7 +1595,7 @@ static void mdss_rotator_cancel_request(struct mdss_rot_mgr *mgr,
*/
for (i = req->count - 1; i >= 0; i--) {
entry = req->entries + i;
cancel_work_sync(&entry->commit_work);
flush_kthread_work(&entry->commit_work);
}

for (i = req->count - 1; i >= 0; i--) {
Expand Down Expand Up @@ -1859,7 +1865,7 @@ static int mdss_rotator_handle_entry(struct mdss_rot_hw_resource *hw,
return ret;
}

static void mdss_rotator_wq_handler(struct work_struct *work)
static void mdss_rotator_work_handler(struct kthread_work *work)
{
struct mdss_rot_entry *entry;
struct mdss_rot_entry_container *request;
Expand Down Expand Up @@ -2042,7 +2048,7 @@ static int mdss_rotator_close_session(struct mdss_rot_mgr *mgr,
ATRACE_BEGIN(__func__);
mutex_lock(&perf->work_dis_lock);
if (mdss_rotator_is_work_pending(mgr, perf)) {
pr_debug("Work is still pending, offload free to wq\n");
pr_debug("Work is still pending, offload free to worker\n");
mutex_lock(&mgr->bus_lock);
mgr->pending_close_bw_vote += perf->bw;
mutex_unlock(&mgr->bus_lock);
Expand Down
6 changes: 3 additions & 3 deletions drivers/video/msm/mdss/mdss_rotator_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ struct mdss_rot_hw_resource {
};

struct mdss_rot_queue {
struct workqueue_struct *rot_work_queue;
struct kthread_worker worker;
struct task_struct *thread;
struct mdss_rot_timeline timeline;

struct mutex hw_lock;
struct mdss_rot_hw_resource *hw;
};
Expand All @@ -87,7 +87,7 @@ struct mdss_rot_entry_container {

struct mdss_rot_entry {
struct mdp_rotation_item item;
struct work_struct commit_work;
struct kthread_work commit_work;

struct mdss_rot_queue *queue;
struct mdss_rot_entry_container *request;
Expand Down

0 comments on commit e6de715

Please sign in to comment.