]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
neighbour: Annotate access to struct pneigh_entry.{flags,protocol}.
authorKuniyuki Iwashima <kuniyu@google.com>
Wed, 16 Jul 2025 22:08:13 +0000 (22:08 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 17 Jul 2025 23:25:21 +0000 (16:25 -0700)
We will convert pneigh readers to RCU, and its flags and protocol
will be read locklessly.

Let's annotate the access to the two fields.

Note that all access to pn->permanent is under RTNL (neigh_add()
and pneigh_ifdown_and_unlock()), so WRITE_ONCE() and READ_ONCE()
are not needed.

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250716221221.442239-9-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/neighbour.c

index fa2e60a479ef3c97e1d1afd5d112d6f08daa9c6d..59dfdecddff3f0cde84d7b7d8851525d013196a7 100644 (file)
@@ -2044,10 +2044,10 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
                err = -ENOBUFS;
                pn = pneigh_create(tbl, net, dst, dev);
                if (pn) {
-                       pn->flags = ndm_flags;
+                       WRITE_ONCE(pn->flags, ndm_flags);
                        pn->permanent = !!(ndm->ndm_state & NUD_PERMANENT);
                        if (protocol)
-                               pn->protocol = protocol;
+                               WRITE_ONCE(pn->protocol, protocol);
                        err = 0;
                }
                goto out;
@@ -2678,13 +2678,15 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
        u32 neigh_flags, neigh_flags_ext;
        struct nlmsghdr *nlh;
        struct ndmsg *ndm;
+       u8 protocol;
 
        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
        if (nlh == NULL)
                return -EMSGSIZE;
 
-       neigh_flags_ext = pn->flags >> NTF_EXT_SHIFT;
-       neigh_flags     = pn->flags & NTF_OLD_MASK;
+       neigh_flags = READ_ONCE(pn->flags);
+       neigh_flags_ext = neigh_flags >> NTF_EXT_SHIFT;
+       neigh_flags &= NTF_OLD_MASK;
 
        ndm = nlmsg_data(nlh);
        ndm->ndm_family  = tbl->family;
@@ -2698,7 +2700,8 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
        if (nla_put(skb, NDA_DST, tbl->key_len, pn->key))
                goto nla_put_failure;
 
-       if (pn->protocol && nla_put_u8(skb, NDA_PROTOCOL, pn->protocol))
+       protocol = READ_ONCE(pn->protocol);
+       if (protocol && nla_put_u8(skb, NDA_PROTOCOL, protocol))
                goto nla_put_failure;
        if (neigh_flags_ext && nla_put_u32(skb, NDA_FLAGS_EXT, neigh_flags_ext))
                goto nla_put_failure;