[PATCH v3 0/5] Add support for two i386 pm options which control acpi hotplug

Laine Stump laine at redhat.com
Sat Sep 25 14:58:54 UTC 2021


On 9/23/21 4:46 PM, Laine Stump wrote:
> On 9/11/21 11:26 PM, Ani Sinha wrote:
>> Hi all:
>>
>> This patchset introduces libvirt xml support for the following two pm 
>> conf
>> options:
>>
>> <pm>
>>    <acpi-hotplug-bridge enabled='no'/>
>>    <acpi-root-hotplug enabled='yes'/>
>> </pm>
> 
> (before I get into a more radical discussion about different options - 
> since we aren't exactly duplicating the QEMU option name anyway, what if 
> we made these names more consistent, e.g. "acpi-hotplug-bridge" and 
> "acpi-hotplug-root"?)
> 
> I've thought quite a bit about whether to put these attributes here, or 
> somewhere else, and I'm still undecided.
> 
> My initial reaction to this was "PM == Power Management, and power 
> management is all about suspend mode support. Hotplug isn't power 
> management." But then you look at the name of the QEMU option and PM is 
> right there in the name, and I guess it's *kind of related* (effectively 
> suspending/resuming a single device), so maybe I'm thinking too narrowly.
> 
> So are there alternate places that might fit the purpose of these new 
> options better, rather than directly mimicking the QEMU option placement 
> (for better or worse)? A couple alternative possibilities:
> 
> 1) ****
> 
> One possibility would be to include these new flags within the existing 
> <acpi> subelement of <features>, which is already used to control 
> whether the guest exposes ACPI to the guest *at all* (via adding 
> "-no-acpi" to the QEMU commandline when <acpi> is missing - NB: this 
> feature flag is currently supported only on x86 and aarch64 QEMU 
> platforms, and ignored for all other hypervisors).
> 
> Possibly the new flags could be put in something like this:
> 
> <features>
>    <acpi>
>      <hotplug-bridge enabled='no'/>
>      <hotplug-root enabled='yes'/>
>    </acpi>
>    ...
> </features>
> 
> But:
> 
> * currently there are no subelements to <acpi>. So this isn't "extending 
> according to an existing pattern".
> 
> * even though the <features> element uses presence of a subelement to 
> indicate "enabled" and absence of the subelement to indicate "disabled". 
> But in the case of these new acpi bridge options we would need to 
> explicitly have the "enabled='yes/no'" rather than just using presence 
> of the option to mean "enabled" and absence to mean "disabled" because 
> the default for "root-hotplug" up until now has been *enabled*, and the 
> default for hotplug-bridge is different depending on machinetype. We 
> need to continue working properly (and identically) with old/existing 
> XML, but if we didn't have an "enabled" attribute for these new flags, 
> there would be no way to tell the difference between "not specified" and 
> "disabled", and so no way to disable the feature for a QEMU where the 
> default was "enabled". (Why does this matter? Because I don't like the 
> inconsistency that would arise from some feature flags using absense to 
> mean "disabled" and some using it to mean "use the default".)
> 
> * Having something in <features> in the domain XML kind of implies that 
> the associated capability flags should be represented in the <features> 
> section of the domain capabilities. For example, <acpi/> is listed under 
> <features> in the output of virsh capabilities, separately from the flag 
> indicating presence of the -no-acpi option. I'm not sure if we would 
> need to add something there for these options if we moved them into 
> <features> (seems a bit redundant to me to have it in both places, but 
> I'm sure there are $reasons).
> 
> 
> 2) *****
> 
> Alternately, there is an <acpi> subelement of <os>, which is currently 
> used to add a SLIC table (some sort of software license table, which I'd 
> never heard of before) using QEMU's -acpitable commandline option. It is 
> also used somehow by the Xen driver.
> 
> <os>
>    <acpi>
>      <table type='slic'>/path/to/slic.dat</table>
>      <hotplug-bridge enabled='no'/>
>      <hotplug-root enabled='yes'/>
>    </acpi>
>    ...
> </os>
> 
> My problem with adding these new PCI controller acpi options to os/acpi 
> is simply that it's in the <os> subelement, which is claimed elsewhere 
> to be intended for OS boot options, and is used for things like 
> specifying the path to a kernel / initrd to boot from.
> 
> 3) ****
> 
> A third option, suggested somewhere by Ani, would be to make a 
> completely new top-level element, called something like <acpiHotplug> 
> that would have separate attributes for the two flags, e.g.:
> 
>     <acpiHotplug bridge='yes' root='yes'/>
> 
> I dislike new toplevel options because they just seem so adhoc, as if 
> the XML namespace is a cluttered, disorganized room. That reminds me too 
> much of my own workspace, which is just... depressing.
> 
> ****
> 
> Since I always seem to spend *way too much time* worrying about naming, 
> only to have it come out wrong in the end anyway, I'm looking for some 
> other opinions. Counting the version that is in Ani's patch currently as 
> option "0", which option do you all think is the best? Or is it 
> completely unimportant?

In an IRC discussion, danpb  suggested what I'll label as option (4):

4) ****

   <danpb1> laine: i didn't have time to reply,but was thinking why it
   isn't a property of the pci(e)-root <controller>


That makes perfect sense for acpi-hotplug-root:

     <controller type='pci' index='0' model='pci-root'>
       <target hotplug='off'/>
     </controller>

This is the same attribute used to disable all hotplug for 
pcie-root-ports (and downstream ports, I guess - I never use those and 
recall a bug being filed about failures to hotplug devices on a 
downstream port; but I digress...). So it fits logically.

(I will point out though that normally the options within a device's XML 
element are added to the qemu commandline as a part of that devices 
"-device", not as a separate global option as happens with this (for 
that matter there is no -device added to the commandline for pci-root or 
pcie-root at all - they're just implicit in the base machine).)


But the "acpi-hotplug-bridge" option doesn't really fit as an attribute 
of pci-root/pcie-root - imagine for a moment that you had this option in 
a pcie-root controller, it would look something like this:

     <controller type='pci' index='0' model='pcie-root'>
       <target acpiHotplugBridge='on'/>
     </controller>

Note that in this case, the option turns on *ACPI* hotplug support *for 
other PCI controllers*, **NOT** this controller (and as a side effect, 
also turns *off* PCIe native hotplug for all controllers, which can then 
be turned on/off on a per controller basis using QEMU's native_hotplug 
commandline option, which isn't supported by libvirt).

Another issue - with this - putting this option into the XML of the 
pcie-root controller and saying that it applies to "the other 
controllers in the PCI hierarchy" implies that if there was a separate 
pcie-root (for example a pxb-pcie controller) then the option wouldn't 
apply to bridges that were a part of that separate hierarchy, and I 
believe that is *not* the case.

So while I like controlling acpi-hotplug-root with <target 
hotplug='on|off'/> inside the pci-root's element, I don't really like 
putting acpi-hotplug-bridge in the pci(e)-root controller's element.




More information about the libvir-list mailing list