net_rx_action()

net_rx_action()是Linux内核中处理网络数据包接收的关键函数。它负责从网络设备接收到的数据帧进行解析,调度到适当的协议栈进行处理,并执行相应的网络操作。该函数涉及网络堆栈的各个层次,包括链路层、网络层和传输层,确保数据正确路由和分发。通过对net_rx_action的深入理解,可以优化网络性能,尤其是在高负载环境下的数据处理效率。
摘要由CSDN通过智能技术生成

 

/*
net_rx_action()会从两个地方取帧数据:
(1)非NAPI设备的中断处理流程把帧放入本地cpu私有数softnet_data 的接收队列中
(2)调用NAPI设备驱动的poll方法会直接从设备内存(或设备驱动程序接收环)中取出帧
*/
static void net_rx_action(struct softirq_action *h)
{
   /*取得本地cpu 的softnet_data 的poll_list  链表
     在里面放着所有需要轮询接收数据包的设备
   */
	struct list_head *list = &__get_cpu_var(softnet_data).poll_list;
   
	 /*设置软中断处理程序一次允许的最大执行时间为2个jiffies*/
	unsigned long time_limit = jiffies + 2;
	 
	int budget = netdev_budget;//轮询配额 当数据包数超过此值 进行轮询接收 此值初始为300
	void *have;

	//禁止本地cpu中断
	local_irq_disable();

   /*
    list的更新:
    (1)在执行具体的poll函数中若此时的设备已经没有数据则poll中会调用__napi_complete()从链表删除此设备list得到更新
    (2)在执行具体的poll函数中若处理的数据超过了设备的权重weight 则在while的后面在此设备没有被禁止的情下将此设备放到链表的尾部list得到更新
   */
	while (!list_empty(list)) 
	{  
		struct napi_struct *n;
		int work, weight;

		 //限制轮询处理包个数以及处理的时间
		if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值