On 11/04/2025 10:40 pm, Sean Christopherson wrote: > On Thu, Apr 10, 2025, Ross Philipson wrote: >> + * instruction can return for a number of reasons. Test to see if it returned >> + * because the monitor was written to. >> + */ >> + monitor >> + >> +1: >> + mfence >> + mwait >> + movl (%eax), %edx > Why load the value into EDX? At a glance, the value is never consumed. > >> + testl %edx, %edx >> + jz 1b > This usage of MONITOR/MWAIT is flawed. The monitor needs to be re-armed in each > loop, otherwise mwait will be a glorified nop. > > More importantly, the exit condition needs to be checked before monitor, after monitor and before mwait. But yes, the prior logic was definitely wonky. > even on > the first iteration. In the (probably extremely unlikely) scenario that the write > to wake the CPU arrives before MONITOR is executed, this CPU may get stuck waiting > indefinitely. > > E.g. something like: > > > 1: > monitor > cmpl (%eax), 0 $0 Luckily, this will fail to assemble, rather than dereferencing 0. ~Andrew > jnz 2f > mwait > jmp 1b > 2: