On 6/11/2025 4:07 PM, Michael Kelley wrote: > From: Nuno Das Neves <nunodasne...@linux.microsoft.com> Sent: Tuesday, June > 10, 2025 4:52 PM >> >> From: Stanislav Kinsburskii <skinsburs...@linux.microsoft.com> >> >> 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 <jinankj...@linux.microsoft.com> >> Signed-off-by: Jinank Jain <jinankj...@linux.microsoft.com> >> Signed-off-by: Stanislav Kinsburskii <skinsburs...@linux.microsoft.com> >> Signed-off-by: Nuno Das Neves <nunodasne...@linux.microsoft.com> >> --- >> 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. >
Good point, I'll change it to just check for hv_root_partition() here. >> + /* >> + * 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