All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: mce: always use 64-bit timestamps
@ 2018-06-18 10:06 ` Arnd Bergmann
  0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2018-06-18 10:06 UTC (permalink / raw)
  To: Tony Luck, Borislav Petkov, Thomas Gleixner, Ingo Molnar, x86
  Cc: y2038, Arnd Bergmann, H. Peter Anvin, Yazen Ghannam, linux-edac,
	linux-kernel

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(-)

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;
-- 
2.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* x86: mce: always use 64-bit timestamps
@ 2018-06-18 10:06 ` Arnd Bergmann
  0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2018-06-18 10:06 UTC (permalink / raw)
  To: Tony Luck, Borislav Petkov, Thomas Gleixner, Ingo Molnar, x86
  Cc: y2038, Arnd Bergmann, H. Peter Anvin, Yazen Ghannam, linux-edac,
	linux-kernel

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(-)

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;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] x86: mce: always use 64-bit timestamps
@ 2018-06-18 12:51   ` Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: Borislav Petkov @ 2018-06-18 12:51 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Tony Luck, Thomas Gleixner, Ingo Molnar, x86, y2038,
	H. Peter Anvin, Yazen Ghannam, linux-edac, linux-kernel

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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* x86: mce: always use 64-bit timestamps
@ 2018-06-18 12:51   ` Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: Borislav Petkov @ 2018-06-18 12:51 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Tony Luck, Thomas Gleixner, Ingo Molnar, x86, y2038,
	H. Peter Anvin, Yazen Ghannam, linux-edac, linux-kernel

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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [tip:ras/core] x86/mce: Always use 64-bit timestamps
@ 2018-06-22 12:40   ` tip-bot for Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot for Arnd Bergmann @ 2018-06-22 12:40 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, linux-edac, arnd, tony.luck, bp, mingo, hpa, tglx

Commit-ID:  bc39f010200d09dc6d4d5e613e86dfd0b22c63b3
Gitweb:     https://git.kernel.org/tip/bc39f010200d09dc6d4d5e613e86dfd0b22c63b3
Author:     Arnd Bergmann <arnd@arndb.de>
AuthorDate: Fri, 22 Jun 2018 11:54:22 +0200
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Fri, 22 Jun 2018 14:37:22 +0200

x86/mce: Always use 64-bit timestamps

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>
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Cc: y2038@lists.linaro.org
Link: http://lkml.kernel.org/r/20180618100759.1921750-1-arnd@arndb.de

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

diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index e93670d736a6..d62201e40027 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;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [tip:ras/core] x86/mce: Always use 64-bit timestamps
@ 2018-06-22 12:40   ` tip-bot for Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot for Borislav Petkov @ 2018-06-22 12:40 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, linux-edac, arnd, tony.luck, bp, mingo, hpa, tglx

Commit-ID:  bc39f010200d09dc6d4d5e613e86dfd0b22c63b3
Gitweb:     https://git.kernel.org/tip/bc39f010200d09dc6d4d5e613e86dfd0b22c63b3
Author:     Arnd Bergmann <arnd@arndb.de>
AuthorDate: Fri, 22 Jun 2018 11:54:22 +0200
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Fri, 22 Jun 2018 14:37:22 +0200

x86/mce: Always use 64-bit timestamps

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>
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Cc: y2038@lists.linaro.org
Link: http://lkml.kernel.org/r/20180618100759.1921750-1-arnd@arndb.de
---
 arch/x86/kernel/cpu/mcheck/mce.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-edac" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index e93670d736a6..d62201e40027 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;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-06-22 12:41 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-18 10:06 [PATCH] x86: mce: always use 64-bit timestamps Arnd Bergmann
2018-06-18 10:06 ` Arnd Bergmann
2018-06-18 12:51 ` [PATCH] " Borislav Petkov
2018-06-18 12:51   ` Borislav Petkov
2018-06-22 12:40 ` [tip:ras/core] x86/mce: Always " tip-bot for Arnd Bergmann
2018-06-22 12:40   ` tip-bot for Borislav Petkov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.