Skip to content
  • Thomas Gleixner's avatar
    hrtimer: raise softirq unlocked to avoid circular lock dependency · 0c96c597
    Thomas Gleixner authored
    
    
    The scheduler hrtimer bits in 2.6.25 introduced a circular lock
    dependency in a rare code path:
    
    =======================================================
    [ INFO: possible circular locking dependency detected ]
    2.6.25-sched-devel.git-x86-latest.git #19
    -------------------------------------------------------
    X/2980 is trying to acquire lock:
     (&rq->rq_lock_key#2){++..}, at: [<ffffffff80230146>] task_rq_lock+0x56/0xa0
    
    but task is already holding lock:
     (&cpu_base->lock){++..}, at: [<ffffffff80257ae1>] lock_hrtimer_base+0x31/0x60
    
    which lock already depends on the new lock.
    
    The scenario which leads to this is:
    
    posix-timer signal is delivered
     -> posix-timer is rearmed
        timer is already expired in hrtimer_enqueue()
         -> softirq is raised
    
    To prevent this we need to move the raise of the softirq out of the
    base->lock protected code path.
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@kernel.org
    Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    0c96c597