]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
l2tp: use rcu list add/del when updating lists
authorJames Chapman <jchapman@katalix.com>
Mon, 29 Jul 2024 15:38:11 +0000 (16:38 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Jul 2024 08:25:13 +0000 (09:25 +0100)
l2tp_v3_session_htable and tunnel->session_list are read by lockless
getters using RCU. Use rcu list variants when adding or removing list
items.

Signed-off-by: James Chapman <jchapman@katalix.com>
Signed-off-by: Tom Parkin <tparkin@katalix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/l2tp/l2tp_core.c

index cbf117683faba6d439a1c7915d3853846d8cd5b1..cd9b157e8b4de54ba149adb38ff0dec3fb856c1c 100644 (file)
@@ -419,12 +419,12 @@ static int l2tp_session_collision_add(struct l2tp_net *pn,
 
        /* If existing session isn't already in the session hlist, add it. */
        if (!hash_hashed(&session2->hlist))
-               hash_add(pn->l2tp_v3_session_htable, &session2->hlist,
-                        session2->hlist_key);
+               hash_add_rcu(pn->l2tp_v3_session_htable, &session2->hlist,
+                            session2->hlist_key);
 
        /* Add new session to the hlist and collision list */
-       hash_add(pn->l2tp_v3_session_htable, &session1->hlist,
-                session1->hlist_key);
+       hash_add_rcu(pn->l2tp_v3_session_htable, &session1->hlist,
+                    session1->hlist_key);
        refcount_inc(&clist->ref_count);
        l2tp_session_coll_list_add(clist, session1);
 
@@ -440,7 +440,7 @@ static void l2tp_session_collision_del(struct l2tp_net *pn,
 
        lockdep_assert_held(&pn->l2tp_session_idr_lock);
 
-       hash_del(&session->hlist);
+       hash_del_rcu(&session->hlist);
 
        if (clist) {
                /* Remove session from its collision list. If there
@@ -515,7 +515,7 @@ int l2tp_session_register(struct l2tp_session *session,
 
        l2tp_tunnel_inc_refcount(tunnel);
        WRITE_ONCE(session->tunnel, tunnel);
-       list_add(&session->list, &tunnel->session_list);
+       list_add_rcu(&session->list, &tunnel->session_list);
 
        if (tunnel->version == L2TP_HDR_VER_3) {
                if (!other_session)