免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1289 | 回复: 3

[网络子系统] rt_cache_flush函数中的疑问 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-11-16 13:59 |显示全部楼层
内核版本V2.6.23,虽然在后续版本中已经修改了该函数的实现方式,但是我仍然想知道下面红色标注的代码到底是基于什么逻辑这样写的?

   653 void rt_cache_flush(int delay)
   654 {
   655     unsigned long now = jiffies;
   656     int user_mode = !in_softirq();
   657
   658     if (delay < 0)
   659         delay = ip_rt_min_delay;
   660
   661     spin_lock_bh(&rt_flush_lock);
   662
   663     if (del_timer(&rt_flush_timer) && delay > 0 && rt_deadline) {
   664         long tmo = (long)(rt_deadline - now);
   665
   666         /* If flush timer is already running
   667            and flush request is not immediate (delay > 0):
   668
   669            if deadline is not achieved, prolongate timer to "delay",
   670            otherwise fire it at deadline time.
   671          */
   672
  673         if (user_mode && tmo < ip_rt_max_delay-ip_rt_min_delay)
   674             tmo = 0;

   ...      ...

   上面红色部分代码我有点不理解的是为啥tmo小于ip_rt_max_delay-ip_rt_min_delay后,就可以直接令tmo为0,即立刻超时。第664行可以看出tmo是最近一次设置的路由缓存刷新定时器的截止期限与当前时间now的差,而ip_rt_max_delay-ip_rt_min_delay表示最近一次设置路由缓存刷新的最大超时值和最小超时值的差。通过cscope搜索代码,可以看到通常内核都是通过rt_cache_flush(-1)的调用进入本函数,即delay=-1,则在此场景下上面红色代码的逻辑似乎还可以理解,即只要tmo小于2者之差,则说明当前时间已经超过了前一次delay为ip_rt_min_delay的值了,即前次设置的刷新定时器已经到时,于是这里强制tmo为0,立刻启动刷新是合理的。但是若是通过控制台来修改/proc/sys/net/ipv4/route/flush的值为一个大于0的数,例如6,7,8,9等,即delay=6,7,8,9等,则上面红色语句的结论就不好理解了。

请问大家,这样的写法逻辑正确吗?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-11-21 18:00 |显示全部楼层
ip_rt_min_delay是保证两次flush之间的最小间隔的。

假设min=2s,max=10s,上一次mod_timer的时刻为0,
也就是说,dealine=max=10s,

如果用户态的flush请求在1s到达,tmo=deadline-now=9 > max-min=8s,所以tmo不修正为0,delay最终为min(delay,8s)。
如果flush请求在2s以后到达,tmo<8s,就会被修正为0s,导致delay=0s,立刻触发flush动作。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-11-27 10:21 |显示全部楼层
nswcfd 发表于 2016-11-21 18:00
ip_rt_min_delay是保证两次flush之间的最小间隔的。

假设min=2s,max=10s,上一次mod_timer的时刻为0,
...

感谢nswcfd的答复,不过我问的问题就是为啥这里当用户态的刷新时间在2s到达后,导致delay=8s,则就必须让tmo=0,从而立即刷新呢?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-12-02 11:54 |显示全部楼层
优先响应用户态的配置呀,或者说在不违背min-delay的前提下尽量立刻响应用户态的刷新请求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP