mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/idle: Drop incorrect smp_mb() in mwait_idle_with_hints()
With the recent simplifications, it becomes obvious that smp_mb() isn't the
right barrier. Strictly speaking, MONITOR is ordered as a load, but smp_rmb()
isn't correct either, as this only pertains to local ordering. All we need is
a compiler barrier().
Merge the barier() into the monitor() itself, along with an explantion.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
(cherry picked from commit e7710dd843)
This commit is contained in:
1 parent
00ce6be7b7
commit
b0396e465f
1 file changed
+5
-2
@@ -65,8 +65,12 @@ static always_inline void monitor(
|
||||
alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR,
|
||||
[addr] "a" (addr));
|
||||
|
||||
/*
|
||||
* The memory clobber is a compiler barrier. Subseqeunt reads from the
|
||||
* monitored cacheline must not be reordered over MONITOR.
|
||||
*/
|
||||
asm volatile ( "monitor"
|
||||
:: "a" (addr), "c" (ecx), "d" (edx) );
|
||||
:: "a" (addr), "c" (ecx), "d" (edx) : "memory" );
|
||||
}
|
||||
|
||||
static always_inline void mwait(unsigned int eax, unsigned int ecx)
|
||||
@@ -465,7 +469,6 @@ void mwait_idle_with_hints(unsigned int eax, unsigned int ecx)
|
||||
const unsigned int *this_softirq_pending = &softirq_pending(cpu);
|
||||
|
||||
monitor(this_softirq_pending, 0, 0);
|
||||
smp_mb();
|
||||
|
||||
if ( !*this_softirq_pending )
|
||||
{
|
||||
|
||||