Skip to content

Commit ef874de

Browse files
author
Paolo Abeni
committed
netpoll: hold rcu read lock in __netpoll_send_skb()
JIRA: https://issues.redhat.com/browse/RHEL-87474 Upstream commit: commit 505ead7 Author: Breno Leitao <leitao@debian.org> Date: Thu Mar 6 05:16:18 2025 -0800 netpoll: hold rcu read lock in __netpoll_send_skb() The function __netpoll_send_skb() is being invoked without holding the RCU read lock. This oversight triggers a warning message when CONFIG_PROVE_RCU_LIST is enabled: net/core/netpoll.c:330 suspicious rcu_dereference_check() usage! netpoll_send_skb netpoll_send_udp write_ext_msg console_flush_all console_unlock vprintk_emit To prevent npinfo from disappearing unexpectedly, ensure that __netpoll_send_skb() is protected with the RCU read lock. Fixes: 2899656 ("netpoll: take rcu_read_lock_bh() in netpoll_send_skb_on_dev()") Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20250306-netpoll_rcu_v2-v2-1-bc4f5c51742a@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 91c0339 commit ef874de

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

net/core/netpoll.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ static int netpoll_owner_active(struct net_device *dev)
309309
static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
310310
{
311311
netdev_tx_t status = NETDEV_TX_BUSY;
312+
netdev_tx_t ret = NET_XMIT_DROP;
312313
struct net_device *dev;
313314
unsigned long tries;
314315
/* It is up to the caller to keep npinfo alive. */
@@ -317,11 +318,12 @@ static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
317318
lockdep_assert_irqs_disabled();
318319

319320
dev = np->dev;
321+
rcu_read_lock();
320322
npinfo = rcu_dereference_bh(dev->npinfo);
321323

322324
if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
323325
dev_kfree_skb_irq(skb);
324-
return NET_XMIT_DROP;
326+
goto out;
325327
}
326328

327329
/* don't get messages out of order, and no recursion */
@@ -360,7 +362,10 @@ static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
360362
skb_queue_tail(&npinfo->txq, skb);
361363
schedule_delayed_work(&npinfo->tx_work,0);
362364
}
363-
return NETDEV_TX_OK;
365+
ret = NETDEV_TX_OK;
366+
out:
367+
rcu_read_unlock();
368+
return ret;
364369
}
365370

366371
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)

0 commit comments

Comments
 (0)