On Tue, Feb 05, 2019 at 07:21:08PM -0800, Eric Dumazet wrote: > >>> > >>> diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c > >>> index d43b145..79eef9d 100644 > >>> --- a/kernel/bpf/stackmap.c > >>> +++ b/kernel/bpf/stackmap.c > >>> @@ -338,6 +338,13 @@ static void stack_map_get_build_id_offset(struct > >>> bpf_stack_ > >>> } else { > >>> work->sem = ¤t->mm->mmap_sem; > >>> irq_work_queue(&work->irq_work); > >>> + > >>> + /* > >>> + * The irq_work will release the mmap_sem with > >>> + * up_read_non_owner(). The rwsem_release() is called > >>> + * here to release the lock from lockdep's perspective. > >>> + */ > >>> + rwsem_release(¤t->mm->mmap_sem.dep_map, 1, > >>> _RET_IP_); > >> are you saying the above is enough coupled with up_read_non_owner? > >> Looking at how amdgpu is using this api... I think they just use non_owner > >> version when doing things from different task. > >> So I don't think pairing non_owner with non_owner is strictly necessary. > >> It seems fine to use down_read_trylock() with above rwsem_release() hack > >> plus up_read_non_owner(). > >> Am I missing something? > >> > > The statement above is to clear the state for the lockdep so that it > > knows that the task no longer owns the lock. Without doing that, there > > is a possibility of some other kind of incorrect lockdep warning may be > > produced because the code will still think the task hold a read-lock on > > the mmap_sem. It is also possible no warning will be reported. > > > > The bpf code is kind of special that it acquires the mmap_sem. Later on, > > it either releases it itself (non-NMI) or request irq_work to release it > > (NMI). So either, you use the _non_owner versions for both acquire and > > release or fake the release like the code segment above. > > > > Peter, please chime in if you have other suggestion. > > > > Hi guys > > What are the plans to address the issue then ? > Latest net tree exhibits this trace :
Thanks for the reminder :) I've been waiting for Peter's direction on this one. Happy to fix it whichever way. To recap: Approach 1: s/up_read/up_read_non_owner/ from irq_work + rwsem_release as Longman proposed. Apporach 2: introduce down_read_trylock_non_owner and pair it with up_read_non_owner in both irq_work and normal. My preference is 1. I think Longman's as well.