]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/mmu_notifiers: use hlist_for_each_entry_srcu() for SRCU list traversal
authorLi RongQing <lirongqing@baidu.com>
Wed, 4 Feb 2026 08:09:37 +0000 (03:09 -0500)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:02 +0000 (13:53 -0700)
The mmu_notifier_subscriptions list is protected by SRCU.  While the
current code uses hlist_for_each_entry_rcu() with an explicit SRCU lockdep
check, it is more appropriate to use the dedicated
hlist_for_each_entry_srcu() macro.

This change aligns the code with the preferred kernel API for
SRCU-protected lists, improving code clarity and ensuring that the
synchronization method is explicitly documented by the iterator name
itself.

Link: https://lkml.kernel.org/r/20260204080937.2472-1-lirongqing@baidu.com
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Acked-by: SeongJae Park <sj@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/mmu_notifier.c

index a6cdf3674bdc528f2aa6bce08274c85032bf4680..2502474b83b60613d88505173fe7314c25f33730 100644 (file)
@@ -309,7 +309,7 @@ static void mn_hlist_release(struct mmu_notifier_subscriptions *subscriptions,
         * ->release returns.
         */
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist,
+       hlist_for_each_entry_srcu(subscription, &subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu))
                /*
                 * If ->release runs before mmu_notifier_unregister it must be
@@ -372,7 +372,7 @@ int __mmu_notifier_clear_flush_young(struct mm_struct *mm,
        int young = 0, id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription,
+       hlist_for_each_entry_srcu(subscription,
                                 &mm->notifier_subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                if (subscription->ops->clear_flush_young)
@@ -392,7 +392,7 @@ int __mmu_notifier_clear_young(struct mm_struct *mm,
        int young = 0, id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription,
+       hlist_for_each_entry_srcu(subscription,
                                 &mm->notifier_subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                if (subscription->ops->clear_young)
@@ -411,7 +411,7 @@ int __mmu_notifier_test_young(struct mm_struct *mm,
        int young = 0, id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription,
+       hlist_for_each_entry_srcu(subscription,
                                 &mm->notifier_subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                if (subscription->ops->test_young) {
@@ -466,7 +466,7 @@ static int mn_hlist_invalidate_range_start(
        int id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist,
+       hlist_for_each_entry_srcu(subscription, &subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                const struct mmu_notifier_ops *ops = subscription->ops;
 
@@ -504,7 +504,7 @@ static int mn_hlist_invalidate_range_start(
                 * notifiers and one or more failed start, any that succeeded
                 * start are expecting their end to be called.  Do so now.
                 */
-               hlist_for_each_entry_rcu(subscription, &subscriptions->list,
+               hlist_for_each_entry_srcu(subscription, &subscriptions->list,
                                         hlist, srcu_read_lock_held(&srcu)) {
                        if (!subscription->ops->invalidate_range_end)
                                continue;
@@ -542,7 +542,7 @@ mn_hlist_invalidate_end(struct mmu_notifier_subscriptions *subscriptions,
        int id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist,
+       hlist_for_each_entry_srcu(subscription, &subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                if (subscription->ops->invalidate_range_end) {
                        if (!mmu_notifier_range_blockable(range))
@@ -577,7 +577,7 @@ void __mmu_notifier_arch_invalidate_secondary_tlbs(struct mm_struct *mm,
        int id;
 
        id = srcu_read_lock(&srcu);
-       hlist_for_each_entry_rcu(subscription,
+       hlist_for_each_entry_srcu(subscription,
                                 &mm->notifier_subscriptions->list, hlist,
                                 srcu_read_lock_held(&srcu)) {
                if (subscription->ops->arch_invalidate_secondary_tlbs)
@@ -713,7 +713,7 @@ find_get_mmu_notifier(struct mm_struct *mm, const struct mmu_notifier_ops *ops)
        struct mmu_notifier *subscription;
 
        spin_lock(&mm->notifier_subscriptions->lock);
-       hlist_for_each_entry_rcu(subscription,
+       hlist_for_each_entry_srcu(subscription,
                                 &mm->notifier_subscriptions->list, hlist,
                                 lockdep_is_held(&mm->notifier_subscriptions->lock)) {
                if (subscription->ops != ops)