On 03/07/2025 10:43 am, Jan Beulich wrote: > On 02.07.2025 16:41, Andrew Cooper wrote: >> @@ -461,12 +468,19 @@ void mwait_idle_with_hints(unsigned int eax, unsigned >> int ecx) >> >> monitor(this_softirq_pending, 0, 0); >> >> + ASSERT(!local_irq_is_enabled()); >> + >> if ( !*this_softirq_pending ) >> { >> struct cpu_info *info = get_cpu_info(); >> >> spec_ctrl_enter_idle(info); >> - mwait(eax, ecx); >> + >> + if ( ecx & MWAIT_ECX_INTERRUPT_BREAK ) >> + mwait(eax, ecx); >> + else >> + sti_mwait_cli(eax, ecx); > Actually, I'm curious: It seems quite likely that you did consider an > alternative resulting in assembly code like this: > > test $MWAIT_ECX_INTERRUPT_BREAK, %cl > jz 0f > sti > 0: > monitor > cli > > CLI being a relatively cheap operation aiui, is there anything wrong or > undesirable with this (smaller overall) alternative?
Other than it needing to be mwait? The overheads aren't interesting; they're nothing compared to going idle. What does matter is that such a transformation cannot exist in mwait() itself, as that breaks acpi_dead_idle(), and if we turn this mwait() into inline asm, there's only a single caller of mwait() left. ~Andrew