On Wed, May 17, 2023 at 12:36 PM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > .. this is the patch that I think should go on top of it to fix the > misleading "safe" and the incorrect RCU walk. > > NOTE! This adds that > > lockdep_assert_held(&event_mutex); > > to user_event_enabler_update() too. One more note: I think it would be really good to use different names for the "links". We have "mm->link", that is the list of mm's on the 'user_event_mms' list, protected by the 'user_event_mms_lock' and RCU-walked. And then we have 'enabler->link', which is the list of enables on the 'user_mm->enablers' list, protected by event_mutex, and _also_ occasionally RCU-walked. And then we have 'validator->link', which isn't RCU-walked, and seems to also be protected by the event_mutex (?). This is all very confusing when looking at it as an outsider. Particularly when you sometimes just see list_del_rcu(&mm->link); and you have to figure "which 'link' are we talking about again?". Also, I have to say, I found "mm->next" *really* confusing at first. It turns out that "mm->next" is this list that is dynamically built up by user_event_mm_get_all(), and is only a one-shot list that is valid only as long as 'event_mutex' is held. But the only lock the code *talks* about is the RCU lock, which does *not* protect that list, and only exists as a way to walk that user_event_mms list without taking any locks. So user_event_enabler_update() actually relies on that 'event_mutex' lock in another way than the obvious one that is about the mm->enablers list that it *also* walks. Again, that all seems to work, but it's *really* confusing how "mm->next" always exists as a field, but is only usable and valid while you hold that event_mutex and have called user_event_mm_get_all() to gather the list. I think both user_event_enabler_update() and user_event_mm_get_all() should have a mention of how they require event_mutex and how that ->next list works. Anyway, I still *think* the two patches I sent out are right, but I'm just mentioning this confusion I had to deal with when trying to decode what the rules were. Maybe all the above is obvious to everybody else, but it took me a while to decipher (and maybe I misread something). Linus