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:


Reply via email to