diff mbox series

[v2] hw/pci/pci: Fix slot check for plugged devices

Message ID 20201006125908.598388-1-jusual@redhat.com
State New
Headers show
Series [v2] hw/pci/pci: Fix slot check for plugged devices | expand

Commit Message

Julia Suvorova Oct. 6, 2020, 12:59 p.m. UTC
If devfn is assigned automatically, 'else' clauses will never be
executed. And if it does not matter for the reserved and available
devfn, because we have already checked it, the check for function0
needs to be done again.

Steps to reproduce:
1. Run QEMU with:
        -M q35 \
        -device pcie-root-port,id=rp,.. \
        -device pci-device,bus=rp
2. Add a new device to the same port:
        device_add pci-device,bus=rp

The last command will add the device to slot 1 instead of
failing with "PCI: slot 0 function 0 already occupied..."

Signed-off-by: Julia Suvorova <jusual@redhat.com>
---
v2:
    * add example to the commit message [Michael]

 hw/pci/pci.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Stefano Garzarella Oct. 7, 2020, 7:39 a.m. UTC | #1
On Tue, Oct 06, 2020 at 02:59:08PM +0200, Julia Suvorova wrote:
> If devfn is assigned automatically, 'else' clauses will never be
> executed. And if it does not matter for the reserved and available
> devfn, because we have already checked it, the check for function0
> needs to be done again.
> 
> Steps to reproduce:
> 1. Run QEMU with:
>         -M q35 \
>         -device pcie-root-port,id=rp,.. \
>         -device pci-device,bus=rp
> 2. Add a new device to the same port:
>         device_add pci-device,bus=rp
> 
> The last command will add the device to slot 1 instead of
> failing with "PCI: slot 0 function 0 already occupied..."
> 
> Signed-off-by: Julia Suvorova <jusual@redhat.com>
> ---
> v2:
>     * add example to the commit message [Michael]
> 
>  hw/pci/pci.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index de0fae10ab..ae132b0b52 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -1034,8 +1034,9 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev,
>                     PCI_SLOT(devfn), PCI_FUNC(devfn), name,
>                     bus->devices[devfn]->name);
>          return NULL;
> -    } else if (dev->hotplugged &&
> -               pci_get_function_0(pci_dev)) {
> +    };
        ^
This semicolon seems unnecessary, can we take it out?

Thanks,
Stefano

> +
> +    if (dev->hotplugged && pci_get_function_0(pci_dev)) {
>          error_setg(errp, "PCI: slot %d function 0 already ocuppied by %s,"
>                     " new func %s cannot be exposed to guest.",
>                     PCI_SLOT(pci_get_function_0(pci_dev)->devfn),
> -- 
> 2.25.4
> 
>
Julia Suvorova Oct. 7, 2020, 10:38 a.m. UTC | #2
On Wed, Oct 7, 2020 at 9:39 AM Stefano Garzarella <sgarzare@redhat.com> wrote:
>
> On Tue, Oct 06, 2020 at 02:59:08PM +0200, Julia Suvorova wrote:
> > If devfn is assigned automatically, 'else' clauses will never be
> > executed. And if it does not matter for the reserved and available
> > devfn, because we have already checked it, the check for function0
> > needs to be done again.
> >
> > Steps to reproduce:
> > 1. Run QEMU with:
> >         -M q35 \
> >         -device pcie-root-port,id=rp,.. \
> >         -device pci-device,bus=rp
> > 2. Add a new device to the same port:
> >         device_add pci-device,bus=rp
> >
> > The last command will add the device to slot 1 instead of
> > failing with "PCI: slot 0 function 0 already occupied..."
> >
> > Signed-off-by: Julia Suvorova <jusual@redhat.com>
> > ---
> > v2:
> >     * add example to the commit message [Michael]
> >
> >  hw/pci/pci.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > index de0fae10ab..ae132b0b52 100644
> > --- a/hw/pci/pci.c
> > +++ b/hw/pci/pci.c
> > @@ -1034,8 +1034,9 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev,
> >                     PCI_SLOT(devfn), PCI_FUNC(devfn), name,
> >                     bus->devices[devfn]->name);
> >          return NULL;
> > -    } else if (dev->hotplugged &&
> > -               pci_get_function_0(pci_dev)) {
> > +    };
>         ^
> This semicolon seems unnecessary, can we take it out?

Oops, thanks for pointing out.
diff mbox series

Patch

diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index de0fae10ab..ae132b0b52 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1034,8 +1034,9 @@  static PCIDevice *do_pci_register_device(PCIDevice *pci_dev,
                    PCI_SLOT(devfn), PCI_FUNC(devfn), name,
                    bus->devices[devfn]->name);
         return NULL;
-    } else if (dev->hotplugged &&
-               pci_get_function_0(pci_dev)) {
+    };
+
+    if (dev->hotplugged && pci_get_function_0(pci_dev)) {
         error_setg(errp, "PCI: slot %d function 0 already ocuppied by %s,"
                    " new func %s cannot be exposed to guest.",
                    PCI_SLOT(pci_get_function_0(pci_dev)->devfn),