• Julien Grall's avatar
    hrtimer: Don't take expiry_lock when timer is currently migrated · 68b2c8c1
    Julien Grall authored
    migration_base is used as a placeholder when an hrtimer is migrated to a
    different CPU. In the case that hrtimer_cancel_wait_running() hits a timer
    which is currently migrated it would pointlessly acquire the expiry lock of
    the migration base, which is even not initialized.
    
    Surely it could be initialized, but there is absolutely no point in
    acquiring this lock because the timer is guaranteed not to run it's
    callback for which the caller waits to finish on that base. So it would
    just do the inc/lock/dec/unlock dance for nothing.
    
    As the base switch is short and non-preemptible, there is no issue when the
    wait function returns immediately.
    
    The timer base and base->cpu_base cannot be NULL in the code path which is
    invoking that, so just replace those checks with a check whether base is
    migration base.
    
    [ tglx: Updated from RT patch. Massaged changelog. Added comment. ]
    Signed-off-by: default avatarJulien Grall <julien.grall@arm.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20190821092409.13225-4-julien.grall@arm.com
    
    68b2c8c1
hrtimer.c 60.2 KB