]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
qemu: enable using implicit sata controller in q35 machines
authorLaine Stump <laine@laine.org>
Sat, 3 Aug 2013 21:37:07 +0000 (17:37 -0400)
committerLaine Stump <laine@laine.org>
Tue, 6 Aug 2013 17:37:36 +0000 (13:37 -0400)
q35 machines have an implicit ahci (sata) controller at 00:1F.2 which
has no "id" associated with it. For this reason, we can't refer to it
as "ahci0". Instead, we don't give an id on the commandline, which
qemu interprets as "use the first ahci controller". We then need to
specify the unit with "unit=%d" rather than adding it onto the bus
arg.

src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-q35.args
tests/qemuxml2argvdata/qemuxml2argv-q35.xml
tests/qemuxml2argvtest.c
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml

index c7e78266e50e84810d5ecb48071d077fd39a3c3a..a8fce222067dccd5e9e1b5667b090768e9c873c6 100644 (file)
@@ -4211,9 +4211,26 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
             virBufferAddLit(&opt, "ide-drive");
         }
 
-        virBufferAsprintf(&opt, ",bus=ahci%d.%d",
-                          disk->info.addr.drive.controller,
-                          disk->info.addr.drive.unit);
+        if (qemuDomainMachineIsQ35(def) &&
+            disk->info.addr.drive.controller == 0) {
+            /* Q35 machines have an implicit ahci (sata) controller at
+             * 00:1F.2 which has no "id" associated with it. For this
+             * reason, we can't refer to it as "ahci0". Instead, we
+             * don't give an id, which qemu interprets as "use the
+             * first ahci controller". We then need to specify the
+             * unit with "unit=%d" rather than adding it onto the bus
+             * arg.
+             */
+            virBufferAsprintf(&opt, ",unit=%d", disk->info.addr.drive.unit);
+        } else {
+            /* All other ahci controllers have been created by
+             * libvirt, so they *do* have an id, and we can identify
+             * them that way.
+             */
+            virBufferAsprintf(&opt, ",bus=ahci%d.%d",
+                              disk->info.addr.drive.controller,
+                              disk->info.addr.drive.unit);
+        }
         break;
     case VIR_DOMAIN_DISK_BUS_VIRTIO:
         if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
index 5ff4bc7b60e17ec70230f79c664c27fe34c3e3ae..9e67be566071e66fb11a3e4774745b0e789544ca 100644 (file)
@@ -3,4 +3,6 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \
 -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
 -device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x2 \
 -device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 \
+-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-sata0-0-0 \
+-device ide-drive,unit=0,drive=drive-sata0-0-0,id=sata0-0-0 \
 -vga qxl -global qxl.ram_size=67108864 -global qxl.vram_size=18874368
index 3541b146af4242adff8390cd2307909242ce2731..edaf6cbbf03dad394fa236c32dff530a46911656 100644 (file)
   <on_crash>destroy</on_crash>
   <devices>
     <emulator>/usr/libexec/qemu-kvm</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='sda' bus='sata'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
     <controller type='pci' index='0' model='pcie-root'/>
     <controller type='pci' index='1' model='dmi-to-pci-bridge'/>
     <controller type='pci' index='2' model='pci-bridge'/>
index 0068d27ed2f9254dfc1ebcbce9c0d909105162a5..679124e35b52dc754a837dec72a71cf131ad2346 100644 (file)
@@ -1001,7 +1001,7 @@ mymain(void)
     DO_TEST("q35",
             QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE,
             QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
-            QEMU_CAPS_ICH9_AHCI,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_ICH9_AHCI,
             QEMU_CAPS_VGA, QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL);
 
index 2a86e61f5701fcb170ac23309bf84da70d47d3ef..96f8eafdce24ab79f0bb94d83441fb4910379558 100644 (file)
   <on_crash>destroy</on_crash>
   <devices>
     <emulator>/usr/libexec/qemu-kvm</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='sda' bus='sata'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
     <controller type='pci' index='0' model='pcie-root'/>
     <controller type='pci' index='1' model='dmi-to-pci-bridge'/>
     <controller type='pci' index='2' model='pci-bridge'/>