PCI: hv: Use nested hypercall for retargeting interrupts

Message ID 20230404113546.856813-1-jinankjain@linux.microsoft.com
State New
Headers
Series PCI: hv: Use nested hypercall for retargeting interrupts |

Commit Message

Jinank Jain April 4, 2023, 11:35 a.m. UTC
  In case of nested MSHV, retargeting interrupt hypercall should be sent
to L0 hypervisor instead of L1 hypervisor.

Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
---
 drivers/pci/controller/pci-hyperv.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
  

Comments

Nuno Das Neves April 4, 2023, 5 p.m. UTC | #1
Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>

On 4/4/2023 4:35 AM, Jinank Jain wrote:
> In case of nested MSHV, retargeting interrupt hypercall should be sent
> to L0 hypervisor instead of L1 hypervisor.
> 
> Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
> ---
>  drivers/pci/controller/pci-hyperv.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
> index f33370b75628..2123f632ecf7 100644
> --- a/drivers/pci/controller/pci-hyperv.c
> +++ b/drivers/pci/controller/pci-hyperv.c
> @@ -704,8 +704,14 @@ static void hv_arch_irq_unmask(struct irq_data *data)
>  		}
>  	}
>  
> -	res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17),
> -			      params, NULL);
> +	if (hv_nested)
> +		res = hv_do_nested_hypercall(HVCALL_RETARGET_INTERRUPT |
> +					     (var_size << 17),
> +					     params, NULL);
> +	else
> +		res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT |
> +				      (var_size << 17),
> +				      params, NULL);
>  
>  exit_unlock:
>  	spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags);
  
Wei Liu April 5, 2023, 11:17 p.m. UTC | #2
On Tue, Apr 04, 2023 at 11:35:46AM +0000, Jinank Jain wrote:
> In case of nested MSHV, retargeting interrupt hypercall should be sent
> to L0 hypervisor instead of L1 hypervisor.
> 
> Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>

While I think this is a sensible change -- how did you discover this?
Can you provide a bit more information?

> ---
>  drivers/pci/controller/pci-hyperv.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
> index f33370b75628..2123f632ecf7 100644
> --- a/drivers/pci/controller/pci-hyperv.c
> +++ b/drivers/pci/controller/pci-hyperv.c
> @@ -704,8 +704,14 @@ static void hv_arch_irq_unmask(struct irq_data *data)
>  		}
>  	}
>  
> -	res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17),
> -			      params, NULL);
> +	if (hv_nested)
> +		res = hv_do_nested_hypercall(HVCALL_RETARGET_INTERRUPT |
> +					     (var_size << 17),
> +					     params, NULL);
> +	else
> +		res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT |
> +				      (var_size << 17),
> +				      params, NULL);
>  
>  exit_unlock:
>  	spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags);
> -- 
> 2.34.1
>
  
Jinank Jain April 6, 2023, 6:11 a.m. UTC | #3
This was observed while testing pass-through PCI devices on the nested 
MSHV setup.

Regards,

Jinank

On 4/6/2023 4:47 AM, Wei Liu wrote:
> On Tue, Apr 04, 2023 at 11:35:46AM +0000, Jinank Jain wrote:
>> In case of nested MSHV, retargeting interrupt hypercall should be sent
>> to L0 hypervisor instead of L1 hypervisor.
>>
>> Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
> While I think this is a sensible change -- how did you discover this?
> Can you provide a bit more information?
>
>> ---
>>   drivers/pci/controller/pci-hyperv.c | 10 ++++++++--
>>   1 file changed, 8 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
>> index f33370b75628..2123f632ecf7 100644
>> --- a/drivers/pci/controller/pci-hyperv.c
>> +++ b/drivers/pci/controller/pci-hyperv.c
>> @@ -704,8 +704,14 @@ static void hv_arch_irq_unmask(struct irq_data *data)
>>   		}
>>   	}
>>   
>> -	res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17),
>> -			      params, NULL);
>> +	if (hv_nested)
>> +		res = hv_do_nested_hypercall(HVCALL_RETARGET_INTERRUPT |
>> +					     (var_size << 17),
>> +					     params, NULL);
>> +	else
>> +		res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT |
>> +				      (var_size << 17),
>> +				      params, NULL);
>>   
>>   exit_unlock:
>>   	spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags);
>> -- 
>> 2.34.1
>>
  
Wei Liu April 13, 2023, 1:22 a.m. UTC | #4
On Tue, Apr 04, 2023 at 11:35:46AM +0000, Jinank Jain wrote:
> In case of nested MSHV, retargeting interrupt hypercall should be sent
> to L0 hypervisor instead of L1 hypervisor.
> 
> Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>

Applied to hyperv-next. Thanks.
  
Michael Kelley (LINUX) April 13, 2023, 3:05 a.m. UTC | #5
From: Wei Liu <wei.liu@kernel.org> Sent: Wednesday, April 12, 2023 6:23 PM
> 
> On Tue, Apr 04, 2023 at 11:35:46AM +0000, Jinank Jain wrote:
> > In case of nested MSHV, retargeting interrupt hypercall should be sent
> > to L0 hypervisor instead of L1 hypervisor.
> >
> > Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
> 
> Applied to hyperv-next. Thanks.

I'd like to hold off on taking this change.  Nuno and I are discussing
how best to handle nested hypercalls.  In addition to the proposed
nested changes,  we have hypercall changes coming as part of the
TDX and fully enlightened SNP patch sets.  If possible, I'd like to
avoid adding logic at the hv_do_hypercall() call sites.  It's not clear
whether avoiding such logic will really be feasible, but I'd like to
think about it for a bit before reaching that conclusion.

Michael
  
Wei Liu April 13, 2023, 3:34 p.m. UTC | #6
On Thu, Apr 13, 2023 at 03:05:09AM +0000, Michael Kelley (LINUX) wrote:
> From: Wei Liu <wei.liu@kernel.org> Sent: Wednesday, April 12, 2023 6:23 PM
> > 
> > On Tue, Apr 04, 2023 at 11:35:46AM +0000, Jinank Jain wrote:
> > > In case of nested MSHV, retargeting interrupt hypercall should be sent
> > > to L0 hypervisor instead of L1 hypervisor.
> > >
> > > Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
> > 
> > Applied to hyperv-next. Thanks.
> 
> I'd like to hold off on taking this change.  Nuno and I are discussing
> how best to handle nested hypercalls.  In addition to the proposed
> nested changes,  we have hypercall changes coming as part of the
> TDX and fully enlightened SNP patch sets.  If possible, I'd like to
> avoid adding logic at the hv_do_hypercall() call sites.  It's not clear
> whether avoiding such logic will really be feasible, but I'd like to
> think about it for a bit before reaching that conclusion.

I thought that discussion will go on for a while but this patch fixed a
real bug.

Holding off is fine too. I will remove this patch from hyperv-next.

Thanks,
Wei.

> 
> Michael
>
  

Patch

diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index f33370b75628..2123f632ecf7 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -704,8 +704,14 @@  static void hv_arch_irq_unmask(struct irq_data *data)
 		}
 	}
 
-	res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17),
-			      params, NULL);
+	if (hv_nested)
+		res = hv_do_nested_hypercall(HVCALL_RETARGET_INTERRUPT |
+					     (var_size << 17),
+					     params, NULL);
+	else
+		res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT |
+				      (var_size << 17),
+				      params, NULL);
 
 exit_unlock:
 	spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags);