Skip to content
  • Matt Fleming's avatar
    x86/rtc: Don't recursively acquire rtc_lock · 47997d75
    Matt Fleming authored
    A deadlock was introduced on x86 in commit ef68c8f8
    
     ("x86:
    Serialize EFI time accesses on rtc_lock") because efi_get_time()
    and friends can be called with rtc_lock already held by
    read_persistent_time(), e.g.:
    
     timekeeping_init()
        read_persistent_clock()     <-- acquire rtc_lock
            efi_get_time()
                phys_efi_get_time() <-- acquire rtc_lock <DEADLOCK>
    
    To fix this let's push the locking down into the get_wallclock()
    and set_wallclock() implementations.  Only the clock
    implementations that access the x86 RTC directly need to acquire
    rtc_lock, so it makes sense to push the locking down into the
    rtc, vrtc and efi code.
    
    The virtualization implementations don't require rtc_lock to be
    held because they provide their own serialization.
    
    Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
    Acked-by: default avatarJan Beulich <jbeulich@novell.com>
    Acked-by: Avi Kivity <avi@redhat.com> [for the virtualization aspect]
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Zhang Rui <rui.zhang@intel.com>
    Cc: Josh Boyer <jwboyer@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    47997d75