Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328015
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: LINUX

2013-08-08 13:46:51

kernel:linux-2.6.18

点击(此处)折叠或打开

  1. /* net_rx_action会把剩下budget传递给process_backlog */
  2. static int process_backlog(struct net_device *backlog_dev, int *budget)
  3. {
  4.     int work = 0;
  5.     /* 获取最小配额值,即sk_buff 数量 */
  6.     int quota = min(backlog_dev->quota, *budget);
  7.     struct softnet_data *queue = &__get_cpu_var(softnet_data);
  8.     unsigned long start_time = jiffies;

  9.     backlog_dev->weight = weight_p;

  10.     /* 循环执行直到__skb_dequeue取出的skb为NULL*/
  11.     for (;;) {
  12.         struct sk_buff *skb;
  13.         struct net_device *dev;

  14.         local_irq_disable();
  15.         /* 从双向链表中取出sk_buff指针 */
  16.         skb = __skb_dequeue(&queue->input_pkt_queue);
  17.         if (!skb)
  18.             goto job_done;
  19.         local_irq_enable();

  20.         dev = skb->dev;

  21.         /* 把sk_buff送入上层协议进行处理 */
  22.         netif_receive_skb(skb);

  23.         dev_put(dev);

  24.         work++;
  25.         /*
  26.         (jiffies - start_time>1)保证执行时间超过一个时间片
  27.         work >= quota表明从queue->input_pkt_queue中取出的sk_buff数量超过预先设定的quota值
  28.         */

  29.         if (work >= quota || jiffies - start_time > 1)
  30.             break;

  31.     }
  32.     /* 更新配额 */
  33.     backlog_dev->quota -= work;
  34.     /* 更新预算 */
  35.     *budget -= work;
  36.     return -1;

  37. job_done:
  38.     backlog_dev->quota -= work;
  39.     *budget -= work;

  40.     /* 处理成功后,从链表删除 */
  41.     list_del(&backlog_dev->poll_list);
  42.     smp_mb__before_clear_bit();
  43.     /* 清空__LINK_STATE_RX_SCHED,表明接收状态完毕 */
  44.     netif_poll_enable(backlog_dev);

  45.     local_irq_enable();
  46.     return 0;
  47. }

阅读(4439) | 评论(0) | 转发(1) |
0

上一篇:net_rx_action函数

下一篇:PTYPE_ALL与PTYPE_BASE

给主人留下些什么吧!~~