From: Nuno Das Neves <[email protected]> Sent: Thursday, July 3, 
2025 3:45 PM
> 
> From: Stanislav Kinsburskii <[email protected]>
> 
> 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, 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 <[email protected]>
> Signed-off-by: Jinank Jain <[email protected]>
> Signed-off-by: Stanislav Kinsburskii <[email protected]>
> Signed-off-by: Nuno Das Neves <[email protected]>
> Reviewed-by: Roman Kisel <[email protected]>
> ---
>  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..9a8cba39ea6b 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_root_partition())
> +             /*
> +              * 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

Reviewed-by: Michael Kelley <[email protected]>


Reply via email to