|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 1/2] xen/pci: introduce PF<->VF links
On 12.11.2024 21:53, Stewart Hildebrand wrote:
> Add links between a VF's struct pci_dev and its associated PF struct
> pci_dev.
>
> The hardware domain is expected to add a PF first before adding
> associated VFs. Similarly, the hardware domain is expected to remove the
> associated VFs before removing the PF. If adding/removing happens out of
> order, print a warning and return an error. This means that VFs can only
> exist with an associated PF.
>
> Additionally, if the hardware domain attempts to remove a PF with VFs
> still present, mark the PF and VFs broken, because Linux Dom0 has been
> observed to not respect the error returned.
>
> Move the call to pci_get_pdev() down to avoid dropping and re-acquiring
> the pcidevs_lock(). Drop the call to pci_add_device() as it is invalid
> to add a VF without an existing PF.
>
> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
I'm okay with this, so in principle
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
A few comments nevertheless, which may result in there wanting to be
another revision.
> ---
> Candidate for backport to 4.19 (the next patch depends on this one)
With this dependency (we definitely want to backport the other patch) ...
> v6->v7:
> * cope with multiple invocations of pci_add_device for VFs
> * get rid of enclosing struct for single member
> * during PF removal attempt with VFs still present:
> * keep PF
> * mark broken
> * don't unlink
> * return error
> * during VF add:
> * initialize pf_pdev in declaration
> * remove logic catering to adding VFs without PF
... I'd like to point out that this change has an at least theoretical
risk of causing regressions. I therefore wonder whether that wouldn't
better be a separate change, not to be backported.
> @@ -703,7 +696,38 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn,
> * extended function.
> */
> if ( pdev->info.is_virtfn )
> - pdev->info.is_extfn = pf_is_extfn;
> + {
> + struct pci_dev *pf_pdev = pci_get_pdev(NULL,
> + PCI_SBDF(seg,
> + info->physfn.bus,
> +
> info->physfn.devfn));
> + struct pci_dev *vf_pdev;
const?
> + bool already_added = false;
> +
> + if ( !pf_pdev )
> + {
> + printk(XENLOG_WARNING
> + "Attempted to add SR-IOV device VF %pp without PF
> %pp\n",
I'd omit "device" here.
(These changes alone I'd be happy to do while committing.)
> + &pdev->sbdf,
> + &PCI_SBDF(seg, info->physfn.bus, info->physfn.devfn));
> + free_pdev(pseg, pdev);
> + ret = -ENODEV;
> + goto out;
> + }
> +
> + pdev->info.is_extfn = pf_pdev->info.is_extfn;
There's a comment related to this, partly visible in patch context above.
That comment imo needs moving here. And correcting while moving (it's
inverted imo, or at least worded ambiguously).
> + pdev->pf_pdev = pf_pdev;
> + list_for_each_entry(vf_pdev, &pf_pdev->vf_list, vf_list)
> + {
> + if ( vf_pdev == pdev )
> + {
> + already_added = true;
> + break;
> + }
> + }
> + if ( !already_added )
> + list_add(&pdev->vf_list, &pf_pdev->vf_list);
> + }
> }
Personally, as I have a dislike for excess variables, I'd have gotten away
without "already_added". Instead of setting it to true, vf_pdev could be
set to NULL. Others may, however, consider this "obfuscation" or alike.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |