[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen PV passthru: assign SR-IOV virtual functions to separate virtual slots



>>> On 16.10.12 at 19:36, Laszlo Ersek <lersek@xxxxxxxxxx> wrote:
> VFs are reported as single-function devices in PCI_HEADER_TYPE, which
> causes pci_scan_slot() in the PV domU to skip all VFs beyond #0 in the
> pciback-provided slot. Avoid this by assigning each VF to a separate
> virtual slot.
> 
> Signed-off-by: Laszlo Ersek <lersek@xxxxxxxxxx>
> ---
>  drivers/xen/xen-pciback/vpci.c |   35 ++++++++++++++++++++---------------
>  1 files changed, 20 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c
> index 46d140b..489404a 100644
> --- a/drivers/xen/xen-pciback/vpci.c
> +++ b/drivers/xen/xen-pciback/vpci.c
> @@ -89,21 +89,26 @@ static int __xen_pcibk_add_pci_dev(struct 
> xen_pcibk_device *pdev,
>  
>       mutex_lock(&vpci_dev->lock);
>  
> -     /* Keep multi-function devices together on the virtual PCI bus */
> -     for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
> -             if (!list_empty(&vpci_dev->dev_list[slot])) {
> -                     t = list_entry(list_first(&vpci_dev->dev_list[slot]),
> -                                    struct pci_dev_entry, list);
> -
> -                     if (match_slot(dev, t->dev)) {
> -                             pr_info(DRV_NAME ": vpci: %s: "
> -                                     "assign to virtual slot %d func %d\n",
> -                                     pci_name(dev), slot,
> -                                     PCI_FUNC(dev->devfn));
> -                             list_add_tail(&dev_entry->list,
> -                                           &vpci_dev->dev_list[slot]);
> -                             func = PCI_FUNC(dev->devfn);
> -                             goto unlock;
> +     /*
> +      * Keep multi-function devices together on the virtual PCI bus, except
> +      * virtual functions.
> +      */
> +     if (!dev->is_virtfn) {
> +             for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
> +                     if (!list_empty(&vpci_dev->dev_list[slot])) {

To keep indentation reasonable (and shrink the patch size at once),
could you use

                        if (list_empty(&vpci_dev->dev_list[slot]))
                                continue;

here instead? Or alternatively tweak the for() above to embed the
if()'s condition there?

Jan

> +                             t = 
> list_entry(list_first(&vpci_dev->dev_list[slot]),
> +                                            struct pci_dev_entry, list);
> +
> +                             if (match_slot(dev, t->dev)) {
> +                                     pr_info(DRV_NAME ": vpci: %s: "
> +                                             "assign to virtual slot %d func 
> %d\n",
> +                                             pci_name(dev), slot,
> +                                             PCI_FUNC(dev->devfn));
> +                                     list_add_tail(&dev_entry->list,
> +                                                   
> &vpci_dev->dev_list[slot]);
> +                                     func = PCI_FUNC(dev->devfn);
> +                                     goto unlock;
> +                             }
>                       }
>               }
>       }
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx 
> http://lists.xen.org/xen-devel 




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.