netif_rx()函数有调用do_softirq吗,如果有的话,请在代码中指明是哪一行
时间: 2023-12-03 16:46:57 浏览: 83
是的,netif_rx()函数在接收数据包后会调用do_softirq()函数来触发网络软中断处理。在Linux内核代码中,这部分代码位于`net/core/dev.c`文件中的`netif_receive_skb_internal()`函数中,具体实现如下:
```c
static int netif_receive_skb_internal(struct sk_buff *skb)
{
...
if (!queue_mapping_set && skb->dev->real_num_tx_queues)
skb_set_queue_mapping(skb, select_queue(skb->dev, skb, NULL));
local_bh_disable();
__net_timestamp(skb);
nf_reset(skb);
/* Pass the packet to the stack */
if (likely(netif_rx(skb) == NET_RX_SUCCESS))
return 0;
if (ndo->ndo_rx_flow_stopped)
dev_rx_flow_stopped(ndo);
local_bh_enable();
return 0;
}
int netif_rx(struct sk_buff *skb)
{
if (unlikely(skb_defer_rx_timestamp(skb)))
goto out;
/* Pass the packet to the stack */
if (likely(__netif_rx(skb) == NET_RX_SUCCESS))
return NET_RX_SUCCESS;
/* If the packet is consumed by the filtering layer, we're done */
if (unlikely(skb->pkt_type == PACKET_OTHERHOST))
goto out_consumed;
/* Slow path: try the NAPI path and then softirq */
if (napi_gro_receive(&gro_list, skb))
goto out;
if (netif_receive_skb_internal(skb) != NET_RX_SUCCESS)
goto out;
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
return NET_RX_QUEUED;
out_consumed:
kfree_skb(skb);
out:
return NET_RX_DROP;
}
```
其中,`netif_rx()`函数首先会进行一些数据包处理,然后调用`__netif_rx()`函数来进行网络数据包的接收。如果`__netif_rx()`函数返回值为`NET_RX_SUCCESS`,则说明数据包已经被成功接收,此时`netif_rx()`函数直接返回`NET_RX_SUCCESS`;否则,`netif_rx()`函数会尝试使用NAPI进行数据包接收并进行GRO处理,如果仍然无法成功接收,则会调用`netif_receive_skb_internal()`函数,并最终调用`__raise_softirq_irqoff(NET_RX_SOFTIRQ)`函数来触发软中断处理。
阅读全文