[PATCH v3 3/5] conf: introduce acpi-hotplug-bridge and acpi-root-hotplug pm options

Ani Sinha ani at anisinha.ca
Wed Sep 29 16:42:32 UTC 2021


On Wed, Sep 29, 2021 at 7:58 PM Igor Mammedov <imammedo at redhat.com> wrote:
>
> On Tue, 28 Sep 2021 11:47:26 +0100
> Daniel P. Berrangé <berrange at redhat.com> wrote:
>
> > On Tue, Sep 28, 2021 at 03:28:04PM +0530, Ani Sinha wrote:
> > >
> > >
> > > On Tue, 28 Sep 2021, Daniel P. Berrangé wrote:
> > >
> > > > On Tue, Sep 28, 2021 at 02:35:47PM +0530, Ani Sinha wrote:
> > > > >
> > > > >
> > > > > On Tue, 28 Sep 2021, Daniel P. Berrangé wrote:
> > > > >
> > > > > > On Sun, Sep 12, 2021 at 08:56:29AM +0530, Ani Sinha wrote:
> > > > > > > This change introduces libvirt xml support for the following two pm options:
> [...]
> > > > > The <target hotplug="on/off"> switch in libvirt for pcie-root-ports
> > > > > currently does not care whether native or acpi hotplug is used. It simply
> > > > > turns on the hotplug for that particular port. Whether ACPI or native is
> > > > > used is controlled by this global flag that Julia has introduced in 6.1.
>
>
> > > > Right so we have
> > > >
>
> *1*)
> following applies to piix4/q35:
>   * ACPI hotplug when enabled, affects _only_ cold-plugged 'bridges'
>     since it requires 'slots' being described in DSDT table which
>     in current impl. is static table built at reset time.
>
>      (i.e. built-in or 'bridges' specified on command line,
>       where 'bridges' could be PCI-PCI or PCIe-PCI or root/downstream-ports')
>    for anything else ('bridges' added with device_add) native hotplug
>    is in use (whether it's SHPC or PCI-E native).
>
> ACPI hotplug wiring is done by calling qbus_set_hotplug_handler()
>  * for root bus piix4_pm_realize()/ich9_pm_init()
>  * for anything else acpi_pcihp_device_plug_cb()
>
>
> > > >   * PIIX4
> > > >
> > > >       - acpi-root-pci-hotplug=bool
> > > >
> > > >         Whether hotplug is enabled for the root bridge or not
> > > >
> > > >           <target hotplug="on/off"> for pci-root controller
> > > >
> > > >
> > > >       - acpi-pci-hotplug-with-bridge-support=bool
> > > >
> > > >         Toggles support for ACPI based hotplug across all bridges.
> > > >   If disabled will there will be no hotplug at all for PIIX4 ?
> > > >   Or does 'shpc' come into play in that scenario ?
>
> 'SHPC' hotplug kicks in if it's enabled. (defaults to 'on' except 2.9 machine type)
>
> on q35/APCI side of things we always advertise -all_ hotplug methods available
>
> build_q35_osc_method()
>     /*
>      * Always allow native PME, AER (no dependencies)
>      * Allow SHPC (PCI bridges can have SHPC controller)
>      */
>     aml_append(if_ctx, aml_and(a_ctrl, aml_int(0x1F), a_ctrl));
>
> bits 0, 1 are Native PCI-E hotplug and SHPC respectively
>
> for PIIX4 we don't have _OSC so it's up to guest OS to make up
> supported methods.
>
> In order of preference:
>   * Windows supports ACPI hotplug then Native PCI-E (SHPC never worked there)

Hmm. from https://www.mail-archive.com/qemu-devel@nongnu.org/msg746673.html :

Me:
> Stupid question. If both native and acpi is enabled which one does OS chose?
> Does this choice vary between OSes and different flavours of the same OS like
> Windows?

Julia: It will always choose native.

re: SHPC this is the reason I thought SHPC was disabled. In my
experiments, Windows did not seem to care about SHPC.

>   * Linux supports ACPI hotplug, SHPC, Native PCI-E
>         (SHPC worked poorly due to need to reserve IO for bridges
>          io reservation hinting (impl. later by Marcel))
>
> > > >    PIIX combinations
> > > >
> > > >        (1) acpi-root-pci-hotplug=yes
> > > >            acpi-pci-hotplug-with-bridge-support=yes
> > > >
> > > >          - All bridges have hotplug
> > > >
> > > >        (2) acpi-root-pci-hotplug=yes
> > > >            acpi-pci-hotplug-with-bridge-support=no
> > > >
> > > >          - No bridges have hotplug
> > > >
> > > >        (3) acpi-root-pci-hotplug=no
> > > >            acpi-pci-hotplug-with-bridge-support=yes
> > > >
> > > >          - All bridges except root have hotplug
>
> requested by Promox guys, to battle against Windows 'feature' that
> lets any user to unplug sole NIC using an icon on taskbar.

I implemented that on qemu side :-)

>
> (Laine mentioned we have similar per port control for PCI-E
> ('hotplug' property) that was requested by other users
> probably for the same reason)
>
> so acpi-root-pci-hotplug is similar to pcie-root-port.hotplug
> with a difference that the former applies to whole root bus
> on PIIX4, where the later could be controlled per root port.
>
> > > >        (4) acpi-root-pci-hotplug=no
> > > >            acpi-pci-hotplug-with-bridge-support=no
> > > >
> > > >          - No bridges have hotplug. Essentially identical to (2)
> > >
> > > no (4) is not identical to (2). In (4) no hotplug is enabled. In (2) pci
> > > root bus still has hotplug enabled.
> >
> > So you're saying that acpi-root-pci-hotplug=yes overrides the
> > global request acpi-pci-hotplug-with-bridge-support=no and
> > turns ACPI hotplug back on for the pcie-root
>
> historically ACPI hotplug on root bus was always supported
> without any option, i.e. acpi-root-pci-hotplug=yes by default.
> acpi-pci-hotplug-with-bridge-support does what its name
> claims - i.e. adds hotplug for bridges (at least on PIIX4).
>
> > > >   * Q35
>
>  clarification [*1*] still applies
>
> > > >
> > > >
> > > >       - acpi-pci-hotplug-with-bridge-support=bool
> > > >
> > > >         Toggles support for ACPI based hotplug. If disabled native
> > > >   PCIe hotplug is activated instead
> > > >
> > > >
> > > >   * pcie-root-port
> > > >
> > > >       - hotplug=bool
> > > >
> > > >         Toggles whether hotplug is enabled on the port. Affects
> > > >   either native and ACPI based hotplug, depending on what
> > > >   acpi-pci-hotplug-with-bridge-support=bool is set to ?
> > > >
> > > >           <target hotplug="on/off"> for pcie-root-port controller
> > > >
> > > >       - native_hotplug=bool
> > > >
> > > >         Can be used to also enable native hotplug, even when ACPI
> > > >   based hotplug is globally enabled. IOW only really relevant
> > > >   when acpi-pci-hotplug-with-bridge-support=true
> > > >
> > > >
> > > >    Q35 combinations
> > > >
> > > >        (1) acpi-pci-hotplug-with-bridge-support=yes
> name is a bit confusing depending on the point of view,
> but if one thinks about root/downstream-ports as bridges
> it fits just fine.
>
> > > >            pcie-root-port.hotplug=yes
> > > >            pcie-root-port.native_hotplug=yes
>
> it probably needs to say here what defaults are in place currently.
> maybe say it once above (1) for all Q35 section
>
>
> > > >            ports have both ACPI + native hotplug, guest prefers native
>
> are you sure about 'prefers'?
>
> > > >
> > > >
> > > >        (2) acpi-pci-hotplug-with-bridge-support=yes
>
> > > >            pcie-root-port.hotplug=no
> > > >            pcie-root-port.native_hotplug=yes
> seems as invalid config, we should error out
>
> > > >            ports have no hotplug, despite native_hotplug=yes IIUC
> > > >
> > > >
> > > >        (3) acpi-pci-hotplug-with-bridge-support=yes
> > > >            pcie-root-port.hotplug=yes
> > > >            pcie-root-port.native_hotplug=no
> > > >
> > > >            ports have ACPI hotplug only
> > > >
> > > >
> > > >        (4) acpi-pci-hotplug-with-bridge-support=yes
> > > >            pcie-root-port.hotplug=no
> > > >            pcie-root-port.native_hotplug=no
> > > >
> > > >            ports have no hotplug
> > > >
> > > >
> > > >        (5) acpi-pci-hotplug-with-bridge-support=no
> > > >            pcie-root-port.hotplug=yes
> > > >            pcie-root-port.native_hotplug=yes
> > > >
> > > >            ports have native hotplug
> > > >
> > > >
> > > >        (6) acpi-pci-hotplug-with-bridge-support=no
>
> > > >            pcie-root-port.hotplug=no
> > > >            pcie-root-port.native_hotplug=yes
> ditto
>
> > > >
> > > >            ports have no hotplug, despite native_hotplug=yes IIUC
> > > >
> > > >
> > > >        (7) acpi-pci-hotplug-with-bridge-support=no
> > > >            pcie-root-port.hotplug=yes
> > > >            pcie-root-port.native_hotplug=no
> > > >
> > > >            ports have no hotplug, despite hotplug=yes IIUC
> looks wrong too, but harder to check without picking into
> global acpi-pci-hotplug-with-bridge-support from 'random'
> 'port' device. not sure what to do here
>
> > > >
> > > >        (8) acpi-pci-hotplug-with-bridge-support=no
> > > >            pcie-root-port.hotplug=no
> > > >            pcie-root-port.native_hotplug=no
> > > >
> > > >            ports have no hotplug
>
> Ani,
>
> it would be nice to have a similar doc in QEMU, lets say docs/pic_hoptplug.rst
> and maybe move there relevant sections from pcie.txt/pcie_pci_bridge.txt
> to have everything PCI hotplug related in one place.

Yeah as I was discussing this here and on IRC with Laine, I realized
this is all very convoluted. We should definitely document this. Will
work on it after I am done with this patchset.





More information about the libvir-list mailing list