On Wed, 20 Apr 2022 14:37:34 +1000 Alistair Popple <apopple@xxxxxxxxxx> wrote: > In some cases it is possible for mmu_interval_notifier_remove() to race > with mn_tree_inv_end() allowing it to return while the notifier data > structure is still in use. Consider the following sequence: > > CPU0 - mn_tree_inv_end() CPU1 - mmu_interval_notifier_remove() > ----------------------------------- ------------------------------------ > spin_lock(subscriptions->lock); > seq = subscriptions->invalidate_seq; > spin_lock(subscriptions->lock); spin_unlock(subscriptions->lock); > subscriptions->invalidate_seq++; > wait_event(invalidate_seq != seq); > return; > interval_tree_remove(interval_sub); kfree(interval_sub); > spin_unlock(subscriptions->lock); > wake_up_all(); > > As the wait_event() condition is true it will return immediately. This > can lead to use-after-free type errors if the caller frees the data > structure containing the interval notifier subscription while it is > still on a deferred list. Fix this by taking the appropriate lock when > reading invalidate_seq to ensure proper synchronisation. > > ... > > Fixes: 99cb252f5e68 ("mm/mmu_notifier: add an interval tree notifier") Do you think fix this should be backported into older kernels?