免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4533 | 回复: 9
打印 上一主题 下一主题

[网络子系统] 关于调用__qdisc_run的疑问 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-28 10:43 |只看该作者 |倒序浏览
5可用积分
本帖最后由 chishanmingshen 于 2013-01-28 11:01 编辑

from 3.6.10

  1. static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
  2.                                  struct net_device *dev,
  3.                                  struct netdev_queue *txq)
  4. {
  5.         spinlock_t *root_lock = qdisc_lock(q);
  6.         bool contended;
  7.         int rc;

  8.         qdisc_skb_cb(skb)->pkt_len = skb->len;
  9.         qdisc_calculate_pkt_len(skb, q);
  10.         /*
  11.          * Heuristic to force contended enqueues to serialize on a
  12.          * separate lock before trying to get qdisc main lock.
  13.          * This permits __QDISC_STATE_RUNNING owner to get the lock more often
  14.          * and dequeue packets faster.
  15.          */
  16.         contended = qdisc_is_running(q);
  17.         if (unlikely(contended))
  18.                 spin_lock(&q->busylock);

  19.         spin_lock(root_lock);
  20.         if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) {
  21.                 kfree_skb(skb);
  22.                 rc = NET_XMIT_DROP;
  23.         } else if ((q->flags & TCQ_F_CAN_BYPASS) && !qdisc_qlen(q) &&
  24.                    qdisc_run_begin(q)) {
  25.                 /*
  26.                  * This is a work-conserving queue; there are no old skbs
  27.                  * waiting to be sent out; and the qdisc is not running -
  28.                  * xmit the skb directly.
  29.                  */
  30.                 if (!(dev->priv_flags & IFF_XMIT_DST_RELEASE))
  31.                         skb_dst_force(skb);

  32.                 qdisc_bstats_update(q, skb);

  33.                 if (sch_direct_xmit(skb, q, dev, txq, root_lock)) {
  34.                         if (unlikely(contended)) {
  35.                                 spin_unlock(&q->busylock);
  36.                                 contended = false;
  37.                         }
  38.                         __qdisc_run(q);<-----------------------------------------第1处
  39.                 } else
  40.                         qdisc_run_end(q);

  41.                 rc = NET_XMIT_SUCCESS;
  42.         } else {
  43.                 skb_dst_force(skb);
  44.                 rc = q->enqueue(skb, q) & NET_XMIT_MASK;
  45.                 if (qdisc_run_begin(q)) {
  46.                         if (unlikely(contended)) {
  47.                                 spin_unlock(&q->busylock);
  48.                                 contended = false;
  49.                         }
  50.                         __qdisc_run(q);<----------------------------------------第2处
  51.                 }
  52.         }
  53.         spin_unlock(root_lock);
  54.         if (unlikely(contended))
  55.                 spin_unlock(&q->busylock);
  56.         return rc;
  57. }
复制代码
对于__dev_xmit_skb()中调用__qdisc_run()的2种case不理解...
应该全都留在softirq中做__qdisc_run()啊, 怎么要在此处也做__qdisc_run()?

我的理解是__qdisc_run()是个qos的独立处理, 可能比较耗时.

请指点, 谢谢!

最佳答案

查看完整内容

qdisc_run里面进行了检查啊。如果其他的任务需要调度,会释放cpu并激活软中断进行处理,不会影响的。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-01-28 10:43 |只看该作者
qdisc_run里面进行了检查啊。如果其他的任务需要调度,会释放cpu并激活软中断进行处理,不会影响的。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-01-28 12:47 |只看该作者

你说的我明白.

其实我不明白发包是如何能实现控制速率的.

如果说发包时和软中断这2个地方都可以控制性地发包, 那么为何不仅仅在软中断发呢? 这样不是更不影响其它进程么?

回复 2# 瀚海书香


   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-01-28 13:02 |只看该作者
好吧, 好像也不是一个值得纠结的问题... 呵呵...

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-01-28 13:10 |只看该作者
回复 3# chishanmingshen
其实我不明白发包是如何能实现控制速率的.

速率的控制是在不同qdisc的dequeue函数中实现的。
   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-01-28 13:44 |只看该作者
本帖最后由 chishanmingshen 于 2013-01-28 13:50 编辑

对于qos的内部算法, 暂时我不关注.

对于为何两处有调用__qdisc_run(), 看来不是个值得深究的问题, 呵呵.
这个貌似仅仅是在不影响发包进程的前提下, 早于软中断地处理qos而已, 暂时我就这么理解了.

如果理解不对, 还请指点...
谢谢!

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-02-02 16:43 |只看该作者

还有不同见解的么。。。

没有就要结贴了。。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
8 [报告]
发表于 2013-02-04 07:58 |只看该作者
回复 7# chishanmingshen
可以结贴了

   

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2015-08-28 16:35 |只看该作者
回复 2# 瀚海书香

    我也有些疑惑啊。
你说的检查应该是 qdisc_run 中的 need_resched()   break

这样__dev_xmit_skb 在没有被软中断打断时,就会直接调用__qdisc_run()到tc队列中了。
也就是说发包可以由软中断做,也可以不通过软中断做。

是否意味着在发包速率较小的情况下,都是这样直接发送出去的,TX软中断都没有用武之地。

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-08-28 17:22 |只看该作者
回复 9# polejo


    确实是这样啊!
发200k包出去时,观察 /proc/softirqs 的NET_TX 基本没有增长。
配了个tc规则,把速率限制到100k,模拟发包压力大的情况,这时候看到 softirq 才会猛增
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP