mirror of
https://github.com/torvalds/linux.git
synced 2026-10-13 13:51:03 +02:00
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: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9b79da5d69
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user