- 论坛徽章:
- 0
|
本帖最后由 独孤九贱 于 2010-07-28 14:10 编辑
回复 独孤九贱
刚才搜了一下代码,只有从netif_rx中找到netdev_max_backlog的比较.而napi不走net ...
buzzle 发表于 2010-07-28 11:08
客气了……
对于napi的网卡来讲,每个网卡都有“配额”,也就是说,在一次接收当中,最多允许接收多少个包,就得把控制权交给其它网卡,否则其它网卡就没有接收数据包的机会了,如果此网卡的数据一直源源不断的话。在2.6.12中,有如下代码:- static void net_rx_action(struct softirq_action *h)
- {
- struct softnet_data *queue = &__get_cpu_var(softnet_data);
- unsigned long start_time = jiffies;
- int budget = netdev_max_backlog;
-
- local_irq_disable();
- while (!list_empty(&queue->poll_list)) {
- struct net_device *dev;
- if (budget <= 0 || jiffies - start_time > 1)
- goto softnet_break;
- local_irq_enable();
- dev = list_entry(queue->poll_list.next,
- struct net_device, poll_list);
- netpoll_poll_lock(dev);
- if (dev->quota <= 0 || dev->poll(dev, &budget)) {
复制代码 其中,budget就是配额,它是从
int budget = netdev_max_backlog;
其实对于中断方式来讲,内核已经通过一个“伪设备”在队列层将它抽像为poll方式的一部份了。
中得到的。 |
|