On 05/03/2025 1:56 pm, Jan Beulich wrote:
> On 03.03.2025 19:53, Andrew Cooper wrote:
>> The exact behaviour of LVTERR interrupt generation is implementation
>> specific.
>>
>>  * Newer Intel CPUs generate an interrupt when pending_esr becomes
>>    nonzero.
>>
>>  * Older Intel and all AMD CPUs generate an interrupt when any
>>    individual bit in pending_esr becomes nonzero.
>>
>> Neither vendor documents their behaviour very well.  Xen implements
>> the per-bit behaviour and has done since support was added.
>>
>> Importantly, the per-bit behaviour can be expressed using the atomic
>> operations available in the x86 architecture, whereas the
>> former (interrupt only on pending_esr becoming nonzero) cannot.
>>
>> With vlapic->hw.pending_esr held outside of the main regs page, it's
>> much easier to use atomic operations.
>>
>> Use xchg() in vlapic_reg_write(), and *set_bit() in vlapic_error().
>>
>> The only interesting change is that vlapic_error() now needs to take a
>> single bit only, rather than a mask, but this fine for all current
>> callers and forseable changes.
>>
>> No practical change.
> From a guest perspective that is.
>
>> Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com>
> Reviewed-by: Jan Beulich <jbeul...@suse.com>

Thanks.

>
>> @@ -124,15 +126,12 @@ static void vlapic_error(struct vlapic *vlapic, 
>> unsigned int errmask)
>>              if ( (lvterr & APIC_VECTOR_MASK) >= 16 )
>>                   inj = true;
> I wouldn't, btw, mind if you also corrected this indentation screw-up of
> mine along with you doing so ...
>
>>              else
>> -                 errmask |= APIC_ESR_RECVILL;
>> +                set_bit(ilog2(APIC_ESR_RECVILL), &vlapic->hw.pending_esr);
> ... here.

Both fixed.

~Andrew

Reply via email to