From: Nuno Das Neves <nunodasneves@xxxxxxxxxxxxxxxxxxx> Sent: Tuesday, June 10, 2025 4:52 PM > > From: Stanislav Kinsburskii <skinsburskii@xxxxxxxxxxxxxxxxxxx> > > Running as nested root on MSHV imposes a different requirement > for the pci-hyperv controller. > > In this setup, the interrupt will first come to the L1 (nested) hypervisor, > which will deliver it to the appropriate root CPU. Instead of issuing the > RETARGET hypercall, we should issue the MAP_DEVICE_INTERRUPT > hypercall to L1 to complete the setup. > > Rename hv_arch_irq_unmask() to hv_irq_retarget_interrupt(). > > Co-developed-by: Jinank Jain <jinankjain@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Jinank Jain <jinankjain@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Stanislav Kinsburskii <skinsburskii@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Nuno Das Neves <nunodasneves@xxxxxxxxxxxxxxxxxxx> > --- > drivers/pci/controller/pci-hyperv.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > index 4d25754dfe2f..0f491c802fb9 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -600,7 +600,7 @@ static unsigned int hv_msi_get_int_vector(struct irq_data *data) > #define hv_msi_prepare pci_msi_prepare > > /** > - * hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current > + * hv_irq_retarget_interrupt() - "Unmask" the IRQ by setting its current > * affinity. > * @data: Describes the IRQ > * > @@ -609,7 +609,7 @@ static unsigned int hv_msi_get_int_vector(struct irq_data *data) > * is built out of this PCI bus's instance GUID and the function > * number of the device. > */ > -static void hv_arch_irq_unmask(struct irq_data *data) > +static void hv_irq_retarget_interrupt(struct irq_data *data) > { > struct msi_desc *msi_desc = irq_data_get_msi_desc(data); > struct hv_retarget_device_interrupt *params; > @@ -714,6 +714,20 @@ static void hv_arch_irq_unmask(struct irq_data *data) > dev_err(&hbus->hdev->device, > "%s() failed: %#llx", __func__, res); > } > + > +static void hv_arch_irq_unmask(struct irq_data *data) > +{ > + if (hv_nested && hv_root_partition()) Based on Patch 1 of this series, this driver is not loaded for the root partition in the non-nested case. So testing hv_nested is redundant. > + /* > + * In case of the nested root partition, the nested hypervisor > + * is taking care of interrupt remapping and thus the > + * MAP_DEVICE_INTERRUPT hypercall is required instead of > + * RETARGET_INTERRUPT. > + */ > + (void)hv_map_msi_interrupt(data, NULL); > + else > + hv_irq_retarget_interrupt(data); > +} > #elif defined(CONFIG_ARM64) > /* > * SPI vectors to use for vPCI; arch SPIs range is [32, 1019], but leaving a bit > -- > 2.34.1