hrtimers_prepare_cpu(smp_processor_id()); /* 打开HRTIMER_SOFTIRQ软中断*/ open_softirq(HRTIMER_SOFTIRQ, hrtimer_run_softirq); } 该函数主要功能就是初始化属于当前 CPU 的 hrtimer_cpu_base 结构体,然后打开HRTIMER_SOFTIRQ软中断。 int hrtimers_prepare_cpu(unsigned int cpu) { /* 获得属于当前CPU的...
如果正在执行软中断处理程序,即使指明了需要搜索所有的“软”定时器也会忽略,这是因为在软中断处理程序hrtimer_run_softirq中,退出之前会调用 hrtimer_update_softirq_timer 函数,更新所有“软”定时器。反正马上也要处理了,因此在这里就可以忽略掉了。 在函数 __hrtimer_get_next_event 调用的过程中,会更改传入的 ...
这时的hrtimer工作在低分辨率模式,到期事件在每个tick事件中断中由hrtimer_run_queues函数处理,同时,在低分辨率定时器(时间轮)的软件中断TIMER_SOFTIRQ中,hrtimer_run_pending会被调用,系统在这个函数中判断系统的条件是否满足切换到高精度模式,
l如果定时器模式为HRTIMER_CB_SOFTIRQ,那么将定时器搬到hrtimer_cpu_base的cb_pending队列 l调用__run_hrtimer,在__run_hrtimer中执行定时器的回调函数。 在没有配置高精度模式时,cb_pending队列中的定时器会在T_SOFTIRQ软中断中执行。调用链为 run_timer_softirq-> hrtimer_run_pending-> run_hrtimer_pending->...
__raise_softirq_irqoff(HRTIMER_SOFTIRQ); } } unlock_hrtimer_base(timer, &flags);returnret; } 開發者ID:royceniu,項目名稱:RP2_MPTCP,代碼行數:73,代碼來源:hrtimer.c 示例9: run_hrtimer_pending ▲點讚 1▼ staticvoidrun_hrtimer_pending(struct hrtimer_cpu_base *cpu_base){ ...
run_timer_softirq-> hrtimer_run_pending-> run_hrtimer_pending-> run_hrtimer_pending hrtimer_cancel hrtimer_cancel函数的作用是删除一个正在排队的定时器。这里分三种情况,一种是定时器已到期,并且设置了软中断模式;第二种是没有到期,还在红黑树中;第三种是定时器正在执行。
在高精度模式下,中断处理程序通过直接调用__hrtimer_run_queues函数处理所有“硬”定时器,并激活HRTIMER_SOFTIRQ软中断处理程序来处理所有“软”定时器。在高精度模式下,底层定时事件设备始终处于单次触发模式,因此在到期后必须进行重编程。如果编程失败,重试三次后,适当延迟到期事件后再次尝试编程,并...
这时的hrtimer工作在低分辨率模式,到期事件在每个tick事件中断中由hrtimer_run_queues函数处理,同时,在低分辨率定时器(时间轮)的软件中断TIMER_SOFTIRQ中,hrtimer_run_pending会被调用,系统在这个函数中判断系统的条件是否满足切换到高精度模式,如果条件满足,则会切换至高分辨率模式,另外提一下,NO_HZ模式也是在该函数中...
staticvoidrun_timer_softirq(structsoftirq_action*h) { tvec_base_t*base=__get_cpu_var(tvec_bases); hrtimer_run_queues(); /* 有机会就切换到hres或者nohz */ if(time_after_eq(jiffies,base->timer_jiffies)) __run_timers(base); /* timer wheel */ ...
__run_hrtimer(timer, &base->softirq_time); } raw_spin_unlock(&cpu_base->lock); } 上面的timerqueue_getnext函数返回红黑树中的左下节点,之所以可以在while循环中使用该函数,是因为__run_hrtimer会在移除旧的左下节点时,新的左下节点会被更新到base->active->next字段中,使得循环可以继续执行,直到没有...