Commit 9b79da5d authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'macvlan-broadcast-delivery-changes'

Eric Dumazet says:

====================
macvlan: broadcast delivery changes

First patch adds data-race annotations.

Second patch changes macvlan_broadcast_enqueue() to return
early if the queue is full.
====================

Link: https://patch.msgid.link/20260401103809.3038139-1-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents f35340f2 0d5dc1d7
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -356,9 +356,13 @@ 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;

	if (skb_queue_len_lockless(&port->bc_queue) >= bc_queue_len_used)
		goto err;

	nskb = skb_clone(skb, GFP_ATOMIC);
	if (!nskb)
		goto err;
@@ -366,7 +370,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 +1735,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 +1796,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,