diff mbox series

[v1] s390x/pci: Warn when adding PCI devices without the 'zpci' feature

Message ID 20190122094143.8857-1-david@redhat.com
State New
Headers show
Series [v1] s390x/pci: Warn when adding PCI devices without the 'zpci' feature | expand

Commit Message

David Hildenbrand Jan. 22, 2019, 9:41 a.m. UTC
We decided to always create the PCI host bridge, even if 'zpci' is not
enabled (due to migration compatibility). This however right now allows
to add zPCI/PCI devices to a VM although the guest will never actually see
them, confusing people that are using a simple CPU model that has no
'zpci' enabled - "Why isn't this working" (David Hildenbrand)

Let's check for 'zpci' and at least print a warning that this will not
work as expected. We could also bail out, however that might break
existing QEMU commandlines.

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

Comments

Thomas Huth Jan. 22, 2019, 9:50 a.m. UTC | #1
On 2019-01-22 10:41, David Hildenbrand wrote:
> We decided to always create the PCI host bridge, even if 'zpci' is not
> enabled (due to migration compatibility).

Couldn't we disable the host bridge for newer machine types, and just
create it on the old ones for migration compatibility?

> This however right now allows
> to add zPCI/PCI devices to a VM although the guest will never actually see
> them, confusing people that are using a simple CPU model that has no
> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> 
> Let's check for 'zpci' and at least print a warning that this will not
> work as expected. We could also bail out, however that might break
> existing QEMU commandlines.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  hw/s390x/s390-pci-bus.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index b86a8bdcd4..e7d4f49611 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>  {
>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>  
> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> +                    " The guest will not be able to see/use these devices.");
> +    }

I think it would be better to bail out. The hotplug clearly can not work
in this case, and the warn report might go unnoticed, so blocking the
hotplug process is likely better to get the attention of the user.

 Thomas
David Hildenbrand Jan. 22, 2019, 10:06 a.m. UTC | #2
On 22.01.19 10:50, Thomas Huth wrote:
> On 2019-01-22 10:41, David Hildenbrand wrote:
>> We decided to always create the PCI host bridge, even if 'zpci' is not
>> enabled (due to migration compatibility).
> 
> Couldn't we disable the host bridge for newer machine types, and just
> create it on the old ones for migration compatibility?

I think we can with a compat property. However I somewhat dislike that
the error/warning will then be "no bus" vs. "zpci CPU feature not
enabled". Somebody who has no idea about that will think he somehow has
to create a PCI bus on the QEMU comandline.

... however

> 
>> This however right now allows
>> to add zPCI/PCI devices to a VM although the guest will never actually see
>> them, confusing people that are using a simple CPU model that has no
>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>
>> Let's check for 'zpci' and at least print a warning that this will not
>> work as expected. We could also bail out, however that might break
>> existing QEMU commandlines.
>>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>> index b86a8bdcd4..e7d4f49611 100644
>> --- a/hw/s390x/s390-pci-bus.c
>> +++ b/hw/s390x/s390-pci-bus.c
>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>  {
>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>  
>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>> +                    " The guest will not be able to see/use these devices.");
>> +    }
> 
> I think it would be better to bail out. The hotplug clearly can not work
> in this case, and the warn report might go unnoticed, so blocking the
> hotplug process is likely better to get the attention of the user.

... we could also create the bus but bail out here in case the compat
property strikes (a.k.a. new QEMO machine type).

Thanks!

> 
>  Thomas
>
Cornelia Huck Jan. 22, 2019, 12:44 p.m. UTC | #3
On Tue, 22 Jan 2019 10:41:43 +0100
David Hildenbrand <david@redhat.com> wrote:

> We decided to always create the PCI host bridge, even if 'zpci' is not
> enabled (due to migration compatibility). This however right now allows
> to add zPCI/PCI devices to a VM although the guest will never actually see
> them, confusing people that are using a simple CPU model that has no
> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> 
> Let's check for 'zpci' and at least print a warning that this will not
> work as expected. We could also bail out, however that might break
> existing QEMU commandlines.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  hw/s390x/s390-pci-bus.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index b86a8bdcd4..e7d4f49611 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>  {
>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>  
> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> +                    " The guest will not be able to see/use these devices.");
> +    }
> +
>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>          PCIDevice *pdev = PCI_DEVICE(dev);
>  

That's hotplug only, isn't it? IIRC coldplugging already fails?
David Hildenbrand Jan. 22, 2019, 12:52 p.m. UTC | #4
On 22.01.19 13:44, Cornelia Huck wrote:
> On Tue, 22 Jan 2019 10:41:43 +0100
> David Hildenbrand <david@redhat.com> wrote:
> 
>> We decided to always create the PCI host bridge, even if 'zpci' is not
>> enabled (due to migration compatibility). This however right now allows
>> to add zPCI/PCI devices to a VM although the guest will never actually see
>> them, confusing people that are using a simple CPU model that has no
>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>
>> Let's check for 'zpci' and at least print a warning that this will not
>> work as expected. We could also bail out, however that might break
>> existing QEMU commandlines.
>>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>> index b86a8bdcd4..e7d4f49611 100644
>> --- a/hw/s390x/s390-pci-bus.c
>> +++ b/hw/s390x/s390-pci-bus.c
>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>  {
>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>  
>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>> +                    " The guest will not be able to see/use these devices.");
>> +    }
>> +
>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>>          PCIDevice *pdev = PCI_DEVICE(dev);
>>  
> 
> That's hotplug only, isn't it? IIRC coldplugging already fails?
> 

No, applies also to coldplugging.
Cornelia Huck Jan. 22, 2019, 1:13 p.m. UTC | #5
On Tue, 22 Jan 2019 11:06:46 +0100
David Hildenbrand <david@redhat.com> wrote:

> On 22.01.19 10:50, Thomas Huth wrote:
> > On 2019-01-22 10:41, David Hildenbrand wrote:  
> >> We decided to always create the PCI host bridge, even if 'zpci' is not
> >> enabled (due to migration compatibility).  
> > 
> > Couldn't we disable the host bridge for newer machine types, and just
> > create it on the old ones for migration compatibility?  

I very dimly remember some problems with that approach.

> 
> I think we can with a compat property. However I somewhat dislike that
> the error/warning will then be "no bus" vs. "zpci CPU feature not
> enabled". Somebody who has no idea about that will think he somehow has
> to create a PCI bus on the QEMU comandline.

Agreed, "zpci cpu feature not enabled" gives a much better clue.

> 
> ... however
> 
> >   
> >> This however right now allows
> >> to add zPCI/PCI devices to a VM although the guest will never actually see
> >> them, confusing people that are using a simple CPU model that has no
> >> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> >>
> >> Let's check for 'zpci' and at least print a warning that this will not
> >> work as expected. We could also bail out, however that might break
> >> existing QEMU commandlines.
> >>
> >> Signed-off-by: David Hildenbrand <david@redhat.com>
> >> ---
> >>  hw/s390x/s390-pci-bus.c | 5 +++++
> >>  1 file changed, 5 insertions(+)
> >>
> >> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> >> index b86a8bdcd4..e7d4f49611 100644
> >> --- a/hw/s390x/s390-pci-bus.c
> >> +++ b/hw/s390x/s390-pci-bus.c
> >> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
> >>  {
> >>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
> >>  
> >> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> >> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> >> +                    " The guest will not be able to see/use these devices.");
> >> +    }  
> > 
> > I think it would be better to bail out. The hotplug clearly can not work
> > in this case, and the warn report might go unnoticed, so blocking the
> > hotplug process is likely better to get the attention of the user.  
> 
> ... we could also create the bus but bail out here in case the compat
> property strikes (a.k.a. new QEMO machine type).

Now you confused me... why should failing be based on a compat property?
David Hildenbrand Jan. 22, 2019, 1:20 p.m. UTC | #6
On 22.01.19 14:13, Cornelia Huck wrote:
> On Tue, 22 Jan 2019 11:06:46 +0100
> David Hildenbrand <david@redhat.com> wrote:
> 
>> On 22.01.19 10:50, Thomas Huth wrote:
>>> On 2019-01-22 10:41, David Hildenbrand wrote:  
>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>>> enabled (due to migration compatibility).  
>>>
>>> Couldn't we disable the host bridge for newer machine types, and just
>>> create it on the old ones for migration compatibility?  
> 
> I very dimly remember some problems with that approach.
> 
>>
>> I think we can with a compat property. However I somewhat dislike that
>> the error/warning will then be "no bus" vs. "zpci CPU feature not
>> enabled". Somebody who has no idea about that will think he somehow has
>> to create a PCI bus on the QEMU comandline.
> 
> Agreed, "zpci cpu feature not enabled" gives a much better clue.
> 
>>
>> ... however
>>
>>>   
>>>> This however right now allows
>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>>> them, confusing people that are using a simple CPU model that has no
>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>>
>>>> Let's check for 'zpci' and at least print a warning that this will not
>>>> work as expected. We could also bail out, however that might break
>>>> existing QEMU commandlines.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>>  1 file changed, 5 insertions(+)
>>>>
>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>> index b86a8bdcd4..e7d4f49611 100644
>>>> --- a/hw/s390x/s390-pci-bus.c
>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>  {
>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>  
>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>>> +                    " The guest will not be able to see/use these devices.");
>>>> +    }  
>>>
>>> I think it would be better to bail out. The hotplug clearly can not work
>>> in this case, and the warn report might go unnoticed, so blocking the
>>> hotplug process is likely better to get the attention of the user.  
>>
>> ... we could also create the bus but bail out here in case the compat
>> property strikes (a.k.a. new QEMO machine type).
> 
> Now you confused me... why should failing be based on a compat property?
> 

Otherwise, a QEMU comandline that used to work (which could be created
by libvirt) would now fail. Are we ok with that?
Cornelia Huck Jan. 22, 2019, 1:23 p.m. UTC | #7
On Tue, 22 Jan 2019 14:20:27 +0100
David Hildenbrand <david@redhat.com> wrote:

> On 22.01.19 14:13, Cornelia Huck wrote:
> > On Tue, 22 Jan 2019 11:06:46 +0100
> > David Hildenbrand <david@redhat.com> wrote:
> >   
> >> On 22.01.19 10:50, Thomas Huth wrote:  
> >>> On 2019-01-22 10:41, David Hildenbrand wrote:    
> >>>> We decided to always create the PCI host bridge, even if 'zpci' is not
> >>>> enabled (due to migration compatibility).    
> >>>
> >>> Couldn't we disable the host bridge for newer machine types, and just
> >>> create it on the old ones for migration compatibility?    
> > 
> > I very dimly remember some problems with that approach.
> >   
> >>
> >> I think we can with a compat property. However I somewhat dislike that
> >> the error/warning will then be "no bus" vs. "zpci CPU feature not
> >> enabled". Somebody who has no idea about that will think he somehow has
> >> to create a PCI bus on the QEMU comandline.  
> > 
> > Agreed, "zpci cpu feature not enabled" gives a much better clue.
> >   
> >>
> >> ... however
> >>  
> >>>     
> >>>> This however right now allows
> >>>> to add zPCI/PCI devices to a VM although the guest will never actually see
> >>>> them, confusing people that are using a simple CPU model that has no
> >>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> >>>>
> >>>> Let's check for 'zpci' and at least print a warning that this will not
> >>>> work as expected. We could also bail out, however that might break
> >>>> existing QEMU commandlines.
> >>>>
> >>>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>>> ---
> >>>>  hw/s390x/s390-pci-bus.c | 5 +++++
> >>>>  1 file changed, 5 insertions(+)
> >>>>
> >>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> >>>> index b86a8bdcd4..e7d4f49611 100644
> >>>> --- a/hw/s390x/s390-pci-bus.c
> >>>> +++ b/hw/s390x/s390-pci-bus.c
> >>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
> >>>>  {
> >>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
> >>>>  
> >>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> >>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> >>>> +                    " The guest will not be able to see/use these devices.");
> >>>> +    }    
> >>>
> >>> I think it would be better to bail out. The hotplug clearly can not work
> >>> in this case, and the warn report might go unnoticed, so blocking the
> >>> hotplug process is likely better to get the attention of the user.    
> >>
> >> ... we could also create the bus but bail out here in case the compat
> >> property strikes (a.k.a. new QEMO machine type).  
> > 
> > Now you confused me... why should failing be based on a compat property?
> >   
> 
> Otherwise, a QEMU comandline that used to work (which could be created
> by libvirt) would now fail. Are we ok with that?
> 

I think we should not fail at all in that case, then. Or only for
hotplug, not for coldplug.
David Hildenbrand Jan. 22, 2019, 1:25 p.m. UTC | #8
On 22.01.19 14:23, Cornelia Huck wrote:
> On Tue, 22 Jan 2019 14:20:27 +0100
> David Hildenbrand <david@redhat.com> wrote:
> 
>> On 22.01.19 14:13, Cornelia Huck wrote:
>>> On Tue, 22 Jan 2019 11:06:46 +0100
>>> David Hildenbrand <david@redhat.com> wrote:
>>>   
>>>> On 22.01.19 10:50, Thomas Huth wrote:  
>>>>> On 2019-01-22 10:41, David Hildenbrand wrote:    
>>>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>>>>> enabled (due to migration compatibility).    
>>>>>
>>>>> Couldn't we disable the host bridge for newer machine types, and just
>>>>> create it on the old ones for migration compatibility?    
>>>
>>> I very dimly remember some problems with that approach.
>>>   
>>>>
>>>> I think we can with a compat property. However I somewhat dislike that
>>>> the error/warning will then be "no bus" vs. "zpci CPU feature not
>>>> enabled". Somebody who has no idea about that will think he somehow has
>>>> to create a PCI bus on the QEMU comandline.  
>>>
>>> Agreed, "zpci cpu feature not enabled" gives a much better clue.
>>>   
>>>>
>>>> ... however
>>>>  
>>>>>     
>>>>>> This however right now allows
>>>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>>>>> them, confusing people that are using a simple CPU model that has no
>>>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>>>>
>>>>>> Let's check for 'zpci' and at least print a warning that this will not
>>>>>> work as expected. We could also bail out, however that might break
>>>>>> existing QEMU commandlines.
>>>>>>
>>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>>> ---
>>>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>>>>  1 file changed, 5 insertions(+)
>>>>>>
>>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>>>> index b86a8bdcd4..e7d4f49611 100644
>>>>>> --- a/hw/s390x/s390-pci-bus.c
>>>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>>  {
>>>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>>  
>>>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>>>>> +                    " The guest will not be able to see/use these devices.");
>>>>>> +    }    
>>>>>
>>>>> I think it would be better to bail out. The hotplug clearly can not work
>>>>> in this case, and the warn report might go unnoticed, so blocking the
>>>>> hotplug process is likely better to get the attention of the user.    
>>>>
>>>> ... we could also create the bus but bail out here in case the compat
>>>> property strikes (a.k.a. new QEMO machine type).  
>>>
>>> Now you confused me... why should failing be based on a compat property?
>>>   
>>
>> Otherwise, a QEMU comandline that used to work (which could be created
>> by libvirt) would now fail. Are we ok with that?
>>
> 
> I think we should not fail at all in that case, then. Or only for
> hotplug, not for coldplug.
> 

We could fail on hotplug and warn on coldplug. This would keep existing
setups running.
Cornelia Huck Jan. 22, 2019, 1:30 p.m. UTC | #9
On Tue, 22 Jan 2019 14:25:07 +0100
David Hildenbrand <david@redhat.com> wrote:

> On 22.01.19 14:23, Cornelia Huck wrote:
> > On Tue, 22 Jan 2019 14:20:27 +0100
> > David Hildenbrand <david@redhat.com> wrote:
> >   
> >> On 22.01.19 14:13, Cornelia Huck wrote:  
> >>> On Tue, 22 Jan 2019 11:06:46 +0100
> >>> David Hildenbrand <david@redhat.com> wrote:
> >>>     
> >>>> On 22.01.19 10:50, Thomas Huth wrote:    
> >>>>> On 2019-01-22 10:41, David Hildenbrand wrote:      
> >>>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
> >>>>>> enabled (due to migration compatibility).      
> >>>>>
> >>>>> Couldn't we disable the host bridge for newer machine types, and just
> >>>>> create it on the old ones for migration compatibility?      
> >>>
> >>> I very dimly remember some problems with that approach.
> >>>     
> >>>>
> >>>> I think we can with a compat property. However I somewhat dislike that
> >>>> the error/warning will then be "no bus" vs. "zpci CPU feature not
> >>>> enabled". Somebody who has no idea about that will think he somehow has
> >>>> to create a PCI bus on the QEMU comandline.    
> >>>
> >>> Agreed, "zpci cpu feature not enabled" gives a much better clue.
> >>>     
> >>>>
> >>>> ... however
> >>>>    
> >>>>>       
> >>>>>> This however right now allows
> >>>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
> >>>>>> them, confusing people that are using a simple CPU model that has no
> >>>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> >>>>>>
> >>>>>> Let's check for 'zpci' and at least print a warning that this will not
> >>>>>> work as expected. We could also bail out, however that might break
> >>>>>> existing QEMU commandlines.
> >>>>>>
> >>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>>>>> ---
> >>>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
> >>>>>>  1 file changed, 5 insertions(+)
> >>>>>>
> >>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> >>>>>> index b86a8bdcd4..e7d4f49611 100644
> >>>>>> --- a/hw/s390x/s390-pci-bus.c
> >>>>>> +++ b/hw/s390x/s390-pci-bus.c
> >>>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
> >>>>>>  {
> >>>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
> >>>>>>  
> >>>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> >>>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> >>>>>> +                    " The guest will not be able to see/use these devices.");
> >>>>>> +    }      
> >>>>>
> >>>>> I think it would be better to bail out. The hotplug clearly can not work
> >>>>> in this case, and the warn report might go unnoticed, so blocking the
> >>>>> hotplug process is likely better to get the attention of the user.      
> >>>>
> >>>> ... we could also create the bus but bail out here in case the compat
> >>>> property strikes (a.k.a. new QEMO machine type).    
> >>>
> >>> Now you confused me... why should failing be based on a compat property?
> >>>     
> >>
> >> Otherwise, a QEMU comandline that used to work (which could be created
> >> by libvirt) would now fail. Are we ok with that?
> >>  
> > 
> > I think we should not fail at all in that case, then. Or only for
> > hotplug, not for coldplug.
> >   
> 
> We could fail on hotplug and warn on coldplug. This would keep existing
> setups running.
> 

Ok with me.
Christian Borntraeger Jan. 22, 2019, 3:03 p.m. UTC | #10
On 22.01.2019 13:52, David Hildenbrand wrote:
> On 22.01.19 13:44, Cornelia Huck wrote:
>> On Tue, 22 Jan 2019 10:41:43 +0100
>> David Hildenbrand <david@redhat.com> wrote:
>>
>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>> enabled (due to migration compatibility). This however right now allows
>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>> them, confusing people that are using a simple CPU model that has no
>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>
>>> Let's check for 'zpci' and at least print a warning that this will not
>>> work as expected. We could also bail out, however that might break
>>> existing QEMU commandlines.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>  1 file changed, 5 insertions(+)
>>>
>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>> index b86a8bdcd4..e7d4f49611 100644
>>> --- a/hw/s390x/s390-pci-bus.c
>>> +++ b/hw/s390x/s390-pci-bus.c
>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>  {
>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>  
>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>> +                    " The guest will not be able to see/use these devices.");
>>> +    }
>>> +
>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>>>          PCIDevice *pdev = PCI_DEVICE(dev);
>>>  
>>
>> That's hotplug only, isn't it? IIRC coldplugging already fails?
>>
> 
> No, applies also to coldplugging.

Back then we made this a conscious decision, because removing the bridge triggered a
lot of issues regarding migration. And the current behaviour actually is a good
match to the real hardware, there are PCI devices in the system that can not be used
by guests. I understand that this is kind of surprising, so I am fine with the warn_report
but I do not want to have a hard error right now.
David Hildenbrand Jan. 22, 2019, 3:11 p.m. UTC | #11
On 22.01.19 16:03, Christian Borntraeger wrote:
> 
> 
> On 22.01.2019 13:52, David Hildenbrand wrote:
>> On 22.01.19 13:44, Cornelia Huck wrote:
>>> On Tue, 22 Jan 2019 10:41:43 +0100
>>> David Hildenbrand <david@redhat.com> wrote:
>>>
>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>>> enabled (due to migration compatibility). This however right now allows
>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>>> them, confusing people that are using a simple CPU model that has no
>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>>
>>>> Let's check for 'zpci' and at least print a warning that this will not
>>>> work as expected. We could also bail out, however that might break
>>>> existing QEMU commandlines.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>>  1 file changed, 5 insertions(+)
>>>>
>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>> index b86a8bdcd4..e7d4f49611 100644
>>>> --- a/hw/s390x/s390-pci-bus.c
>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>  {
>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>  
>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>>> +                    " The guest will not be able to see/use these devices.");
>>>> +    }
>>>> +
>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>>>>          PCIDevice *pdev = PCI_DEVICE(dev);
>>>>  
>>>
>>> That's hotplug only, isn't it? IIRC coldplugging already fails?
>>>
>>
>> No, applies also to coldplugging.
> 
> Back then we made this a conscious decision, because removing the bridge triggered a
> lot of issues regarding migration. And the current behaviour actually is a good
> match to the real hardware, there are PCI devices in the system that can not be used
> by guests. I understand that this is kind of surprising, so I am fine with the warn_report
> but I do not want to have a hard error right now.
> 

So you agree to this patch, unmodified, correct? Thanks!
Thomas Huth Jan. 24, 2019, 2:56 p.m. UTC | #12
On 2019-01-22 16:11, David Hildenbrand wrote:
> On 22.01.19 16:03, Christian Borntraeger wrote:
>>
>>
>> On 22.01.2019 13:52, David Hildenbrand wrote:
>>> On 22.01.19 13:44, Cornelia Huck wrote:
>>>> On Tue, 22 Jan 2019 10:41:43 +0100
>>>> David Hildenbrand <david@redhat.com> wrote:
>>>>
>>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>>>> enabled (due to migration compatibility). This however right now allows
>>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>>>> them, confusing people that are using a simple CPU model that has no
>>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>>>
>>>>> Let's check for 'zpci' and at least print a warning that this will not
>>>>> work as expected. We could also bail out, however that might break
>>>>> existing QEMU commandlines.
>>>>>
>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>> ---
>>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>>>  1 file changed, 5 insertions(+)
>>>>>
>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>>> index b86a8bdcd4..e7d4f49611 100644
>>>>> --- a/hw/s390x/s390-pci-bus.c
>>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>  {
>>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>  
>>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>>>> +                    " The guest will not be able to see/use these devices.");
>>>>> +    }
>>>>> +
>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>>>>>          PCIDevice *pdev = PCI_DEVICE(dev);
>>>>>  
>>>>
>>>> That's hotplug only, isn't it? IIRC coldplugging already fails?
>>>>
>>>
>>> No, applies also to coldplugging.
>>
>> Back then we made this a conscious decision, because removing the bridge triggered a
>> lot of issues regarding migration. And the current behaviour actually is a good
>> match to the real hardware, there are PCI devices in the system that can not be used
>> by guests. I understand that this is kind of surprising, so I am fine with the warn_report
>> but I do not want to have a hard error right now.
> 
> So you agree to this patch, unmodified, correct? Thanks!

FWIW, it's fine for me:

Reviewed-by: Thomas Huth <thuth@redhat.com>
Cornelia Huck Jan. 28, 2019, 11:24 a.m. UTC | #13
On Tue, 22 Jan 2019 10:41:43 +0100
David Hildenbrand <david@redhat.com> wrote:

> We decided to always create the PCI host bridge, even if 'zpci' is not
> enabled (due to migration compatibility). This however right now allows
> to add zPCI/PCI devices to a VM although the guest will never actually see
> them, confusing people that are using a simple CPU model that has no
> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
> 
> Let's check for 'zpci' and at least print a warning that this will not
> work as expected. We could also bail out, however that might break
> existing QEMU commandlines.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  hw/s390x/s390-pci-bus.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index b86a8bdcd4..e7d4f49611 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>  {
>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>  
> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
> +                    " The guest will not be able to see/use these devices.");
> +    }
> +
>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>          PCIDevice *pdev = PCI_DEVICE(dev);
>  

So, it seems that the consensus was that this patch is fine in its
current shape, right? If so, can I please get an ack from the zpci
maintainer so I can queue it?
Christian Borntraeger Feb. 4, 2019, 1:31 p.m. UTC | #14
On 22.01.2019 16:11, David Hildenbrand wrote:
> On 22.01.19 16:03, Christian Borntraeger wrote:
>>
>>
>> On 22.01.2019 13:52, David Hildenbrand wrote:
>>> On 22.01.19 13:44, Cornelia Huck wrote:
>>>> On Tue, 22 Jan 2019 10:41:43 +0100
>>>> David Hildenbrand <david@redhat.com> wrote:
>>>>
>>>>> We decided to always create the PCI host bridge, even if 'zpci' is not
>>>>> enabled (due to migration compatibility). This however right now allows
>>>>> to add zPCI/PCI devices to a VM although the guest will never actually see
>>>>> them, confusing people that are using a simple CPU model that has no
>>>>> 'zpci' enabled - "Why isn't this working" (David Hildenbrand)
>>>>>
>>>>> Let's check for 'zpci' and at least print a warning that this will not
>>>>> work as expected. We could also bail out, however that might break
>>>>> existing QEMU commandlines.
>>>>>
>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>> ---
>>>>>  hw/s390x/s390-pci-bus.c | 5 +++++
>>>>>  1 file changed, 5 insertions(+)
>>>>>
>>>>> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
>>>>> index b86a8bdcd4..e7d4f49611 100644
>>>>> --- a/hw/s390x/s390-pci-bus.c
>>>>> +++ b/hw/s390x/s390-pci-bus.c
>>>>> @@ -863,6 +863,11 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
>>>>>  {
>>>>>      S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
>>>>>  
>>>>> +    if (!s390_has_feat(S390_FEAT_ZPCI)) {
>>>>> +        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
>>>>> +                    " The guest will not be able to see/use these devices.");
>>>>> +    }
>>>>> +
>>>>>      if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
>>>>>          PCIDevice *pdev = PCI_DEVICE(dev);
>>>>>  
>>>>
>>>> That's hotplug only, isn't it? IIRC coldplugging already fails?
>>>>
>>>
>>> No, applies also to coldplugging.
>>
>> Back then we made this a conscious decision, because removing the bridge triggered a
>> lot of issues regarding migration. And the current behaviour actually is a good
>> match to the real hardware, there are PCI devices in the system that can not be used
>> by guests. I understand that this is kind of surprising, so I am fine with the warn_report
>> but I do not want to have a hard error right now.
>>
> 
> So you agree to this patch, unmodified, correct? Thanks!

Sorry, somehow lost this mail. Yes.
diff mbox series

Patch

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index b86a8bdcd4..e7d4f49611 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -863,6 +863,11 @@  static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     S390pciState *s = S390_PCI_HOST_BRIDGE(hotplug_dev);
 
+    if (!s390_has_feat(S390_FEAT_ZPCI)) {
+        warn_report("Adding PCI or zPCI devices without the 'zpci' CPU feature."
+                    " The guest will not be able to see/use these devices.");
+    }
+
     if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
         PCIDevice *pdev = PCI_DEVICE(dev);