On Tue, Sep 28, 2021 at 3:28 PM Ani Sinha <ani(a)anisinha.ca> 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:
> > > >
> > > > <pm>
> > > > <acpi-hotplug-bridge enabled='no'/>
> > > > <acpi-root-hotplug enabled='yes'/>
> > > > </pm>
> > >
> > >
> > > > +``acpi-hotplug-bridge``
> > > > + :since:`Since 7.8.0` This option enables or disables BIOS ACPI
based hotplug support
> > > > + for cold plugged bridges. It is available only for x86 guests,
both for q35 and pc
> > > > + machine types. For pc machines, the support is available from
`QEMU 2.12`. For q35
> > > > + machines, the support is available from `QEMU 6.1`. Examples of
cold plugged bridges
> > > > + include PCI-PCI bridges for pc machine types (pci-bridge
controller). For q35 machines,
> > > > + it includes PCIE root ports (pcie-root-port controller). This is
a global option that
> > > > + affects all bridges. No other bridge specific option is required
to be specified.
> > >
> > > Can you confirm my understanding of the situation..
> > >
> > > - i440fx / PCI topology - hotplug always uses ACPI
> > >
> >
> > ACPI is the primary means of enabling hotplug. shpc might also have a role
> > here but I think it is disabled. Igor (cc'd) might throw some lights on
> > how shpc comes to play.
>
> Yes, I think it will be important to understand if 'shpc' becomes relevant
> when ACPI hotplug is disabled for PCI
https://patchwork.kernel.org/project/qemu-devel/patch/1478099802-14188-1-...
has some discussions around shpc.
Also
"PCI devices can be hot-plugged into PCI Express to PCI and PCI-PCI Bridges.
The PCI hot-plug into PCI-PCI bridge is ACPI based, whereas hot-plug into
PCI Express to PCI bridges is SHPC-based. They both can work side by side with
the PCI Express native hot-plug."
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev/...
My own experiments on i440fx has shown that Windows does not seem to
care about shpc.
Disabling acpi hotplug on bridges disables hotplug.
>
> >
> > > - q35 / PCIe topology - hotplug historically used native PCIe hotplug,
> > > but in 6.1 switched to ACPI
> > >
> >
> > Correct.
> >
> > > Given, the name "acpi-hotplug-bridge", am I right that this
option
> > > has *no* effect, if the q35 machine is using native PCIe hotplug
> > > approach ?
> >
> > Its complicated.
> > With "acpi-hotplug-bridge" ON, native hotplug is disabled in qemu.
> > With "acpi-hotplug-bridge" OFF, native hotplug is enabled in qemu.
>
> Oh, I mis-read and didn't realize this was controlling the QEMU
> "acpi-pci-hotplug-with-bridge-support" configuration.
>
> With this in mind I think the naming is somewhat misleading. Setting it
> to off would give users the impression that hotplug is disabled, which
> is not the case for Q35 at least. It is just switching to a different
> hotplug implementation.
>
> At least from Q35 pov, I think it would be better to call it
>
> hotplug-mode="acpi|pcie"
>
> so it is clear that no matter what value it is set to, hotplug
> is still available.
>
> If we also consider PIIX, then depending on the answer wrt shpc
> above, we might want one of
>
> hotplug-mode="acpi|pcie|none"
> hotplug-mode="acpi|pcie|shpc"
>
If libvirt does not deal with shpc today I think we should not bother with
shpc at all. We should simply have a boolean mode appropriately named that
choses between acpi hotplug vs native.
>
> > Libvirt does not allow it, but by directly using qemu commandline it is
> > possible to enable ACPI hotplug for pcie-root-ports by turning
> > "acpi-hotplug-bridge" ON _and_ enable native hotplug at the same
time. In
> > that case, as Julia has mentioned in some other thread, the guest OS
> > always choses native over ACPI based hotplug.
>
> I see that is refering to pie-root-port gaining native_hotplug=bool in 6.1
>
> You say the guest OS always chooses native over ACPI - is that reqiired
> in the spec, or is that just how some common guest OS have choosen to
> impl it today ?
>
I am not sure but I *think* this is guest OS dependent too? Julia to
rescue here :-)
>
> > 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
>
> * 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 ?
>
>
> 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
>
> (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.
>
> * Q35
>
>
> - 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
> pcie-root-port.hotplug=yes
> pcie-root-port.native_hotplug=yes
>
> ports have both ACPI + native hotplug, guest prefers native
>
>
> (2) acpi-pci-hotplug-with-bridge-support=yes
> pcie-root-port.hotplug=no
> pcie-root-port.native_hotplug=yes
>
> 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
>
> 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
>
>
> (8) acpi-pci-hotplug-with-bridge-support=no
> pcie-root-port.hotplug=no
> pcie-root-port.native_hotplug=no
>
> ports have no hotplug
>
>
>
> Regards,
> Daniel
> --
> |:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
> |:
https://libvirt.org -o-
https://fstop138.berrange.com :|
> |:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|
>
>