对internal_add_timer 的疑惑

static inline void internal_add_timer(struct timer_list *timer)
{
 /*
 * must be cli-ed when calling this
 */
 unsigned long expires = timer->expires;
 unsigned long idx = expires - timer_jiffies;

 if (idx < TVR_SIZE) {
 int i = expires & TVR_MASK;
 insert_timer(timer, tv1.vec, i);
 } else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
 int i = (expires >> TVR_BITS) & TVN_MASK;
 insert_timer(timer, tv2.vec, i);
 } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
 int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
 insert_timer(timer, tv3.vec, i);
 } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
 int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
 insert_timer(timer, tv4.vec, i);
 } else if (expires < timer_jiffies) {
 /* can happen if you add a timer with expires == jiffies,
 * or you set a timer to go off in the past
 */
 insert_timer(timer, tv1.vec, tv1.index);
 } else if (idx < 0xffffffffUL) {
 int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
 insert_timer(timer, tv5.vec, i);
 } else {
 /* Can only get here on architectures with 64-bit jiffies */
 timer->next = timer->prev = timer;
 }
}

在动态定时器部分的函数internal_add_timer把一个timer插入到tvecs的某一个成员中,我对他插入数组的位置有些疑惑。
假定插入的timer在256个ticks之内到时,这样就会插入到tv1中,插入的数组位置索引是 idx = timer->expires - timer_jiffies。 但我的理解是idx应该是未来多少个ticks后这个timer到时,插入的位置应该是(tv1.index+idx)&255。

 

你可能感兴趣的:(对internal_add_timer 的疑惑)