- 论坛徽章:
- 0
|
原帖由 12013396 于 2007-3-22 15:48 发表于 2楼
我觉得是因为netif_rx()并不像NAPI那样,driver把代表自己的net_dev挂到softnet_data->poll_list上,但它现在又是基于NAPI实现的了。那只好找个通用的net_dev来代表自己吧,就是softnet_data->backlog_de ...
现在想明白了,netif_rx_schedule(&queue->backlog_dev);是把backlog_dev挂到poll的队列上,并在netif_rx_action中调用这个队列的poll方法。
如下:
- 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);
- have = netpoll_poll_lock(dev);
- if (dev->quota <= 0 || dev->poll(dev, &budget)) {
- netpoll_poll_unlock(have);
- local_irq_disable();
- list_move_tail(&dev->poll_list, &queue->poll_list);
- if (dev->quota < 0)
- dev->quota += dev->weight;
- else
- dev->quota = dev->weight;
- } else {
- netpoll_poll_unlock(have);
- dev_put(dev);
- local_irq_disable();
- }
- }
复制代码
如果if (dev->quota <= 0 || dev->poll(dev, &budget)) 完成了,cpu的skb队列就清空了,下次中断到来netif_rx_schedule(&queue->backlog_dev);还可以把自己加入到poll list中;如果没有完成,实际上backlog_dev还在队列中,也就没有必要再调用netif_rx_schedule(&queue->backlog_dev);了。
感觉应该是这样的。 |
|