On 5/21/26 2:29 PM, Farhan Ali wrote: > Remove the FH_MASK_ENABLE check when disabling interrupt forwarding > during device reset. This check was broken for the default case in > the switch statement above, preventing proper cleanup of interrupt > forwarding. > > The pbdev->aif check in s390_pci_kvm_aif_disable() already guards > against double-disabling of interrupt forwarding. > > Cc: [email protected] > Reported-by: Niklas Schnelle <[email protected]> > Signed-off-by: Farhan Ali <[email protected]>
Thanks Farhan (and Omar for testing). This issue was exposed by recent changes to the kernel but both the initial implementation of AIF + the attempts at avoiding duplicate registration failed to catch this case, which we can now encounter easily with the new code in the guest kernel. The goal of the enabled function handle check here was intended to avoid double-deregistration, but in fact we can get here when the function handle is already disabled but AIF was never cleaned up in response to guest activity (e.g. guest is not required to issue the corresponding MPCIFC to clean it up). Prior to the introduction of pbdev->aif, this check did help prevent instances of double-deregistration but was not sufficient to also catch the case where the function was already disabled but AIF was never cleaned up. So I think it's been broken from the beginning (d0bc7091c2) but it was not safe to remove this check until we introduced pbdev->aif (07b2c8e034), which allows us to reliably tell whether or not aif cleanup still needs to happen during reset. Reviewed-by: Matthew Rosato <[email protected]> > --- > hw/s390x/s390-pci-bus.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c > index 3665aba106..2f7b214891 100644 > --- a/hw/s390x/s390-pci-bus.c > +++ b/hw/s390x/s390-pci-bus.c > @@ -1542,7 +1542,7 @@ static void s390_pci_device_reset(DeviceState *dev) > break; > } > > - if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) { > + if (pbdev->interp) { > /* Interpreted devices were using interrupt forwarding */ > s390_pci_kvm_aif_disable(pbdev); > } else if (pbdev->summary_ind) {
