qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Can not hotplug device to pci-to-pci bridge using machine t


From: Fei Li
Subject: [Qemu-devel] Can not hotplug device to pci-to-pci bridge using machine type older than 1.7
Date: Thu, 25 Jan 2018 16:01:39 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

Hi,

After I hotplug a pci device to a pci2pci bridge (I use "pci.1") with machine type 1.7 or older, I can not see the pci device via `lspci` in the guest, but can see it via `info qtree` in the hmp. What's more, after I reboot the guest or hotplug another pci device to pci.0, I can see the
previous hotplugged pci device via `lspci`.

I use qemu v2.9.* (but machine type =1.7 or 1.6) and kernel 4.4.
I also do the test on self-build qemu v1.7, v1.6 and kernel 4.4, the same phenomenon.
My qemu command line is as follows:
/usr/bin/qemu-system-x86_64 -m 1024 -machine pc-i440fx-1.7,accel=kvm,kernel_irqchip=on -enable-kvm \
-smp sockets=1,cores=1,threads=1 -no-user-config -cpu Skylake-Client \
-name "pci-hp-qemu" -monitor telnet:127.0.0.1:8848,server,nowait \
-drive file=/opt/pcihp.qcow2,if=none,id=drive0,format=qcow2 \
-device virtio-blk-pci,drive=drive0,id=sata0,bootindex=1 \
-device pci-bridge,chassis_nr=1 \
-device virtio-net-pci,bus=pci.1,addr=01,id=netdev1 \
-device virtio-net-pci,bus=pci.0,addr=07,id=netdev2 \
-boot order=c
...
(qemu) device_add virtio-net-pci,bus=pci.1,addr=12,id=netdev12

Checking the qemu commit log, I see qemu v2.0 introduces the acpi based pci hotplug
support and enables hotplug for pci devices behind pci2pci bridges
(upstream commit 99fd437d, 9e047b98 and db4728e6).

I also checked qemu v2.9 code, and notice there's a judge: if use_acpi_pci_hotplug is true (MT >= 2.0), the code will update the hotplug_handler for *all buses* to PIIX4PMState and uses acpi_pcihp_device_plug_cb as the hp callback; else, for MT<=1.7, the code will only update the hotplug_handler for pci.0 and leave other buses continue to use its default hp_handler: the pci2pci bridge and default callback: pci_bridge_dev_hotplug_cb => shpc_device_hotplug_cb. With the latter shpc* hotplug callback, hotplug a pci device to a pci2pci bridge, like pci.1, I can
not be seen it in the guest via `lspci`.

I am just wondering whether the qemu code does not support the shpc hotplug to pci2pci bridge,
or the shpc spec does not support this.
Could someone shed some light on me? Thanks a lot!

Have a nice day
Fei



reply via email to

[Prev in Thread] Current Thread [Next in Thread]