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

[libvirt] Problems with attach-device/detach-device using libvirt 0.7.6



Hi,

first a short summary of what the situation is:

I'm running qemu 0.12.2, libvirt 0.7.6 on a E5520 based machine with kernel 
2.6.33. I also tried 2.6.32.7 as I was using that before and still had the old 
kernel around, but kernel version doesn't matter AFAICT. The host is a gentoo 
AMD64 installation, the client is SuSE 11.0 (both 32 and 64 bit tested).

This system is our machine to run automated PCIe device tests on, so the idea 
is to move PCIe devices from the host to different vms, run some testcases 
there and then move them away again. This has worked before (I'm not 
absolutely sure, but I would bet a bit of money that it was libvirt 0.7.5).

So, what I'm going to do is simply

virsh # attach-device suse11.0-AMD64 dev-pci-AD1-CL.xml
Device attached successfully

virsh # detach-device suse11.0-AMD64 dev-pci-AD1-CL.xml
Device detached successfully

This is just was I expect and what I now get with the two patches attached. 
The original situation was somewhat different (i.e. broken):

-first I got complains in the log stating:

tried to create id "(null)" twice for "device"

Well, adding two devices with the same id is bad, and if that id is a NULL 
pointer anyway IMHO it's better to not pass the parameter at all. That's what 
the "null-pci-id" patch does.

-next, detaching failed. I found out that the command sent to qemu was " 
pci_del pci_addr=fc67add0:7f41:fe38b65a" which is obviously bogus. After some 
hours of digging through the command stack up and down I found that it was the 
memcpy addressed in the "pci_memcpy" patch.

When the device is attached qemu just replies with an empty string. Afterwards 
from the guestAddr the address of the PCI device in the client is copied back 
to the info structure. Too bad that this structure was never initialized to 
anything useful (at least not for me). When I kick out the memcpy() everything 
works fine.

Configuration files of one device and one guest are attached, the others look 
similar.

Note: when the client PCI id is passed to qemu anyway it would be cool if that 
could be specified in the device XML. For USB devices, too.

Eike

Please keep me CC'ed as I'm not on the list.
diff -Naurp libvirt-0.7.6-orig/src/qemu/qemu_conf.c libvirt-0.7.6/src/qemu/qemu_conf.c
--- libvirt-0.7.6-orig/src/qemu/qemu_conf.c	2010-02-03 17:56:38.000000000 +0100
+++ libvirt-0.7.6/src/qemu/qemu_conf.c	2010-02-25 16:24:49.000000000 +0100
@@ -2690,7 +2690,8 @@ qemuBuildPCIHostdevDevStr(virDomainHostd
                       dev->source.subsys.u.pci.bus,
                       dev->source.subsys.u.pci.slot,
                       dev->source.subsys.u.pci.function);
-    virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
+    if (dev->info.alias != NULL)
+        virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
     if (qemuBuildDeviceAddressStr(&buf, &dev->info) < 0)
         goto error;
 
diff -Naurp libvirt-0.7.6-orig/src/qemu/qemu_driver.c libvirt-0.7.6/src/qemu/qemu_driver.c
--- libvirt-0.7.6-orig/src/qemu/qemu_driver.c	2010-02-03 16:56:00.000000000 +0100
+++ libvirt-0.7.6/src/qemu/qemu_driver.c	2010-02-26 15:11:09.000000000 +0100
@@ -5799,7 +5799,7 @@ static int qemudDomainAttachHostPciDevic
     if (ret < 0)
         goto error;
     hostdev->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
-    memcpy(&hostdev->info.addr.pci, &guestAddr, sizeof(guestAddr));
+//    memcpy(&hostdev->info.addr.pci, &guestAddr, sizeof(guestAddr));
 
     vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
 

Attachment: dev-pci-AD1-CL.xml
Description: application/xml

Attachment: suse11.0-AMD64.xml
Description: application/xml


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