diff mbox series

[v1,2/4] s390x/zpci: use hotplug_dev instead of looking up the host bridge

Message ID 20181105110313.29312-3-david@redhat.com
State New
Headers show
Series s390x/zpci: some hotplug handler cleanups | expand

Commit Message

David Hildenbrand Nov. 5, 2018, 11:03 a.m. UTC
We directly have it in our hands.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-pci-bus.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Cornelia Huck Nov. 5, 2018, 11:21 a.m. UTC | #1
On Mon,  5 Nov 2018 12:03:11 +0100
David Hildenbrand <david@redhat.com> wrote:

> We directly have it in our hands.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  hw/s390x/s390-pci-bus.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index 1eaae3aca6..68660eac74 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>                                Error **errp)
>  {
> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>      PCIDevice *pdev = NULL;
>      S390PCIBusDevice *pbdev = NULL;
> -    S390pciState *s = s390_get_phb();
>  
>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>          BusState *bus;
> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>                                  Error **errp)
>  {
> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>      PCIDevice *pci_dev = NULL;
>      PCIBus *bus;
>      int32_t devfn;
>      S390PCIBusDevice *pbdev = NULL;
> -    S390pciState *s = s390_get_phb();
>  
>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>          error_setg(errp, "PCI bridge hot unplug currently not supported");

Not sure whether that is an improvement (s390_get_phb() caches the
value, and is called from multiple other places as well.)
David Hildenbrand Nov. 5, 2018, 11:37 a.m. UTC | #2
On 05.11.18 12:21, Cornelia Huck wrote:
> On Mon,  5 Nov 2018 12:03:11 +0100
> David Hildenbrand <david@redhat.com> wrote:
> 
>> We directly have it in our hands.
>>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>>  hw/s390x/s390-pci-bus.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>> index 1eaae3aca6..68660eac74 100644
>> --- a/hw/s390x/s390-pci-bus.c
>> +++ b/hw/s390x/s390-pci-bus.c
>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>                                Error **errp)
>>  {
>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>      PCIDevice *pdev = NULL;
>>      S390PCIBusDevice *pbdev = NULL;
>> -    S390pciState *s = s390_get_phb();
>>  
>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>          BusState *bus;
>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>                                  Error **errp)
>>  {
>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>      PCIDevice *pci_dev = NULL;
>>      PCIBus *bus;
>>      int32_t devfn;
>>      S390PCIBusDevice *pbdev = NULL;
>> -    S390pciState *s = s390_get_phb();
>>  
>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>          error_setg(errp, "PCI bridge hot unplug currently not supported");
> 
> Not sure whether that is an improvement (s390_get_phb() caches the
> value, and is called from multiple other places as well.)
> 

Looking up a variable that is directly passed as an argument doesn't
look clean to me.
Christian Borntraeger Nov. 5, 2018, 11:40 a.m. UTC | #3
On 11/05/2018 12:37 PM, David Hildenbrand wrote:
> On 05.11.18 12:21, Cornelia Huck wrote:
>> On Mon,  5 Nov 2018 12:03:11 +0100
>> David Hildenbrand <david@redhat.com> wrote:
>>
>>> We directly have it in our hands.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>>  hw/s390x/s390-pci-bus.c | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>> index 1eaae3aca6..68660eac74 100644
>>> --- a/hw/s390x/s390-pci-bus.c
>>> +++ b/hw/s390x/s390-pci-bus.c
>>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>                                Error **errp)
>>>  {
>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>      PCIDevice *pdev = NULL;
>>>      S390PCIBusDevice *pbdev = NULL;
>>> -    S390pciState *s = s390_get_phb();
>>>  
>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>          BusState *bus;
>>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>                                  Error **errp)
>>>  {
>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>      PCIDevice *pci_dev = NULL;
>>>      PCIBus *bus;
>>>      int32_t devfn;
>>>      S390PCIBusDevice *pbdev = NULL;
>>> -    S390pciState *s = s390_get_phb();
>>>  
>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>          error_setg(errp, "PCI bridge hot unplug currently not supported");
>>
>> Not sure whether that is an improvement (s390_get_phb() caches the
>> value, and is called from multiple other places as well.)
>>
> 
> Looking up a variable that is directly passed as an argument doesn't
> look clean to me.

I think there was a reason for this caching, namely that qom resolution can
be quite expensive. For the hotplug case this obviously does not matter but
for all the other cases it might. So do we really want to have different 
places use different methods?
David Hildenbrand Nov. 5, 2018, 11:50 a.m. UTC | #4
On 05.11.18 12:40, Christian Borntraeger wrote:
> 
> 
> On 11/05/2018 12:37 PM, David Hildenbrand wrote:
>> On 05.11.18 12:21, Cornelia Huck wrote:
>>> On Mon,  5 Nov 2018 12:03:11 +0100
>>> David Hildenbrand <david@redhat.com> wrote:
>>>
>>>> We directly have it in our hands.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  hw/s390x/s390-pci-bus.c | 4 ++--
>>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>> index 1eaae3aca6..68660eac74 100644
>>>> --- a/hw/s390x/s390-pci-bus.c
>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>>>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>                                Error **errp)
>>>>  {
>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>      PCIDevice *pdev = NULL;
>>>>      S390PCIBusDevice *pbdev = NULL;
>>>> -    S390pciState *s = s390_get_phb();
>>>>  
>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>          BusState *bus;
>>>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>>>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>                                  Error **errp)
>>>>  {
>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>      PCIDevice *pci_dev = NULL;
>>>>      PCIBus *bus;
>>>>      int32_t devfn;
>>>>      S390PCIBusDevice *pbdev = NULL;
>>>> -    S390pciState *s = s390_get_phb();
>>>>  
>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>          error_setg(errp, "PCI bridge hot unplug currently not supported");
>>>
>>> Not sure whether that is an improvement (s390_get_phb() caches the
>>> value, and is called from multiple other places as well.)
>>>
>>
>> Looking up a variable that is directly passed as an argument doesn't
>> look clean to me.
> 
> I think there was a reason for this caching, namely that qom resolution can
> be quite expensive. For the hotplug case this obviously does not matter but
> for all the other cases it might. So do we really want to have different 
> places use different methods?
> 

Caching resolution is fine (as that is expensive), caching a downcast is
as far as I remember not necessary. Especially, as you said, for hotplug
handlers.

Anyhow, if there are strong feelings to this change, I can drop this
patch. There are certainly more important things to do in zPCI hotplug code.
Collin Walling Nov. 7, 2018, 8:28 p.m. UTC | #5
On 11/5/18 6:50 AM, David Hildenbrand wrote:
> On 05.11.18 12:40, Christian Borntraeger wrote:
>>
>>
>> On 11/05/2018 12:37 PM, David Hildenbrand wrote:
>>> On 05.11.18 12:21, Cornelia Huck wrote:
>>>> On Mon,  5 Nov 2018 12:03:11 +0100
>>>> David Hildenbrand <david@redhat.com> wrote:
>>>>
>>>>> We directly have it in our hands.
>>>>>
>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>> ---
>>>>>  hw/s390x/s390-pci-bus.c | 4 ++--
>>>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>>> index 1eaae3aca6..68660eac74 100644
>>>>> --- a/hw/s390x/s390-pci-bus.c
>>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>>>>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>                                Error **errp)
>>>>>  {
>>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>      PCIDevice *pdev = NULL;
>>>>>      S390PCIBusDevice *pbdev = NULL;
>>>>> -    S390pciState *s = s390_get_phb();
>>>>>  
>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>>          BusState *bus;
>>>>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>>>>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>                                  Error **errp)
>>>>>  {
>>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>      PCIDevice *pci_dev = NULL;
>>>>>      PCIBus *bus;
>>>>>      int32_t devfn;
>>>>>      S390PCIBusDevice *pbdev = NULL;
>>>>> -    S390pciState *s = s390_get_phb();
>>>>>  
>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>>          error_setg(errp, "PCI bridge hot unplug currently not supported");
>>>>
>>>> Not sure whether that is an improvement (s390_get_phb() caches the
>>>> value, and is called from multiple other places as well.)
>>>>
>>>
>>> Looking up a variable that is directly passed as an argument doesn't
>>> look clean to me.
>>
>> I think there was a reason for this caching, namely that qom resolution can
>> be quite expensive. For the hotplug case this obviously does not matter but
>> for all the other cases it might. So do we really want to have different 
>> places use different methods?
>>
> 
> Caching resolution is fine (as that is expensive), caching a downcast is
> as far as I remember not necessary. Especially, as you said, for hotplug
> handlers.
> 
> Anyhow, if there are strong feelings to this change, I can drop this
> patch. There are certainly more important things to do in zPCI hotplug code.
> 
> 

Truthfully, I'm not in favor of one over the other. As long as the device handlers
are consistent, I think either is fine.

However, it would be nice if at some point during plug we cache the PHB somewhere.
That would be some sort of best-of-both-worlds approach.
Cornelia Huck Nov. 8, 2018, 11:07 a.m. UTC | #6
On Wed, 7 Nov 2018 15:28:31 -0500
Collin Walling <walling@linux.ibm.com> wrote:

> On 11/5/18 6:50 AM, David Hildenbrand wrote:
> > On 05.11.18 12:40, Christian Borntraeger wrote:  
> >>
> >>
> >> On 11/05/2018 12:37 PM, David Hildenbrand wrote:  
> >>> On 05.11.18 12:21, Cornelia Huck wrote:  
> >>>> On Mon,  5 Nov 2018 12:03:11 +0100
> >>>> David Hildenbrand <david@redhat.com> wrote:
> >>>>  
> >>>>> We directly have it in our hands.
> >>>>>
> >>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>>>> ---
> >>>>>  hw/s390x/s390-pci-bus.c | 4 ++--
> >>>>>  1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>>
> >>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> >>>>> index 1eaae3aca6..68660eac74 100644
> >>>>> --- a/hw/s390x/s390-pci-bus.c
> >>>>> +++ b/hw/s390x/s390-pci-bus.c
> >>>>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
> >>>>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
> >>>>>                                Error **errp)
> >>>>>  {
> >>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
> >>>>>      PCIDevice *pdev = NULL;
> >>>>>      S390PCIBusDevice *pbdev = NULL;
> >>>>> -    S390pciState *s = s390_get_phb();
> >>>>>  
> >>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
> >>>>>          BusState *bus;
> >>>>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
> >>>>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
> >>>>>                                  Error **errp)
> >>>>>  {
> >>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
> >>>>>      PCIDevice *pci_dev = NULL;
> >>>>>      PCIBus *bus;
> >>>>>      int32_t devfn;
> >>>>>      S390PCIBusDevice *pbdev = NULL;
> >>>>> -    S390pciState *s = s390_get_phb();
> >>>>>  
> >>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
> >>>>>          error_setg(errp, "PCI bridge hot unplug currently not supported");  
> >>>>
> >>>> Not sure whether that is an improvement (s390_get_phb() caches the
> >>>> value, and is called from multiple other places as well.)
> >>>>  
> >>>
> >>> Looking up a variable that is directly passed as an argument doesn't
> >>> look clean to me.  
> >>
> >> I think there was a reason for this caching, namely that qom resolution can
> >> be quite expensive. For the hotplug case this obviously does not matter but
> >> for all the other cases it might. So do we really want to have different 
> >> places use different methods?
> >>  
> > 
> > Caching resolution is fine (as that is expensive), caching a downcast is
> > as far as I remember not necessary. Especially, as you said, for hotplug
> > handlers.

Yes, the complete QOM cast was the expensive thing AFAIR.

> > 
> > Anyhow, if there are strong feelings to this change, I can drop this
> > patch. There are certainly more important things to do in zPCI hotplug code.
> > 
> >   
> 
> Truthfully, I'm not in favor of one over the other. As long as the device handlers
> are consistent, I think either is fine.

I don't feel *that* strong about this change here, either :) Your call.

> 
> However, it would be nice if at some point during plug we cache the PHB somewhere.
> That would be some sort of best-of-both-worlds approach.

Not sure if caching-from-a-downcast would be conceptionally clean. I'd
vote for either taking this patch or dropping it completely.
David Hildenbrand Nov. 8, 2018, 11:56 a.m. UTC | #7
On 08.11.18 12:07, Cornelia Huck wrote:
> On Wed, 7 Nov 2018 15:28:31 -0500
> Collin Walling <walling@linux.ibm.com> wrote:
> 
>> On 11/5/18 6:50 AM, David Hildenbrand wrote:
>>> On 05.11.18 12:40, Christian Borntraeger wrote:  
>>>>
>>>>
>>>> On 11/05/2018 12:37 PM, David Hildenbrand wrote:  
>>>>> On 05.11.18 12:21, Cornelia Huck wrote:  
>>>>>> On Mon,  5 Nov 2018 12:03:11 +0100
>>>>>> David Hildenbrand <david@redhat.com> wrote:
>>>>>>  
>>>>>>> We directly have it in our hands.
>>>>>>>
>>>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>>>> ---
>>>>>>>  hw/s390x/s390-pci-bus.c | 4 ++--
>>>>>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>>>>> index 1eaae3aca6..68660eac74 100644
>>>>>>> --- a/hw/s390x/s390-pci-bus.c
>>>>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>>>>> @@ -814,9 +814,9 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
>>>>>>>  static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>>>                                Error **errp)
>>>>>>>  {
>>>>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>>>      PCIDevice *pdev = NULL;
>>>>>>>      S390PCIBusDevice *pbdev = NULL;
>>>>>>> -    S390pciState *s = s390_get_phb();
>>>>>>>  
>>>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>>>>          BusState *bus;
>>>>>>> @@ -924,11 +924,11 @@ static void s390_pcihost_timer_cb(void *opaque)
>>>>>>>  static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>>>                                  Error **errp)
>>>>>>>  {
>>>>>>> +    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>>>      PCIDevice *pci_dev = NULL;
>>>>>>>      PCIBus *bus;
>>>>>>>      int32_t devfn;
>>>>>>>      S390PCIBusDevice *pbdev = NULL;
>>>>>>> -    S390pciState *s = s390_get_phb();
>>>>>>>  
>>>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
>>>>>>>          error_setg(errp, "PCI bridge hot unplug currently not supported");  
>>>>>>
>>>>>> Not sure whether that is an improvement (s390_get_phb() caches the
>>>>>> value, and is called from multiple other places as well.)
>>>>>>  
>>>>>
>>>>> Looking up a variable that is directly passed as an argument doesn't
>>>>> look clean to me.  
>>>>
>>>> I think there was a reason for this caching, namely that qom resolution can
>>>> be quite expensive. For the hotplug case this obviously does not matter but
>>>> for all the other cases it might. So do we really want to have different 
>>>> places use different methods?
>>>>  
>>>
>>> Caching resolution is fine (as that is expensive), caching a downcast is
>>> as far as I remember not necessary. Especially, as you said, for hotplug
>>> handlers.
> 
> Yes, the complete QOM cast was the expensive thing AFAIR.
> 
>>>
>>> Anyhow, if there are strong feelings to this change, I can drop this
>>> patch. There are certainly more important things to do in zPCI hotplug code.
>>>
>>>   
>>
>> Truthfully, I'm not in favor of one over the other. As long as the device handlers
>> are consistent, I think either is fine.
> 
> I don't feel *that* strong about this change here, either :) Your call.
> 
>>
>> However, it would be nice if at some point during plug we cache the PHB somewhere.
>> That would be some sort of best-of-both-worlds approach.
> 
> Not sure if caching-from-a-downcast would be conceptionally clean. I'd
> vote for either taking this patch or dropping it completely.
> 

Yes, caching at that point, I would consider premature optimization.

I'll drag this patch along and let the maintainers decide what to do :)

(later we should forward the actual value to e.g. event injection code,
so we don't have to look it up multiple times during one call)
diff mbox series

Patch

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 1eaae3aca6..68660eac74 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -814,9 +814,9 @@  static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
 static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                               Error **errp)
 {
+    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
     PCIDevice *pdev = NULL;
     S390PCIBusDevice *pbdev = NULL;
-    S390pciState *s = s390_get_phb();
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
         BusState *bus;
@@ -924,11 +924,11 @@  static void s390_pcihost_timer_cb(void *opaque)
 static void s390_pcihost_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                 Error **errp)
 {
+    S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
     PCIDevice *pci_dev = NULL;
     PCIBus *bus;
     int32_t devfn;
     S390PCIBusDevice *pbdev = NULL;
-    S390pciState *s = s390_get_phb();
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
         error_setg(errp, "PCI bridge hot unplug currently not supported");