drm/msm/gpu: Rearrange the code that collects the task during a hang
authorJordan Crouse <jcrouse@codeaurora.org>
Tue, 24 Jul 2018 16:33:26 +0000 (10:33 -0600)
committerRob Clark <robdclark@gmail.com>
Mon, 30 Jul 2018 12:49:52 +0000 (08:49 -0400)
Do a bit of cleanup to prepare for upcoming changes to pass the
hanging task comm and cmdline to the crash dump function.

v2: Use GFP_ATOMIC while holding the rcu lock per Chris Wilson

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_gpu.c

index 1c09acf..03ba887 100644 (file)
@@ -314,6 +314,7 @@ static void recover_worker(struct work_struct *work)
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_submit *submit;
        struct msm_ringbuffer *cur_ring = gpu->funcs->active_ring(gpu);
+       char *comm = NULL, *cmd = NULL;
        int i;
 
        mutex_lock(&dev->struct_mutex);
@@ -327,7 +328,7 @@ static void recover_worker(struct work_struct *work)
                rcu_read_lock();
                task = pid_task(submit->pid, PIDTYPE_PID);
                if (task) {
-                       char *cmd;
+                       comm = kstrdup(task->comm, GFP_ATOMIC);
 
                        /*
                         * So slightly annoying, in other paths like
@@ -340,22 +341,23 @@ static void recover_worker(struct work_struct *work)
                         * about the submit going away.
                         */
                        mutex_unlock(&dev->struct_mutex);
-                       cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
+                       cmd = kstrdup_quotable_cmdline(task, GFP_ATOMIC);
                        mutex_lock(&dev->struct_mutex);
+               }
+               rcu_read_unlock();
 
+               if (comm && cmd) {
                        dev_err(dev->dev, "%s: offending task: %s (%s)\n",
-                               gpu->name, task->comm, cmd);
+                               gpu->name, comm, cmd);
 
                        msm_rd_dump_submit(priv->hangrd, submit,
-                               "offending task: %s (%s)", task->comm, cmd);
-
-                       kfree(cmd);
-               } else {
+                               "offending task: %s (%s)", comm, cmd);
+               } else
                        msm_rd_dump_submit(priv->hangrd, submit, NULL);
-               }
-               rcu_read_unlock();
        }
 
+       kfree(cmd);
+       kfree(comm);
 
        /*
         * Update all the rings with the latest and greatest fence.. this