Re: [PATCH] rcu: Drop vmalloc memory info dump when double call_rcu()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>
> On Tue, Aug 22, 2023 at 10:27 PM Z qiang <qiang.zhang1211@xxxxxxxxx> wrote:
> >
> > >
> > > On Thu, Aug 17, 2023 at 2:34 AM Zqiang <qiang.zhang1211@xxxxxxxxx> wrote:
> > > >
> > > > Currently, for double invoke call_rcu(), will dump rcu_head objects
> > > > memory info, if the objects is not allocated from the slab allocator,
> > > > the vmalloc_dump_obj() will be invoke and the vmap_area_lock spinlock
> > > > need to be held, since the call_rcu() can be invoked in interrupt context,
> > > > therefore, there is a possibility of spinlock deadlock scenarios.
> [..]
> > > > -
> > > > -       if (virt_addr_valid(object))
> > > > +       if (is_vmalloc_addr(object))
> > > > +               type = "vmalloc memory";
> > > > +       else if (virt_addr_valid(object))
> > > >                 type = "non-slab/vmalloc memory";
> > > >         else if (object == NULL)
> > > >                 type = "NULL pointer";
> > > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> > > > index 93cf99aba335..224af955bcb5 100644
> > > > --- a/mm/vmalloc.c
> > > > +++ b/mm/vmalloc.c
> > > > @@ -4271,20 +4271,6 @@ void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
> > > >  }
> > > >  #endif /* CONFIG_SMP */
> > > >
> > > > -#ifdef CONFIG_PRINTK
> > > > -bool vmalloc_dump_obj(void *object)
> > > > -{
> > > > -       struct vm_struct *vm;
> > > > -       void *objp = (void *)PAGE_ALIGN((unsigned long)object);
> > > > -
> > > > -       vm = find_vm_area(objp);
> > >
> > > What about adding something like the following to vmalloc.c. Would it work?
> > >
> > > +static struct vmap_area *find_vmap_area_trylock(unsigned long addr)
> > > +{
> > > +       struct vmap_area *va;
> > > +
> > > +       if (!spin_trylock(&vmap_area_lock))
> > > +               return NULL;
> > > +       va = __find_vmap_area(addr);
> > > +       spin_unlock(&vmap_area_lock);
> > > +
> > > +       return va;
> > > +}
> > >
> > > and call it from vmalloc_dump_obj():
> > >
> > > vm = find_vm_area_trylock(objp);
> > >
> > > And then keep the rest of your patch as it is but add back the call to
> > > vmalloc_dump_obj() in mem_dump_obj():
> > >
> > >        if (vmalloc_dump_obj(object))
> > >                return;
> > >
> > >  -       if (virt_addr_valid(object))
> > >  +       if (is_vmalloc_addr(object))
> > >  +               type = "vmalloc memory";
> > >  +       else if (virt_addr_valid(object))
> > >                  type = "non-slab/vmalloc memory";
> > >
> > >
> > > If that still throws "sleeping function called" type warnings, then
> > > that is a preempt RT issue because spin_trylock() on conversion to a
> > > sleeping lock should not be sleeping as it is uncontended.
> > >
> >
> > Hello, Joel
> >
> > I did a test in the RT kernel with the following modifications, and
> > didn't trigger
> > sleeping function called warning.
> >
> >
> > diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> > index 93cf99aba335..e07b0e34249b 100644
> > --- a/mm/vmalloc.c
> > +++ b/mm/vmalloc.c
> > @@ -4272,12 +4272,24 @@ void pcpu_free_vm_areas(struct vm_struct
> > **vms, int nr_vms)
> >  #endif /* CONFIG_SMP */
> >
> >  #ifdef CONFIG_PRINTK
> > +static struct vm_struct *find_vmap_area_trylock(unsigned long addr)
> > +{
> > +       struct vmap_area *va;
> > +
> > +       if (!spin_trylock(&vmap_area_lock))
> > +               return NULL;
> > +       va = __find_vmap_area(addr, &vmap_area_root);
> > +       spin_unlock(&vmap_area_lock);
> > +
> > +       return va ? va->vm : NULL;
> > +}
> > +
> >  bool vmalloc_dump_obj(void *object)
> >  {
> >         struct vm_struct *vm;
> >         void *objp = (void *)PAGE_ALIGN((unsigned long)object);
> >
> > -       vm = find_vm_area(objp);
> > +       vm = find_vmap_area_trylock((unsigned long)objp);
> >         if (!vm)
> >                 return false;
> >         pr_cont(" %u-page vmalloc region starting at %#lx allocated at %pS\n",
> >
> >
> > If double call_rcu() appears in different threads at the same time,
> > It is possible to dump only one of the vmalloc information.
>
> Great to hear and thanks for checking! So what I'll do is create 2
> patches -- one for the vmalloc change, and one for the patch you
> submitted to use the vmalloc change. For the second patch, I'll keep
> your authorship for attribution.  I'll also queue it on my staging
> trees for further testing. Let me know if that does not sound okay.
>


Thanks, Joel. It's okay :)


> Today is a lighter work day for me, but allow me 1-2 days for sending
> this out for review. Thanks,
>
>  - Joel




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux