[Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler

David Hildenbrand posted 10 patches 7 years ago
There is a newer version of this series
[Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by David Hildenbrand 7 years ago
Introduce and use the "unplug" callback.

This is a preparation for multi-stage hotplug handlers, whereby the bus
hotplug handler is overwritten by the machine hotplug handler. This handler
will then pass control to the bus hotplug handler. So to get this running
cleanly, we also have to make sure to go via the hotplug handler chain when
actually unplugging a device after an unplug request. Lookup the hotplug
handler and call "unplug".

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/pci-bridge/pci_bridge_dev.c  | 14 ++++++++++++++
 hw/pci-bridge/pcie_pci_bridge.c | 14 ++++++++++++++
 hw/pci/shpc.c                   | 11 ++++++++++-
 include/hw/pci/shpc.h           |  2 ++
 4 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index e1df9a52ac..91415f114c 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -219,6 +219,19 @@ static void pci_bridge_dev_plug_cb(HotplugHandler *hotplug_dev,
     shpc_device_plug_cb(hotplug_dev, dev, errp);
 }
 
+static void pci_bridge_dev_unplug_cb(HotplugHandler *hotplug_dev,
+                                     DeviceState *dev, Error **errp)
+{
+    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
+
+    if (!shpc_present(pci_hotplug_dev)) {
+        error_setg(errp, "standard hotplug controller has been disabled for "
+                   "this %s", TYPE_PCI_BRIDGE_DEV);
+        return;
+    }
+    shpc_device_unplug_cb(hotplug_dev, dev, errp);
+}
+
 static void pci_bridge_dev_unplug_request_cb(HotplugHandler *hotplug_dev,
                                              DeviceState *dev, Error **errp)
 {
@@ -251,6 +264,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &pci_bridge_dev_vmstate;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     hc->plug = pci_bridge_dev_plug_cb;
+    hc->unplug = pci_bridge_dev_unplug_cb;
     hc->unplug_request = pci_bridge_dev_unplug_request_cb;
 }
 
diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
index c634353b06..7c667bc97c 100644
--- a/hw/pci-bridge/pcie_pci_bridge.c
+++ b/hw/pci-bridge/pcie_pci_bridge.c
@@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
     shpc_device_plug_cb(hotplug_dev, dev, errp);
 }
 
+static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
+                                      DeviceState *dev, Error **errp)
+{
+    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
+
+    if (!shpc_present(pci_hotplug_dev)) {
+        error_setg(errp, "standard hotplug controller has been disabled for "
+                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);
+        return;
+    }
+    shpc_device_unplug_cb(hotplug_dev, dev, errp);
+}
+
 static void pcie_pci_bridge_unplug_request_cb(HotplugHandler *hotplug_dev,
                                               DeviceState *dev, Error **errp)
 {
@@ -180,6 +193,7 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass, void *data)
     dc->reset = &pcie_pci_bridge_reset;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     hc->plug = pcie_pci_bridge_plug_cb;
+    hc->unplug = pcie_pci_bridge_unplug_cb;
     hc->unplug_request = pcie_pci_bridge_unplug_request_cb;
 }
 
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index 098ffaef1d..5de905cb56 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -238,6 +238,7 @@ static void shpc_invalid_command(SHPCDevice *shpc)
 
 static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
 {
+    HotplugHandler *hotplug_ctrl;
     int devfn;
     int pci_slot = SHPC_IDX_TO_PCI(slot);
     for (devfn = PCI_DEVFN(pci_slot, 0);
@@ -245,7 +246,9 @@ static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
          ++devfn) {
         PCIDevice *affected_dev = shpc->sec_bus->devices[devfn];
         if (affected_dev) {
-            object_unparent(OBJECT(affected_dev));
+            hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(affected_dev));
+            hotplug_handler_unplug(hotplug_ctrl, DEVICE(affected_dev),
+                                   &error_abort);
         }
     }
 }
@@ -540,6 +543,12 @@ void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
     shpc_interrupt_update(pci_hotplug_dev);
 }
 
+void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+                           Error **errp)
+{
+    object_unparent(OBJECT(dev));
+}
+
 void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
                                    DeviceState *dev, Error **errp)
 {
diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
index 71293aca58..18f6ec1cd5 100644
--- a/include/hw/pci/shpc.h
+++ b/include/hw/pci/shpc.h
@@ -47,6 +47,8 @@ void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);
 
 void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
                          Error **errp);
+void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+                           Error **errp);
 void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
                                    DeviceState *dev, Error **errp);
 
-- 
2.17.2


Re: [Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by David Gibson 6 years, 12 months ago
On Mon, Nov 05, 2018 at 11:20:43AM +0100, David Hildenbrand wrote:
> Introduce and use the "unplug" callback.
> 
> This is a preparation for multi-stage hotplug handlers, whereby the bus
> hotplug handler is overwritten by the machine hotplug handler. This handler
> will then pass control to the bus hotplug handler. So to get this running
> cleanly, we also have to make sure to go via the hotplug handler chain when
> actually unplugging a device after an unplug request. Lookup the hotplug
> handler and call "unplug".
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  hw/pci-bridge/pci_bridge_dev.c  | 14 ++++++++++++++
>  hw/pci-bridge/pcie_pci_bridge.c | 14 ++++++++++++++
>  hw/pci/shpc.c                   | 11 ++++++++++-
>  include/hw/pci/shpc.h           |  2 ++
>  4 files changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
> index e1df9a52ac..91415f114c 100644
> --- a/hw/pci-bridge/pci_bridge_dev.c
> +++ b/hw/pci-bridge/pci_bridge_dev.c
> @@ -219,6 +219,19 @@ static void pci_bridge_dev_plug_cb(HotplugHandler *hotplug_dev,
>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>  }
>  
> +static void pci_bridge_dev_unplug_cb(HotplugHandler *hotplug_dev,
> +                                     DeviceState *dev, Error **errp)
> +{
> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
> +
> +    if (!shpc_present(pci_hotplug_dev)) {
> +        error_setg(errp, "standard hotplug controller has been disabled for "
> +                   "this %s", TYPE_PCI_BRIDGE_DEV);
> +        return;
> +    }
> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
> +}
> +
>  static void pci_bridge_dev_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                               DeviceState *dev, Error **errp)
>  {
> @@ -251,6 +264,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &pci_bridge_dev_vmstate;
>      set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>      hc->plug = pci_bridge_dev_plug_cb;
> +    hc->unplug = pci_bridge_dev_unplug_cb;
>      hc->unplug_request = pci_bridge_dev_unplug_request_cb;
>  }
>  
> diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
> index c634353b06..7c667bc97c 100644
> --- a/hw/pci-bridge/pcie_pci_bridge.c
> +++ b/hw/pci-bridge/pcie_pci_bridge.c
> @@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>  }
>  
> +static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
> +                                      DeviceState *dev, Error **errp)
> +{
> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
> +
> +    if (!shpc_present(pci_hotplug_dev)) {
> +        error_setg(errp, "standard hotplug controller has been disabled for "
> +                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);
> +        return;
> +    }
> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
> +}
> +
>  static void pcie_pci_bridge_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                                DeviceState *dev, Error **errp)
>  {
> @@ -180,6 +193,7 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass, void *data)
>      dc->reset = &pcie_pci_bridge_reset;
>      set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>      hc->plug = pcie_pci_bridge_plug_cb;
> +    hc->unplug = pcie_pci_bridge_unplug_cb;
>      hc->unplug_request = pcie_pci_bridge_unplug_request_cb;
>  }
>  
> diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
> index 098ffaef1d..5de905cb56 100644
> --- a/hw/pci/shpc.c
> +++ b/hw/pci/shpc.c
> @@ -238,6 +238,7 @@ static void shpc_invalid_command(SHPCDevice *shpc)
>  
>  static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
>  {
> +    HotplugHandler *hotplug_ctrl;
>      int devfn;
>      int pci_slot = SHPC_IDX_TO_PCI(slot);
>      for (devfn = PCI_DEVFN(pci_slot, 0);
> @@ -245,7 +246,9 @@ static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
>           ++devfn) {
>          PCIDevice *affected_dev = shpc->sec_bus->devices[devfn];
>          if (affected_dev) {
> -            object_unparent(OBJECT(affected_dev));
> +            hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(affected_dev));
> +            hotplug_handler_unplug(hotplug_ctrl, DEVICE(affected_dev),
> +                                   &error_abort);
>          }
>      }
>  }
> @@ -540,6 +543,12 @@ void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>      shpc_interrupt_update(pci_hotplug_dev);
>  }
>  
> +void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> +                           Error **errp)
> +{
> +    object_unparent(OBJECT(dev));
> +}
> +
>  void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                     DeviceState *dev, Error **errp)
>  {
> diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
> index 71293aca58..18f6ec1cd5 100644
> --- a/include/hw/pci/shpc.h
> +++ b/include/hw/pci/shpc.h
> @@ -47,6 +47,8 @@ void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);
>  
>  void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>                           Error **errp);
> +void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> +                           Error **errp);
>  void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                     DeviceState *dev, Error **errp);
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson
Re: [Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by Igor Mammedov 6 years, 11 months ago
On Mon,  5 Nov 2018 11:20:43 +0100
David Hildenbrand <david@redhat.com> wrote:

> Introduce and use the "unplug" callback.
> 
> This is a preparation for multi-stage hotplug handlers, whereby the bus
> hotplug handler is overwritten by the machine hotplug handler. This handler
> will then pass control to the bus hotplug handler. So to get this running
> cleanly, we also have to make sure to go via the hotplug handler chain when
> actually unplugging a device after an unplug request. Lookup the hotplug
> handler and call "unplug".
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  hw/pci-bridge/pci_bridge_dev.c  | 14 ++++++++++++++
>  hw/pci-bridge/pcie_pci_bridge.c | 14 ++++++++++++++
>  hw/pci/shpc.c                   | 11 ++++++++++-
>  include/hw/pci/shpc.h           |  2 ++
>  4 files changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
> index e1df9a52ac..91415f114c 100644
> --- a/hw/pci-bridge/pci_bridge_dev.c
> +++ b/hw/pci-bridge/pci_bridge_dev.c
> @@ -219,6 +219,19 @@ static void pci_bridge_dev_plug_cb(HotplugHandler *hotplug_dev,
>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>  }
>  
> +static void pci_bridge_dev_unplug_cb(HotplugHandler *hotplug_dev,
> +                                     DeviceState *dev, Error **errp)
> +{
> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
> +
> +    if (!shpc_present(pci_hotplug_dev)) {
> +        error_setg(errp, "standard hotplug controller has been disabled for "
> +                   "this %s", TYPE_PCI_BRIDGE_DEV);
> +        return;
> +    }
> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
> +}
> +
>  static void pci_bridge_dev_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                               DeviceState *dev, Error **errp)
>  {
> @@ -251,6 +264,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &pci_bridge_dev_vmstate;
>      set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>      hc->plug = pci_bridge_dev_plug_cb;
> +    hc->unplug = pci_bridge_dev_unplug_cb;
>      hc->unplug_request = pci_bridge_dev_unplug_request_cb;
>  }
>  
> diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
> index c634353b06..7c667bc97c 100644
> --- a/hw/pci-bridge/pcie_pci_bridge.c
> +++ b/hw/pci-bridge/pcie_pci_bridge.c
> @@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>  }
>  
> +static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
> +                                      DeviceState *dev, Error **errp)
> +{
> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
> +
> +    if (!shpc_present(pci_hotplug_dev)) {
> +        error_setg(errp, "standard hotplug controller has been disabled for "
> +                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);
Is it possible to reach here at all?

> +        return;
> +    }
> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
> +}

you probably can share this function impl. with pci_bridge_dev_unplug_cb()
if you use object_get_typename().



> +
>  static void pcie_pci_bridge_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                                DeviceState *dev, Error **errp)
>  {
> @@ -180,6 +193,7 @@ static void pcie_pci_bridge_class_init(ObjectClass *klass, void *data)
>      dc->reset = &pcie_pci_bridge_reset;
>      set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>      hc->plug = pcie_pci_bridge_plug_cb;
> +    hc->unplug = pcie_pci_bridge_unplug_cb;
>      hc->unplug_request = pcie_pci_bridge_unplug_request_cb;
>  }
>  
> diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
> index 098ffaef1d..5de905cb56 100644
> --- a/hw/pci/shpc.c
> +++ b/hw/pci/shpc.c
> @@ -238,6 +238,7 @@ static void shpc_invalid_command(SHPCDevice *shpc)
>  
>  static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
>  {
> +    HotplugHandler *hotplug_ctrl;
>      int devfn;
>      int pci_slot = SHPC_IDX_TO_PCI(slot);
>      for (devfn = PCI_DEVFN(pci_slot, 0);
> @@ -245,7 +246,9 @@ static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
>           ++devfn) {
>          PCIDevice *affected_dev = shpc->sec_bus->devices[devfn];
>          if (affected_dev) {
> -            object_unparent(OBJECT(affected_dev));
> +            hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(affected_dev));
> +            hotplug_handler_unplug(hotplug_ctrl, DEVICE(affected_dev),
> +                                   &error_abort);
>
>          }
>      }
>  }
> @@ -540,6 +543,12 @@ void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>      shpc_interrupt_update(pci_hotplug_dev);
>  }
>  
> +void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> +                           Error **errp)
> +{
> +    object_unparent(OBJECT(dev));
> +}
> +
>  void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                     DeviceState *dev, Error **errp)
>  {
> diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
> index 71293aca58..18f6ec1cd5 100644
> --- a/include/hw/pci/shpc.h
> +++ b/include/hw/pci/shpc.h
> @@ -47,6 +47,8 @@ void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);
>  
>  void shpc_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>                           Error **errp);
> +void shpc_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> +                           Error **errp);
>  void shpc_device_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                     DeviceState *dev, Error **errp);
>  


Re: [Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by David Hildenbrand 6 years, 11 months ago
>> diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
>> index c634353b06..7c667bc97c 100644
>> --- a/hw/pci-bridge/pcie_pci_bridge.c
>> +++ b/hw/pci-bridge/pcie_pci_bridge.c
>> @@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
>>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>>  }
>>  
>> +static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
>> +                                      DeviceState *dev, Error **errp)
>> +{
>> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
>> +
>> +    if (!shpc_present(pci_hotplug_dev)) {
>> +        error_setg(errp, "standard hotplug controller has been disabled for "
>> +                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);
> Is it possible to reach here at all?

Right, this should right now not be possible. I'll turn this into an

g_assert(shpc_present(pci_hotplug_dev));

(if we every support surprise removal, we'll have to rethink either way)

> 
>> +        return;
>> +    }
>> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
>> +}
> 
> you probably can share this function impl. with pci_bridge_dev_unplug_cb()
> if you use object_get_typename().

The same holds for all three functions (+ later pre_plug), however can
we be sure there won't be differences in the near future?

If we don't expect these functions to differ, I can add a patch to
factor the existing two functions (plug/unplug) out.

-- 

Thanks,

David / dhildenb

Re: [Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by Igor Mammedov 6 years, 11 months ago
On Tue, 20 Nov 2018 11:11:46 +0100
David Hildenbrand <david@redhat.com> wrote:

> >> diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
> >> index c634353b06..7c667bc97c 100644
> >> --- a/hw/pci-bridge/pcie_pci_bridge.c
> >> +++ b/hw/pci-bridge/pcie_pci_bridge.c
> >> @@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
> >>      shpc_device_plug_cb(hotplug_dev, dev, errp);
> >>  }
> >>  
> >> +static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
> >> +                                      DeviceState *dev, Error **errp)
> >> +{
> >> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
> >> +
> >> +    if (!shpc_present(pci_hotplug_dev)) {
> >> +        error_setg(errp, "standard hotplug controller has been disabled for "
> >> +                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);  
> > Is it possible to reach here at all?  
> 
> Right, this should right now not be possible. I'll turn this into an
> 
> g_assert(shpc_present(pci_hotplug_dev));
> 
> (if we every support surprise removal, we'll have to rethink either way)
> 
> >   
> >> +        return;
> >> +    }
> >> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
> >> +}  
> > 
> > you probably can share this function impl. with pci_bridge_dev_unplug_cb()
> > if you use object_get_typename().  
> 
> The same holds for all three functions (+ later pre_plug), however can
> we be sure there won't be differences in the near future?
> 
> If we don't expect these functions to differ, I can add a patch to
> factor the existing two functions (plug/unplug) out.
I'm not sure if they will differ or not in future,
but right now it looks as premature splitting.
It might be better to have a single function now and split it later
when it is necessary.


Re: [Qemu-devel] [PATCH v2 09/10] pci/shpc: perform unplug via the hotplug handler
Posted by David Hildenbrand 6 years, 11 months ago
On 20.11.18 15:13, Igor Mammedov wrote:
> On Tue, 20 Nov 2018 11:11:46 +0100
> David Hildenbrand <david@redhat.com> wrote:
> 
>>>> diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
>>>> index c634353b06..7c667bc97c 100644
>>>> --- a/hw/pci-bridge/pcie_pci_bridge.c
>>>> +++ b/hw/pci-bridge/pcie_pci_bridge.c
>>>> @@ -150,6 +150,19 @@ static void pcie_pci_bridge_plug_cb(HotplugHandler *hotplug_dev,
>>>>      shpc_device_plug_cb(hotplug_dev, dev, errp);
>>>>  }
>>>>  
>>>> +static void pcie_pci_bridge_unplug_cb(HotplugHandler *hotplug_dev,
>>>> +                                      DeviceState *dev, Error **errp)
>>>> +{
>>>> +    PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
>>>> +
>>>> +    if (!shpc_present(pci_hotplug_dev)) {
>>>> +        error_setg(errp, "standard hotplug controller has been disabled for "
>>>> +                   "this %s", TYPE_PCIE_PCI_BRIDGE_DEV);  
>>> Is it possible to reach here at all?  
>>
>> Right, this should right now not be possible. I'll turn this into an
>>
>> g_assert(shpc_present(pci_hotplug_dev));
>>
>> (if we every support surprise removal, we'll have to rethink either way)
>>
>>>   
>>>> +        return;
>>>> +    }
>>>> +    shpc_device_unplug_cb(hotplug_dev, dev, errp);
>>>> +}  
>>>
>>> you probably can share this function impl. with pci_bridge_dev_unplug_cb()
>>> if you use object_get_typename().  
>>
>> The same holds for all three functions (+ later pre_plug), however can
>> we be sure there won't be differences in the near future?
>>
>> If we don't expect these functions to differ, I can add a patch to
>> factor the existing two functions (plug/unplug) out.
> I'm not sure if they will differ or not in future,
> but right now it looks as premature splitting.
> It might be better to have a single function now and split it later
> when it is necessary.
> 

Indeed, I already went ahead and sent a new version including the
suggested re-factoring.

Thanks!

-- 

Thanks,

David / dhildenb