Commit cc03492c authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

neighbour: Annotate access to struct pneigh_entry.{flags,protocol}.



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: default avatarKuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250716221221.442239-9-kuniyu@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d539d8fb
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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;