Re: [RFC v2 13/17] x86/apic: Handle EOI writes for SAVIC guests

From: Sean Christopherson
Date: Thu Mar 27 2025 - 10:21:53 EST


On Thu, Mar 27, 2025, Thomas Gleixner wrote:
> On Thu, Mar 27 2025 at 11:48, Thomas Gleixner wrote:
>
> > On Fri, Mar 21 2025 at 10:11, Sean Christopherson wrote:
> >> On Fri, Mar 21, 2025, Thomas Gleixner wrote:
> >>>
> >>> Congrats. You managed to re-implement find_last_bit() in the most
> >>> incomprehesible way.
> >>
> >> Heh, having burned myself quite badly by trying to use find_last_bit() to get
> >> pending/in-service IRQs in KVM code...
> >>
> >> Using find_last_bit() doesn't work because the ISR chunks aren't contiguous,
> >> they're 4-byte registers at 16-byte strides.
> >
> > Which is obvious to solve with trivial integer math:
> >
> > bit = vector + 32 * (vector / 32);
> >
> > ergo
> >
> > vector = bit - 16 * (bit / 32);
> >
> > No?
>
> Actually no. As this is for 8 byte alignment. For 16 byte it's
>
> bit = vector + 96 * (vector / 32);
> ergo
> vector = bit - 24 * (bit / 32);
>
> Which is still just shifts and add/sub.

IIUC, the suggestion is to use find_last_bit() to walk the entire 128-byte range
covered by ISR registers, under the assumption that the holes are guaranteed to
be zero. I suppose that works for Secure AVIC, but I don't want to do that for
KVM since KVM can't guarantee the holes are zero (userspace can stuff APIC state).