[PATCH 4/4][Focal/linux-azure] PCI: hv: Fix interrupt mapping for multi-MSI

Tim Gardner tim.gardner at canonical.com
Mon Jul 18 17:36:00 UTC 2022


On 7/14/22 03:08, Bartlomiej Zolnierkiewicz wrote:
> Hi Tim,
> 
> On Wed, Jul 13, 2022 at 2:57 PM Tim Gardner <tim.gardner at canonical.com> wrote:
>>
>> From: Jeffrey Hugo <quic_jhugo at quicinc.com>
>>
>> BugLink: https://bugs.launchpad.net/bugs/1981577
>>
>> According to Dexuan, the hypervisor folks beleive that multi-msi
>> allocations are not correct.  compose_msi_msg() will allocate multi-msi
>> one by one.  However, multi-msi is a block of related MSIs, with alignment
>> requirements.  In order for the hypervisor to allocate properly aligned
>> and consecutive entries in the IOMMU Interrupt Remapping Table, there
>> should be a single mapping request that requests all of the multi-msi
>> vectors in one shot.
>>
>> Dexuan suggests detecting the multi-msi case and composing a single
>> request related to the first MSI.  Then for the other MSIs in the same
>> block, use the cached information.  This appears to be viable, so do it.
>>
>> Suggested-by: Dexuan Cui <decui at microsoft.com>
>> Signed-off-by: Jeffrey Hugo <quic_jhugo at quicinc.com>
>> Reviewed-by: Dexuan Cui <decui at microsoft.com>
>> Tested-by: Michael Kelley <mikelley at microsoft.com>
>> Link: https://lore.kernel.org/r/1652282599-21643-1-git-send-email-quic_jhugo@quicinc.com
>> Signed-off-by: Wei Liu <wei.liu at kernel.org>
>> (backported from commit a2bad844a67b1c7740bda63e87453baf63c3a7f7)
>> [rtg - msi_desc attributes are in a different place in the structure ]
>> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
>> ---
>>   drivers/pci/controller/pci-hyperv.c | 67 ++++++++++++++++++++++++-----
>>   1 file changed, 57 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
>> index 04165db6d385..6ce774de3525 100644
>> --- a/drivers/pci/controller/pci-hyperv.c
>> +++ b/drivers/pci/controller/pci-hyperv.c
>> @@ -1398,6 +1398,10 @@ static void hv_int_desc_free(struct hv_pci_dev *hpdev,
>>                  u8 buffer[sizeof(struct pci_delete_interrupt)];
>>          } ctxt;
>>
>> +       if (!int_desc->vector_count) {
>> +               kfree(int_desc);
>> +               return;
>> +       }
>>          memset(&ctxt, 0, sizeof(ctxt));
>>          int_pkt = (struct pci_delete_interrupt *)&ctxt.pkt.message;
>>          int_pkt->message_type.type =
>> @@ -1491,8 +1495,15 @@ static void hv_irq_unmask(struct irq_data *data)
>>          memset(params, 0, sizeof(*params));
>>          params->partition_id = HV_PARTITION_ID_SELF;
>>          params->int_entry.source = HV_INTERRUPT_SOURCE_MSI;
>> +#ifdef CONFIG_X86
>>          params->int_entry.msi_entry.address.as_uint32 = int_desc->address & 0xffffffff;
>>          params->int_entry.msi_entry.data.as_uint32 = int_desc->data;
>> +#elif CONFIG_ARM64
>> +       params->int_entry.msi_entry.address = int_desc->address & 0xffffffff;
>> +       params->int_entry.msi_entry.data = int_desc->data;
>> +#else
>> +#error Unsupported architecture
>> +#endif
> 
> Shouldn't the above change be included in the patch #1/4 instead?
> 

That block really should have gone into patch 2 in order to enable 
bisecting to work. I'll do that when I apply the patches, but otherwise 
won't change the code.

> [ Even better if we could backport to focal:linux-azure commit
> d06957d7a6929e6a4aa959cb59d66f0c095fc974 ("PCI: hv: Avoid the retarget
> interrupt hypercall in irq_unmask() on ARM64") like it is done for
> jammy:linux-azure. I assume that it was not backported because it is
> more risky for focal as It introduces behavior change for ARM64.. ]
> 

This is at an awkward point in the architecture code consolidation. I 
tried adding d06957d7a6929e6a4aa959cb59d66f0c095fc974 ("PCI: hv: Avoid 
the retarget interrupt hypercall in irq_unmask() on ARM64") but it 
caused more back port issues then it was worth.

This is the code that Microsoft tested, so I'm content to leave it as is.

rtg



-- 
-----------
Tim Gardner
Canonical, Inc



More information about the kernel-team mailing list