Commit 1ef5789d authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

macvlan: annotate data-races around port->bc_queue_len_used



port->bc_queue_len_used is read and written locklessly,
add READ_ONCE()/WRITE_ONCE() annotations.

While WRITE_ONCE() in macvlan_fill_info() is not yet needed,
it is a prereq for future RTNL avoidance.

Fixes: d4bff72c ("macvlan: Support for high multicast packet rate")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260401103809.3038139-2-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f35340f2
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -356,6 +356,7 @@ static void macvlan_broadcast_enqueue(struct macvlan_port *port,
				      const struct macvlan_dev *src,
				      struct sk_buff *skb)
{
	u32 bc_queue_len_used = READ_ONCE(port->bc_queue_len_used);
	struct sk_buff *nskb;
	int err = -ENOMEM;

@@ -366,7 +367,7 @@ static void macvlan_broadcast_enqueue(struct macvlan_port *port,
	MACVLAN_SKB_CB(nskb)->src = src;

	spin_lock(&port->bc_queue.lock);
	if (skb_queue_len(&port->bc_queue) < port->bc_queue_len_used) {
	if (skb_queue_len(&port->bc_queue) < bc_queue_len_used) {
		if (src)
			dev_hold(src->dev);
		__skb_queue_tail(&port->bc_queue, nskb);
@@ -1731,7 +1732,8 @@ static int macvlan_fill_info(struct sk_buff *skb,
	}
	if (nla_put_u32(skb, IFLA_MACVLAN_BC_QUEUE_LEN, vlan->bc_queue_len_req))
		goto nla_put_failure;
	if (nla_put_u32(skb, IFLA_MACVLAN_BC_QUEUE_LEN_USED, port->bc_queue_len_used))
	if (nla_put_u32(skb, IFLA_MACVLAN_BC_QUEUE_LEN_USED,
			READ_ONCE(port->bc_queue_len_used)))
		goto nla_put_failure;
	if (port->bc_cutoff != 1 &&
	    nla_put_s32(skb, IFLA_MACVLAN_BC_CUTOFF, port->bc_cutoff))
@@ -1791,7 +1793,7 @@ static void update_port_bc_queue_len(struct macvlan_port *port)
		if (vlan->bc_queue_len_req > max_bc_queue_len_req)
			max_bc_queue_len_req = vlan->bc_queue_len_req;
	}
	port->bc_queue_len_used = max_bc_queue_len_req;
	WRITE_ONCE(port->bc_queue_len_used, max_bc_queue_len_req);
}

static int macvlan_device_event(struct notifier_block *unused,