OSDN Git Service

drm/msm: use kthread_create_worker instead of kthread_run
authorBernard <bernard@vivo.com>
Tue, 21 Jul 2020 01:33:03 +0000 (09:33 +0800)
committerRob Clark <robdclark@chromium.org>
Fri, 31 Jul 2020 13:46:17 +0000 (06:46 -0700)
Use kthread_create_worker to simplify the code and optimise
the manager struct: msm_drm_thread. With this change, we
could remove struct element (struct task_struct *thread &
struct kthread_worker worker), instead, use one point (struct
kthread_worker *worker).

Signed-off-by: Bernard Zhao <bernard@vivo.com>
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_drv.h

index 969d95a..f272a8d 100644 (file)
@@ -396,7 +396,7 @@ static void dpu_crtc_frame_event_cb(void *data, u32 event)
        fevent->event = event;
        fevent->crtc = crtc;
        fevent->ts = ktime_get();
-       kthread_queue_work(&priv->event_thread[crtc_id].worker, &fevent->work);
+       kthread_queue_work(priv->event_thread[crtc_id].worker, &fevent->work);
 }
 
 void dpu_crtc_complete_commit(struct drm_crtc *crtc)
index 92e8851..36d98d4 100644 (file)
@@ -252,10 +252,8 @@ static int msm_drm_uninit(struct device *dev)
 
        /* clean up event worker threads */
        for (i = 0; i < priv->num_crtcs; i++) {
-               if (priv->event_thread[i].thread) {
-                       kthread_destroy_worker(&priv->event_thread[i].worker);
-                       priv->event_thread[i].thread = NULL;
-               }
+               if (priv->event_thread[i].worker)
+                       kthread_destroy_worker(priv->event_thread[i].worker);
        }
 
        msm_gem_shrinker_cleanup(ddev);
@@ -518,19 +516,15 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
        for (i = 0; i < priv->num_crtcs; i++) {
                /* initialize event thread */
                priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id;
-               kthread_init_worker(&priv->event_thread[i].worker);
                priv->event_thread[i].dev = ddev;
-               priv->event_thread[i].thread =
-                       kthread_run(kthread_worker_fn,
-                               &priv->event_thread[i].worker,
-                               "crtc_event:%d", priv->event_thread[i].crtc_id);
-               if (IS_ERR(priv->event_thread[i].thread)) {
+               priv->event_thread[i].worker = kthread_create_worker(0,
+                       "crtc_event:%d", priv->event_thread[i].crtc_id);
+               if (IS_ERR(priv->event_thread[i].worker)) {
                        DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
-                       priv->event_thread[i].thread = NULL;
                        goto err_msm_uninit;
                }
 
-               ret = sched_setscheduler(priv->event_thread[i].thread,
+               ret = sched_setscheduler(priv->event_thread[i].worker->task,
                                         SCHED_FIFO, &param);
                if (ret)
                        dev_warn(dev, "event_thread set priority failed:%d\n",
index 2687f7a..af259b0 100644 (file)
@@ -129,9 +129,8 @@ struct msm_display_info {
 /* Commit/Event thread specific structure */
 struct msm_drm_thread {
        struct drm_device *dev;
-       struct task_struct *thread;
        unsigned int crtc_id;
-       struct kthread_worker worker;
+       struct kthread_worker *worker;
 };
 
 struct msm_drm_private {