Skip to content

Commit 88d879d

Browse files
Janakarajan NatarajanKAGA-KOKO
authored andcommitted
Prevent timer value 0 for MWAITX
Newer hardware has uncovered a bug in the software implementation of using MWAITX for the delay function. A value of 0 for the timer is meant to indicate that a timeout will not be used to exit MWAITX. On newer hardware this can result in MWAITX never returning, resulting in NMI soft lockup messages being printed. On older hardware, some of the other conditions under which MWAITX can exit masked this issue. The AMD APM does not currently document this and will be updated. Please refer to http://marc.info/?l=kvm&m=148950623231140 for information regarding NMI soft lockup messages on an AMD Ryzen 1800X. This has been root-caused as a 0 passed to MWAITX causing it to wait indefinitely. This change has the added benefit of avoiding the unnecessary setup of MONITORX/MWAITX when the delay value is zero. Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com> Link: http://lkml.kernel.org/r/1493156643-29366-1-git-send-email-Janakarajan.Natarajan@amd.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1 parent a5859c6 commit 88d879d

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

arch/x86/lib/delay.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ static void delay_mwaitx(unsigned long __loops)
9393
{
9494
u64 start, end, delay, loops = __loops;
9595

96+
/*
97+
* Timer value of 0 causes MWAITX to wait indefinitely, unless there
98+
* is a store on the memory monitored by MONITORX.
99+
*/
100+
if (loops == 0)
101+
return;
102+
96103
start = rdtsc_ordered();
97104

98105
for (;;) {

0 commit comments

Comments
 (0)