do_softirq这个函数一般在哪里被调用,是在硬中断的函数里嘛?如果是的话是哪个函数
时间: 2023-12-06 13:41:28 浏览: 223
do_softirq()函数是在Linux内核的软中断机制中被调用的。软中断是一种异步的、轻量级的机制,用于处理一些需要延迟处理或周期性处理的任务,例如网络包的处理、定时器的处理等。在Linux内核中,软中断是通过一个叫做“软中断处理器(softirq)”的结构来实现的。
当硬件中断处理程序执行完毕后,会检查是否有软中断需要处理。如果有,就会调用do_softirq()函数来处理软中断。所以可以说,do_softirq()函数是在硬中断处理程序中被调用的。
具体而言,do_softirq()函数一般是在硬中断底半部(bottom half)的处理函数中被调用。例如,在网络设备驱动程序中,当接收到一个网络包时,硬中断处理程序会调用netif_rx()函数将数据包交给网络协议栈处理。而netif_rx()函数的底半部处理函数会调用net_rx_action()函数,从而触发软中断处理。在net_rx_action()函数中,就会调用do_softirq()函数来处理软中断。
相关问题
netif_rx()函数有调用do_softirq吗
是的,netif_rx()函数会调用do_softirq()函数。当数据包到达网络设备时,内核会通过中断处理程序将数据包传递给netif_rx()函数。netif_rx()函数会将数据包放入接收队列,然后调用do_softirq()函数来处理接收队列中的数据包。do_softirq()函数会执行软中断处理程序,其中包括处理网络接收队列中的数据包。因此,netif_rx()函数和do_softirq()函数是网络数据包接收和处理的关键函数。
netif_rx()函数有调用do_softirq吗,如果有的话,请在代码中指明是哪一行
是的,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)`函数来触发软中断处理。
阅读全文