Skip to content

Commit 5523508

Browse files
Cruzer-Skuba-moo
authored andcommitted
net: dlink: use dev_kfree_skb_any instead of dev_kfree_skb
Replace `dev_kfree_skb()` with `dev_kfree_skb_any()` in `start_xmit()` which can be called from netpoll (hard IRQ) and from other contexts. Also, `np->link_status` can be changed at any time by interrupt handler. <idle>-0 [011] dNh4. 4541.754603: start_xmit <-netpoll_start_xmit <idle>-0 [011] dNh4. 4541.754622: <stack trace> => [FTRACE TRAMPOLINE] => start_xmit => netpoll_start_xmit => netpoll_send_skb => write_msg => console_flush_all => console_unlock => vprintk_emit => _printk => rio_interrupt => __handle_irq_event_percpu => handle_irq_event => handle_fasteoi_irq => __common_interrupt => common_interrupt => asm_common_interrupt => mwait_idle => default_idle_call => do_idle => cpu_startup_entry => start_secondary => common_startup_64 This issue can occur when the link state changes from off to on (e.g., plugging or unplugging the LAN cable) while transmitting a packet. If the skb has a destructor, a warning message may be printed in this situation. -> consume_skb (dev_kfree_skb()) -> __kfree_skb() -> skb_release_all() -> skb_release_head_state(skb) if (skb->destructor) { DEBUG_NET_WARN_ON_ONCE(in_hardirq()); skb->destructor(skb); } Found by inspection. Signed-off-by: Yeounsu Moon <yyyynoom@gmail.com> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Tested-on: D-Link DGE-550T Rev-A3 Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20251019075540.55697-1-yyyynoom@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 2653e9c commit 5523508

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

drivers/net/ethernet/dlink/dl2k.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev)
733733
u64 tfc_vlan_tag = 0;
734734

735735
if (np->link_status == 0) { /* Link Down */
736-
dev_kfree_skb(skb);
736+
dev_kfree_skb_any(skb);
737737
return NETDEV_TX_OK;
738738
}
739739
entry = np->cur_tx % TX_RING_SIZE;

0 commit comments

Comments
 (0)