Patchwork pci hotplug: make pci hotplug return value to caller.

login
register
mail settings
Submitter Isaku Yamahata
Date June 15, 2010, 3:47 a.m.
Message ID <20100615034727.GT23473@valinux.co.jp>
Download mbox | patch
Permalink /patch/55601/
State New
Headers show

Comments

Isaku Yamahata - June 15, 2010, 3:47 a.m.
Make pci hotplug callback return value to caller.
There is no reason to discard return value.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
---
 hw/pci.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)
Gerd Hoffmann - June 15, 2010, 8:55 a.m.
On 06/15/10 05:47, Isaku Yamahata wrote:
> Make pci hotplug callback return value to caller.
> There is no reason to discard return value.

Acked-by: Gerd Hoffmann <kraxel@redhat.com>

cheers,
   Gerd
Isaku Yamahata - June 21, 2010, 9:53 a.m.
Ping.
Michael, is there any issues to address?

On Tue, Jun 15, 2010 at 12:47:27PM +0900, Isaku Yamahata wrote:
> Make pci hotplug callback return value to caller.
> There is no reason to discard return value.
> 
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
>  hw/pci.c |   11 +++++++----
>  1 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 7787005..3777c1c 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1623,8 +1623,12 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
>          pci_dev->romfile = qemu_strdup(info->romfile);
>      pci_add_option_rom(pci_dev);
>  
> -    if (qdev->hotplugged)
> -        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> +    if (qdev->hotplugged) {
> +        rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> +        if (rc != 0) {
> +            return rc;
> +        }
> +    }
>      return 0;
>  }
>  
> @@ -1632,8 +1636,7 @@ static int pci_unplug_device(DeviceState *qdev)
>  {
>      PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
>  
> -    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
> -    return 0;
> +    return dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
>  }
>  
>  void pci_qdev_register(PCIDeviceInfo *info)
> -- 
> 1.6.6.1
> 
> 
>
Michael S. Tsirkin - June 21, 2010, 11:40 a.m.
On Tue, Jun 15, 2010 at 12:47:27PM +0900, Isaku Yamahata wrote:
> Make pci hotplug callback return value to caller.
> There is no reason to discard return value.
> 
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
>  hw/pci.c |   11 +++++++----
>  1 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 7787005..3777c1c 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1623,8 +1623,12 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
>          pci_dev->romfile = qemu_strdup(info->romfile);
>      pci_add_option_rom(pci_dev);
>  
> -    if (qdev->hotplugged)
> -        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> +    if (qdev->hotplugged) {
> +        rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> +        if (rc != 0) {
> +            return rc;

I think we need to unregister the device (and remove option rom?),
otherwise there's a resource leak here.
Can it really fail? If not we can just make it void.


> +        }
> +    }
>      return 0;
>  }
>  
> @@ -1632,8 +1636,7 @@ static int pci_unplug_device(DeviceState *qdev)
>  {
>      PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
>  
> -    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
> -    return 0;
> +    return dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
>  }
>  
>  void pci_qdev_register(PCIDeviceInfo *info)
> -- 
> 1.6.6.1
>
Isaku Yamahata - June 21, 2010, 12:31 p.m.
On Mon, Jun 21, 2010 at 02:40:06PM +0300, Michael S. Tsirkin wrote:
> On Tue, Jun 15, 2010 at 12:47:27PM +0900, Isaku Yamahata wrote:
> > Make pci hotplug callback return value to caller.
> > There is no reason to discard return value.
> > 
> > Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> > ---
> >  hw/pci.c |   11 +++++++----
> >  1 files changed, 7 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/pci.c b/hw/pci.c
> > index 7787005..3777c1c 100644
> > --- a/hw/pci.c
> > +++ b/hw/pci.c
> > @@ -1623,8 +1623,12 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
> >          pci_dev->romfile = qemu_strdup(info->romfile);
> >      pci_add_option_rom(pci_dev);
> >  
> > -    if (qdev->hotplugged)
> > -        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> > +    if (qdev->hotplugged) {
> > +        rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> > +        if (rc != 0) {
> > +            return rc;
> 
> I think we need to unregister the device (and remove option rom?),
> otherwise there's a resource leak here.

Okay. I'll look into it.


> Can it really fail? If not we can just make it void.

The current pci hot plug(acpi_piix4.c) always successes.
But in the pcie native hot plug case it can fail because
a slot can have a electromechanical lock.
If the slot is locked, a card can't be inserted/removed.

There are also other pci hot plug controllers which have a lock.
Hot plug can fail with such a controller.

> 
> 
> > +        }
> > +    }
> >      return 0;
> >  }
> >  
> > @@ -1632,8 +1636,7 @@ static int pci_unplug_device(DeviceState *qdev)
> >  {
> >      PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
> >  
> > -    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
> > -    return 0;
> > +    return dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
> >  }
> >  
> >  void pci_qdev_register(PCIDeviceInfo *info)
> > -- 
> > 1.6.6.1
> > 
>

Patch

diff --git a/hw/pci.c b/hw/pci.c
index 7787005..3777c1c 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1623,8 +1623,12 @@  static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
         pci_dev->romfile = qemu_strdup(info->romfile);
     pci_add_option_rom(pci_dev);
 
-    if (qdev->hotplugged)
-        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
+    if (qdev->hotplugged) {
+        rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
+        if (rc != 0) {
+            return rc;
+        }
+    }
     return 0;
 }
 
@@ -1632,8 +1636,7 @@  static int pci_unplug_device(DeviceState *qdev)
 {
     PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
 
-    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
-    return 0;
+    return dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
 }
 
 void pci_qdev_register(PCIDeviceInfo *info)