diff mbox series

x86: mce: always use 64-bit timestamps

Message ID 20180618100759.1921750-1-arnd@arndb.de
State Accepted
Commit bc39f010200d09dc6d4d5e613e86dfd0b22c63b3
Headers show
Series x86: mce: always use 64-bit timestamps | expand

Commit Message

Arnd Bergmann June 18, 2018, 10:06 a.m. UTC
The machine check timestamp uses get_seconds(), which returns an 'unsigned long'
number that might overflow on 32-bit architectures (in the distant future)
and is therefore deprecated.

The normal replacement would be ktime_get_real_seconds(), but that needs to
use a sequence lock that might cause a deadlock if the mce happens at just
the wrong moment. The __ktime_get_real_seconds() skips that lock and is
safer here, but has a miniscule risk of returning the wrong time when we read
it on a 32-bit architecture at the same time as updating the epoch, i.e.
from before y2106 overflow time to after, or vice versa.

This seems to be an acceptable risk in this particular case, and is the
same thing we do in kdb.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 arch/x86/kernel/cpu/mcheck/mce.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

-- 
2.9.0

Comments

Borislav Petkov June 18, 2018, 12:51 p.m. UTC | #1
On Mon, Jun 18, 2018 at 12:06:46PM +0200, Arnd Bergmann wrote:
> The machine check timestamp uses get_seconds(), which returns an 'unsigned long'

> number that might overflow on 32-bit architectures (in the distant future)

> and is therefore deprecated.

> 

> The normal replacement would be ktime_get_real_seconds(), but that needs to

> use a sequence lock that might cause a deadlock if the mce happens at just

> the wrong moment. The __ktime_get_real_seconds() skips that lock and is

> safer here, but has a miniscule risk of returning the wrong time when we read

> it on a 32-bit architecture at the same time as updating the epoch, i.e.

> from before y2106 overflow time to after, or vice versa.

> 

> This seems to be an acceptable risk in this particular case, and is the

> same thing we do in kdb.

> 

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  arch/x86/kernel/cpu/mcheck/mce.c | 4 ++--

>  1 file changed, 2 insertions(+), 2 deletions(-)


Applied, thanks.

-- 
Regards/Gruss,
    Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.
diff mbox series

Patch

diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index e4cf6ff1c2e1..b887415652ed 100644
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -123,8 +123,8 @@  void mce_setup(struct mce *m)
 {
 	memset(m, 0, sizeof(struct mce));
 	m->cpu = m->extcpu = smp_processor_id();
-	/* We hope get_seconds stays lockless */
-	m->time = get_seconds();
+	/* need the internal __ version to avoid deadlocks */
+	m->time = __ktime_get_real_seconds();
 	m->cpuvendor = boot_cpu_data.x86_vendor;
 	m->cpuid = cpuid_eax(1);
 	m->socketid = cpu_data(m->extcpu).phys_proc_id;