|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/pci: fix phantom error path in assign_device()
On 12/11/23 11:21, Jan Beulich wrote:
> On 11.12.2023 16:05, Stewart Hildebrand wrote:
>> Currently if an iommu_call() for a phantom function fails, there is no
>> indication of the failure. Propagate (but don't return) the error code
>> from the most recently failed iommu_call() and emit a warning. While
>> here, add a comment to clarify that the loop keeps iterating even when
>> failure is encountered.
>>
>> Fixes: cd7dedad8209 ("passthrough: simplify locking and logging")
>> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
>> ---
>> Unlike assign_device(), deassign_device() breaks out of the phantom loop
>> when a failure is encountered and returns the error code. I'm curious
>> why assign_device() and deassign_device() behave differently? It looks
>> like it's been that way since
>> 4e9950dc1bd2 ("IOMMU: add phantom function support"). I was initially
>> inclined to break out of the loop and return the error code in
>> assign_device(), but adhering to the principle of Chesterton's fence,
>> I'd first like to understand why this is not currently being done.
>
> It's been a long time, but seeing the same pattern for add/remove I think
> the idea was that a device may still work with its phantom functions not
> properly mapped in the IOMMU, whereas failure to unmap means a domain may
> retain (partial) access to a device.
Thanks for the info. I'll add something about this to the in-code comment (see
below).
>
>> I'm aware that I could have avoided introducing a tmp local variable by
>> using the conditional operator with omitted middle operand:
>>
>> rc_nonfatal = iommu_call(...) ?: rc_nonfatal;
>>
>> However, I explicitly chose not to do this to avoid relying on a GNU
>> extension in yet another place.
>
> Introducing a helper variable is certainly okay, if you think that's
> better. However, in cases like ...
>
>> --- a/xen/drivers/passthrough/pci.c
>> +++ b/xen/drivers/passthrough/pci.c
>> @@ -1407,7 +1407,7 @@ static int assign_device(struct domain *d, u16 seg, u8
>> bus, u8 devfn, u32 flag)
>> {
>> const struct domain_iommu *hd = dom_iommu(d);
>> struct pci_dev *pdev;
>> - int rc = 0;
>> + int rc = 0, rc_nonfatal = 0;
>>
>> if ( !is_iommu_enabled(d) )
>> return 0;
>> @@ -1443,21 +1443,28 @@ static int assign_device(struct domain *d, u16 seg,
>> u8 bus, u8 devfn, u32 flag)
>> pci_to_dev(pdev), flag)) )
>> goto done;
>>
>> - for ( ; pdev->phantom_stride; rc = 0 )
>> + while ( pdev->phantom_stride )
>> {
>> + int tmp;
>> +
>> devfn += pdev->phantom_stride;
>> if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
>> + {
>> + devfn -= pdev->phantom_stride; /* Adjust for printing */
>> break;
>> + }
>> - rc = iommu_call(hd->platform_ops, assign_device, d, devfn,
>> - pci_to_dev(pdev), flag);
>> + tmp = iommu_call(hd->platform_ops, assign_device, d, devfn,
>> + pci_to_dev(pdev), flag);
>> + rc_nonfatal = tmp ? tmp : rc_nonfatal;
>
> ... this, I'm relatively certain most maintainers would agree that using
> the extension will yield easier to read code. Plus there's no reason to
> avoid extensions we use widely anyway, as long as there's no (reasonably
> neat) way to express the same without using extensions.
OK, I'll use the extension.
>
> Jan
>
>> + /* Keep iterating even if the iommu call failed. */
I'll change this in-code comment to:
/*
* Keep going in case of iommu_call failure for phantom functions. The
* device may still be usable without phantom functions mapped in the
* IOMMU.
*/
>> }
>>
>> done:
>> - if ( rc )
>> + if ( rc || rc_nonfatal )
>> printk(XENLOG_G_WARNING "%pd: assign (%pp) failed (%d)\n",
>> - d, &PCI_SBDF(seg, bus, devfn), rc);
>> + d, &PCI_SBDF(seg, bus, devfn), rc ? rc : rc_nonfatal);
>> /* The device is assigned to dom_io so mark it as quarantined */
>> - else if ( d == dom_io )
>> + if ( !rc && d == dom_io )
>> pdev->quarantine = true;
>>
>> return rc;
>>
>> base-commit: 1403131596fa77663708f6baa0fee8bf7b95eb5a
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |