On 09/09/11 15:08, Amos Kong wrote:
Hello all,
I'm working on hotplug pci multifunction.
1. qemu cmdline:
./x86_64-softmmu/qemu-system-x86_64 -snapshot -m 2000
/home/kvm_autotest_root/images/rhel61-64-virtio.qcow2 -vnc :0 -monitor
unix:/tmp/a,server,nowait --enable-kvm -net none
2. script to add virtio-blk devices:
for i in `seq 1 7` 0;do
qemu-img create /tmp/resize$i.qcow2 1G -f qcow2
echo drive_add 0x6.$i id=drv$i,if=none,file=/tmp/resize$i.qcow2 | nc -U /tmp/a
echo device_add
virtio-blk-pci,id=dev$i,drive=drv$i,addr=0x6.$i,multifunction=on | nc -U /tmp/a
done
3. script to add virio-nic devices:
for i in `seq 1 7` 0;do
echo netdev_add tap,id=drv$i | nc -U /tmp/a
echo device_add
virtio-net-pci,id=dev$i,netdev=drv$i,addr=0x6.$i,multifunction=on | nc -U /tmp/a
done
4. current qemu behaviors
4.1. add func 1~7 one by one, then add func 0
virtio-nic : success, all funcs are added
virtio-blk : success
4.2. add func 0~7 one by one
virtio-nic : failed, only func 0 is added
virtio-blk : success
4.3. removing any single func in monitor
virtio-nic: func 0 are not found in 'lspci', func 1~7 also exist. eth1~eth7
also exist.
virtio-blk: func 0 are not found in 'lspci', func 1~7 also exist. the device.
/dev/vda disappears,
vdb,vdc,vde,vdf,vdg,vdh,vdi,vdj also exist. If I re-add 8 funcs
to guest, they all works.
# lspci (00:06.1 ~ 00:06.7 exist, 00:06.0 doesn't exit)
00:06.1 SCSI storage controller: Red Hat, Inc Virtio block
device (rev ff)
qemu sends an acpi event to guest, then guest will remove all funcs in the slot.
linux-2.6/drivers/pci/hotplug/acpiphp_glue.c:
static int disable_device(struct acpiphp_slot *slot) {
list_for_each_entry(func,&slot->funcs, sibling) {
...
Hello all,
I re-tested the multifunction hotplug of winxp,rhel6,win7 guest.
(upstream qemu-kvm)
For all the guests, func0 needs to be added, otherwise no func can be
found in guest.
RHEL6 needs to add fun0 in the end, otherwise, the funcs added after
hot-adding func0 could not be found in guest.
For winxp,win7, add func0 in any time, all the funcs can be found in guest.
This is the test result( hogplug order of funcs & funcs can be found in
guest):
hotplug order xp win7 rhel6
------------ -- ---- -----
func 0~7 0~7 0~7 0~7
func 0~5 0~6 0~6 0~6
func 1~4,0,5 0~5 0~5 0~4
func 1~4 no no no
It looks like the 'problem' of linux guest, or could we accept to add
func0 after adding other funcs for linux guest?
Thanks,
Amos
Questions:
1. why func1~7 still can be found after hot-remove? is it same as real hardware?
2. why the func 1~7 could not be added to guest (addingfunc 0~7 one by one)?
3. how about this interface to hotplug/hot-unplug multifunction:
1) Add func 1-7 by monitor, add func 0, then send an acpi event to notice
guest
2) Remove func0, send an acpi event to guest. (all funcs can be removed)
4. what does "reversion 0xff" stand for?
Thanks in advance,
Amos