]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
x86/rtc: Don't recursively acquire rtc_lock
authorMatt Fleming <matt.fleming@intel.com>
Wed, 21 Sep 2011 14:08:03 +0000 (16:08 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 21 Sep 2011 14:16:09 +0000 (16:16 +0200)
commit47997d756aa2a84ab577e1b0383cc12d582fc69c
tree9b5874e94a14f771a3e482fa09e1fc68785a9277
parent9d037a777695993ec7437e5f451647dea7919d4c
x86/rtc: Don't recursively acquire rtc_lock

A deadlock was introduced on x86 in commit ef68c8f87ed1 ("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: Matt Fleming <matt.fleming@intel.com>
Acked-by: Jan 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/rtc.c
arch/x86/platform/mrst/vrtc.c