[tip:efi/core] efi: Runtime-wrapper: Get rid of the rtc_lock spinlock

2016-02-03 Thread tip-bot for Ard Biesheuvel
Commit-ID:  1bb6936473c07b5a7c8daced1000893b7145bb14
Gitweb: http://git.kernel.org/tip/1bb6936473c07b5a7c8daced1000893b7145bb14
Author: Ard Biesheuvel 
AuthorDate: Mon, 1 Feb 2016 22:07:00 +
Committer:  Ingo Molnar 
CommitDate: Wed, 3 Feb 2016 11:31:05 +0100

efi: Runtime-wrapper: Get rid of the rtc_lock spinlock

The rtc_lock spinlock aims to serialize access to the CMOS RTC
between the UEFI firmware and the kernel drivers that use it
directly. However, x86 is the only arch that performs such
direct accesses, and that never uses the time related UEFI
runtime services. Since no other UEFI enlightened architectures
have a legcay CMOS RTC anyway, we can remove the rtc_lock
spinlock entirely.

Signed-off-by: Ard Biesheuvel 
Signed-off-by: Matt Fleming 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Cc: linux-...@vger.kernel.org
Link: 
http://lkml.kernel.org/r/1454364428-494-7-git-send-email-m...@codeblueprint.co.uk
Signed-off-by: Ingo Molnar 
---
 drivers/firmware/efi/runtime-wrappers.c | 32 
 1 file changed, 8 insertions(+), 24 deletions(-)

diff --git a/drivers/firmware/efi/runtime-wrappers.c 
b/drivers/firmware/efi/runtime-wrappers.c
index 311f415..7b8b2f2 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -61,24 +61,14 @@
  */
 static DEFINE_SPINLOCK(efi_runtime_lock);
 
-/*
- * As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
- * the EFI specification requires that callers of the time related runtime
- * functions serialize with other CMOS accesses in the kernel, as the EFI time
- * functions may choose to also use the legacy CMOS RTC.
- */
-__weak DEFINE_SPINLOCK(rtc_lock);
-
 static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
 {
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(get_time, tm, tc);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -87,11 +77,9 @@ static efi_status_t virt_efi_set_time(efi_time_t *tm)
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(set_time, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -102,11 +90,9 @@ static efi_status_t virt_efi_get_wakeup_time(efi_bool_t 
*enabled,
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(get_wakeup_time, enabled, pending, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -115,11 +101,9 @@ static efi_status_t virt_efi_set_wakeup_time(efi_bool_t 
enabled, efi_time_t *tm)
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(set_wakeup_time, enabled, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 


[tip:efi/core] efi: Runtime-wrapper: Get rid of the rtc_lock spinlock

2016-02-03 Thread tip-bot for Ard Biesheuvel
Commit-ID:  1bb6936473c07b5a7c8daced1000893b7145bb14
Gitweb: http://git.kernel.org/tip/1bb6936473c07b5a7c8daced1000893b7145bb14
Author: Ard Biesheuvel 
AuthorDate: Mon, 1 Feb 2016 22:07:00 +
Committer:  Ingo Molnar 
CommitDate: Wed, 3 Feb 2016 11:31:05 +0100

efi: Runtime-wrapper: Get rid of the rtc_lock spinlock

The rtc_lock spinlock aims to serialize access to the CMOS RTC
between the UEFI firmware and the kernel drivers that use it
directly. However, x86 is the only arch that performs such
direct accesses, and that never uses the time related UEFI
runtime services. Since no other UEFI enlightened architectures
have a legcay CMOS RTC anyway, we can remove the rtc_lock
spinlock entirely.

Signed-off-by: Ard Biesheuvel 
Signed-off-by: Matt Fleming 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Cc: linux-...@vger.kernel.org
Link: 
http://lkml.kernel.org/r/1454364428-494-7-git-send-email-m...@codeblueprint.co.uk
Signed-off-by: Ingo Molnar 
---
 drivers/firmware/efi/runtime-wrappers.c | 32 
 1 file changed, 8 insertions(+), 24 deletions(-)

diff --git a/drivers/firmware/efi/runtime-wrappers.c 
b/drivers/firmware/efi/runtime-wrappers.c
index 311f415..7b8b2f2 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -61,24 +61,14 @@
  */
 static DEFINE_SPINLOCK(efi_runtime_lock);
 
-/*
- * As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
- * the EFI specification requires that callers of the time related runtime
- * functions serialize with other CMOS accesses in the kernel, as the EFI time
- * functions may choose to also use the legacy CMOS RTC.
- */
-__weak DEFINE_SPINLOCK(rtc_lock);
-
 static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
 {
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(get_time, tm, tc);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -87,11 +77,9 @@ static efi_status_t virt_efi_set_time(efi_time_t *tm)
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(set_time, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -102,11 +90,9 @@ static efi_status_t virt_efi_get_wakeup_time(efi_bool_t 
*enabled,
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(get_wakeup_time, enabled, pending, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }
 
@@ -115,11 +101,9 @@ static efi_status_t virt_efi_set_wakeup_time(efi_bool_t 
enabled, efi_time_t *tm)
unsigned long flags;
efi_status_t status;
 
-   spin_lock_irqsave(_lock, flags);
-   spin_lock(_runtime_lock);
+   spin_lock_irqsave(_runtime_lock, flags);
status = efi_call_virt(set_wakeup_time, enabled, tm);
-   spin_unlock(_runtime_lock);
-   spin_unlock_irqrestore(_lock, flags);
+   spin_unlock_irqrestore(_runtime_lock, flags);
return status;
 }