lkml.org 
[lkml]   [2005]   [Apr]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCH] timers fixes/improvements
    Andrew Morton wrote:
    >
    > Oleg Nesterov <oleg@tv-sign.ru> wrote:
    > >
    > > +void fastcall init_timer(struct timer_list *timer)
    > > +{
    > > + timer->entry.next = NULL;
    > > + timer->_base = &per_cpu(tvec_bases,
    > > + __smp_processor_id()).t_base;
    > > + timer->magic = TIMER_MAGIC;
    > > +}
    >
    > __smp_processor_id() is not implemented on all architectures. I'll switch
    > this to _smp_processor_id().

    Wow, I did not know.

    > It's a rather odd thing which you're doing there. Why does a
    > not-yet-scheduled timer need a ->_base?

    Because all locking goes through timer_list->base->lock now.
    That is why timer_list->lock can be deleted. The timer is
    always locked via loc_timer_base().

    timer->base == NULL only temporally when __mod_timer() does
    while switching timer's base:
    base = lock_timer_base(timer);
    timer->base = NULL;
    unlock(base->lock);
    // Nobody can use this timer, lock_timer_base()
    // will spin waiting for ->base != 0
    lock(new_base->lock);
    timer->base = new_base;
    unlock(new_base);

    So ->base == NULL means that timer itself is locked, not it's
    base. That is why __mod_timer() do not need to hold 2 spinlocks
    at once.

    Oleg.
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-04-06 13:31    [W:0.022 / U:0.564 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site