[libvirt] [PATCH] Add AHCI support to qemu driver

Jim Fehlig jfehlig at suse.com
Tue Oct 4 04:46:18 UTC 2011


Adam Litke wrote:
> Hi Jim.  I was testing this and found that I could not boot from the sata disks
> I defined.  When I switch them back to ide, they can be booted just fine.
> Perhaps something is missing from the boot order logic?
>   

Hmm, I didn't notice this in my testing.  sda in the below config
contained /boot.  Can you provide the domain config?

Thanks for taking a look!
Jim

> On Wed, Sep 28, 2011 at 04:43:25PM -0600, Jim Fehlig wrote:
>   
>> Tested with multiple AHCI controllers and multiple disks attached
>> to a controller. E.g.,
>>
>>     <disk type='file' device='disk'>
>>       <driver name='qemu' type='raw'/>
>>       <source file='/var/lib/libvirt/images/test/disk0.raw'/>
>>       <target dev='sda' bus='sata'/>
>>       <address type='drive' controller='0' bus='0' unit='0'/>
>>     </disk>
>>     <disk type='file' device='disk'>
>>       <driver name='qemu' type='raw'/>
>>       <source file='/var/lib/libvirt/images/test/disk1.raw'/>
>>       <target dev='sdb' bus='sata'/>
>>       <address type='drive' controller='0' bus='0' unit='1'/>
>>     </disk>
>>     <disk type='file' device='disk'>
>>       <driver name='qemu' type='raw'/>
>>       <source file='/var/lib/libvirt/images/test/disk2.raw'/>
>>       <target dev='sdc' bus='sata'/>
>>       <address type='drive' controller='1' bus='0' unit='0'/>
>>     </disk>
>>     <controller type='sata' index='0'>
>>       <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
>>     </controller>
>>     <controller type='sata' index='1'>
>>       <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
>>     </controller>
>> ---
>>  docs/formatdomain.html.in                          |    9 +++--
>>  docs/schemas/domaincommon.rng                      |    1 +
>>  src/conf/domain_conf.c                             |   14 +++++++++
>>  src/qemu/qemu_capabilities.c                       |    3 ++
>>  src/qemu/qemu_capabilities.h                       |    1 +
>>  src/qemu/qemu_command.c                            |   30 ++++++++++++++++----
>>  .../qemuxml2argv-disk-sata-device.args             |    6 ++++
>>  .../qemuxml2argv-disk-sata-device.xml              |   25 ++++++++++++++++
>>  tests/qemuxml2argvtest.c                           |    3 ++
>>  9 files changed, 82 insertions(+), 10 deletions(-)
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 3087d01..b6a0c66 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -972,11 +972,12 @@
>>          as a device ordering hint.  The optional <code>bus</code>
>>          attribute specifies the type of disk device to emulate;
>>          possible values are driver specific, with typical values being
>> -        "ide", "scsi", "virtio", "xen" or "usb". If omitted, the bus type is
>> -        inferred from the style of the device name. eg, a device named 'sda'
>> -        will typically be exported using a SCSI bus.
>> +        "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus
>> +        type is inferred from the style of the device name. eg, a device named
>> +        'sda' will typically be exported using a SCSI bus.
>>          <span class="since">Since 0.0.3; <code>bus</code> attribute since 0.4.3;
>> -        "usb" attribute value since after 0.4.4</span></dd>
>> +        "usb" attribute value since after 0.4.4; "sata" attribute value since
>> +        0.9.7</span></dd>
>>        <dt><code>driver</code></dt>
>>        <dd>
>>          The optional driver element allows specifying further details
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index be98be0..675d55d 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -790,6 +790,7 @@
>>              <value>xen</value>
>>              <value>usb</value>
>>              <value>uml</value>
>> +            <value>sata</value>
>>            </choice>
>>          </attribute>
>>        </optional>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index a918679..6a7f296 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -2157,6 +2157,15 @@ virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def)
>>          def->info.addr.drive.unit = (idx % 2);
>>          break;
>>
>> +    case VIR_DOMAIN_DISK_BUS_SATA:
>> +        /* For SATA we define the default mapping to be 6 units
>> +         * per bus, 1 bus per controller, many controllers */
>> +        def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
>> +        def->info.addr.drive.controller = idx / 6;
>> +        def->info.addr.drive.bus = 0;
>> +        def->info.addr.drive.unit = idx % 6;
>> +        break;
>> +
>>      case VIR_DOMAIN_DISK_BUS_FDC:
>>          /* For FDC we define the default mapping to be 2 units
>>           * per bus, 1 bus per controller, many controllers */
>> @@ -8675,6 +8684,11 @@ int virDomainDefAddImplicitControllers(virDomainDefPtr def)
>>                                                VIR_DOMAIN_DISK_BUS_IDE) < 0)
>>          return -1;
>>
>> +    if (virDomainDefAddDiskControllersForType(def,
>> +                                              VIR_DOMAIN_CONTROLLER_TYPE_SATA,
>> +                                              VIR_DOMAIN_DISK_BUS_SATA) < 0)
>> +        return -1;
>> +
>>      if (virDomainDefMaybeAddVirtioSerialController(def) < 0)
>>          return -1;
>>
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index 8e20e3f..7122756 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -139,6 +139,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
>>                "no-shutdown",
>>
>>                "cache-unsafe", /* 75 */
>> +              "ich9-ahci",
>>      );
>>
>>  struct qemu_feature_flags {
>> @@ -1241,6 +1242,8 @@ qemuCapsParseDeviceStr(const char *str, virBitmapPtr flags)
>>          qemuCapsSet(flags, QEMU_CAPS_USB_REDIR);
>>      if (strstr(str, "name \"usb-hub\""))
>>          qemuCapsSet(flags, QEMU_CAPS_USB_HUB);
>> +    if (strstr(str, "name \"ich9-ahci\""))
>> +        qemuCapsSet(flags, QEMU_CAPS_ICH9_AHCI);
>>
>>      /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
>>      if (!qemuCapsGet(flags, QEMU_CAPS_CHARDEV_SPICEVMC) &&
>> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
>> index ae3de90..1e23451 100644
>> --- a/src/qemu/qemu_capabilities.h
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -113,6 +113,7 @@ enum qemuCapsFlags {
>>      QEMU_CAPS_NO_SHUTDOWN       = 74, /* usable -no-shutdown */
>>
>>      QEMU_CAPS_DRIVE_CACHE_UNSAFE = 75, /* Is cache=unsafe supported? */
>> +    QEMU_CAPS_ICH9_AHCI         = 76, /* -device ich9-ahci */
>>
>>      QEMU_CAPS_LAST,                   /* this must always be the last item */
>>  };
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 9174a5f..6d6e67d 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -1702,6 +1702,12 @@ qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
>>                            disk->info.addr.drive.bus,
>>                            disk->info.addr.drive.unit);
>>          break;
>> +    case VIR_DOMAIN_DISK_BUS_SATA:
>> +        virBufferAddLit(&opt, "ide-drive");
>> +        virBufferAsprintf(&opt, ",bus=ahci%d.%d",
>> +                          disk->info.addr.drive.controller,
>> +                          disk->info.addr.drive.unit);
>> +        break;
>>      case VIR_DOMAIN_DISK_BUS_VIRTIO:
>>          virBufferAddLit(&opt, "virtio-blk-pci");
>>          qemuBuildIoEventFdStr(&opt, disk->ioeventfd, qemuCaps);
>> @@ -1902,6 +1908,10 @@ qemuBuildControllerDevStr(virDomainControllerDefPtr def,
>>          virBufferAsprintf(&buf, "usb-ccid,id=ccid%d", def->idx);
>>          break;
>>
>> +    case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
>> +        virBufferAsprintf(&buf, "ahci,id=ahci%d", def->idx);
>> +        break;
>> +
>>      case VIR_DOMAIN_CONTROLLER_TYPE_USB:
>>          if (qemuBuildUSBControllerDevStr(def, qemuCaps, &buf) == -1)
>>              goto error;
>> @@ -3683,14 +3693,22 @@ qemuBuildCommandLine(virConnectPtr conn,
>>                  cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC)
>>                  continue;
>>
>> -            /* QEMU doesn't implement a SATA driver */
>> +            /* Only recent QEMU implements a SATA (AHCI) controller */
>>              if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) {
>> -                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> -                                "%s", _("SATA is not supported with this QEMU binary"));
>> -                goto error;
>> -            }
>> +                if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) {
>> +                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                                    "%s", _("SATA is not supported with this QEMU binary"));
>> +                    goto error;
>> +                } else {
>> +                    char *devstr;
>>
>> -            if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
>> +                    virCommandAddArg(cmd, "-device");
>> +                    if (!(devstr = qemuBuildControllerDevStr(cont, qemuCaps, NULL)))
>> +                        goto error;
>> +
>> +                    virCommandAddArg(cmd, devstr);
>> +                }
>> +            } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
>>                  def->controllers[i]->model == -1 &&
>>                  !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) {
>>                  if (usblegacy) {
>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args
>> new file mode 100644
>> index 0000000..9908da6
>> --- /dev/null
>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args
>> @@ -0,0 +1,6 @@
>> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
>> +pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \
>> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -device ahci,id=ahci0,\
>> +bus=pci.0,addr=0x3 -drive file=/dev/HostVG/QEMUGuest1,if=none,\
>> +id=drive-sata0-0-0 -device ide-drive,bus=ahci0.0,drive=drive-sata0-0-0,\
>> +id=sata0-0-0 -usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml
>> new file mode 100644
>> index 0000000..68a14f2
>> --- /dev/null
>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.xml
>> @@ -0,0 +1,25 @@
>> +<domain type='qemu'>
>> +  <name>QEMUGuest1</name>
>> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
>> +  <memory>219136</memory>
>> +  <currentMemory>219136</currentMemory>
>> +  <vcpu>1</vcpu>
>> +  <os>
>> +    <type arch='i686' machine='pc'>hvm</type>
>> +    <boot dev='hd'/>
>> +  </os>
>> +  <clock offset='utc'/>
>> +  <on_poweroff>destroy</on_poweroff>
>> +  <on_reboot>restart</on_reboot>
>> +  <on_crash>destroy</on_crash>
>> +  <devices>
>> +    <emulator>/usr/bin/qemu</emulator>
>> +    <disk type='block' device='disk'>
>> +      <source dev='/dev/HostVG/QEMUGuest1'/>
>> +      <target dev='sda' bus='sata'/>
>> +      <address type='drive' controller='0' bus='0' unit='0'/>
>> +    </disk>
>> +    <controller type='sata' index='0'/>
>> +    <memballoon model='virtio'/>
>> +  </devices>
>> +</domain>
>> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
>> index 9e174b3..f298d37 100644
>> --- a/tests/qemuxml2argvtest.c
>> +++ b/tests/qemuxml2argvtest.c
>> @@ -359,6 +359,9 @@ mymain(void)
>>              QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
>>      DO_TEST("disk-scsi-device-auto", false,
>>              QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
>> +    DO_TEST("disk-sata-device", false,
>> +            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE,
>> +            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_ICH9_AHCI);
>>      DO_TEST("disk-aio", false,
>>              QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_AIO,
>>              QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
>> -- 
>> 1.7.5.4
>>
>> --
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
>>     
>
>   




More information about the libvir-list mailing list