- 论坛徽章:
- 1
|
内核版本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等,则上面红色语句的结论就不好理解了。
请问大家,这样的写法逻辑正确吗?
|
|