Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314288
  • 博文数量: 111
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 117
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-01 16:16
个人简介

作为一个新手,只能说,多学多看!

文章分类
文章存档

2017年(2)

2015年(109)

我的朋友

分类: LINUX

2015-07-08 13:33:01

原文地址:process_backlog函数 作者:0n10rz1r0

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. }

阅读(1864) | 评论(0) | 转发(0) |
0

上一篇:netif_rx函数

下一篇:PTYPE_ALL与PTYPE_BASE

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