[Freedreno] [PATCH 08/13] drm/msm/gpu: Rearrange the code that collects the task during a hang

Rob Clark robdclark at gmail.com
Sat Aug 4 17:17:44 UTC 2018


On Thu, Jul 12, 2018 at 3:48 PM Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Quoting Jordan Crouse (2018-07-12 19:59:25)
> > Do a bit of cleanup to prepare for upcoming changes to pass the
> > hanging task comm and cmdline to the crash dump function.
> >
> > Signed-off-by: Jordan Crouse <jcrouse at codeaurora.org>
> > ---
> >  drivers/gpu/drm/msm/msm_gpu.c | 18 ++++++++++--------
> >  1 file changed, 10 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> > index 1c09acfb4028..2ca354047250 100644
> > --- a/drivers/gpu/drm/msm/msm_gpu.c
> > +++ b/drivers/gpu/drm/msm/msm_gpu.c
> > @@ -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_KERNEL);
>
> Under rcu_read_lock(), GFP_KERNEL is not allowed, you need GFP_NOWAIT or
> some such (or grab a reference to the pid and drop rcu then GFP_KERNEL).

I started looking at a similar issue w/ our use of
kstrdup_quotable_cmdline() under rcu_read_lock().. I *guess* I hadn't
noticed it before due to different RCU kconfig?

I can use GFP_ATOMIC, and I can fix kstrdup_quotable_cmdline() to
actually use gfp flags passed in for kmalloc() (and similar bug in
kstrdup_quotable_file()).. but get_cmdline() still grabs mmap_sem
which complains under rcu_read_lock()..

is there any way to ensure the tast_struct sticks around long enough
to get it's cmdline without holding rcu_read_lock()?  I couldn't find
any refcnt'ing on task_struct itself, which makes this seem a bit
unsolveable :-/

BR,
-R


More information about the dri-devel mailing list