[libvirt] [PATCH] qemu: use "ide" as device name for implicit SATA controller on Q35

Daniel P. Berrange berrange at redhat.com
Fri Sep 20 13:33:33 UTC 2013


On Fri, Sep 20, 2013 at 06:25:10AM -0400, Laine Stump wrote:
> This resolves https://bugzilla.redhat.com/show_bug.cgi?id=1008903
> 
> The Q35 machinetype has an implicit SATA controller at 00:1F.2 which
> isn't given the "expected" id of ahci0 by qemu when it's created. The
> original suggested solution to this problem was to not specify any
> controller for the disks that use the default controller and just
> specify "unit=n" instead; qemu should then use the first ide or sata
> controller for the disk.
> 
> Unfortunately, this "solution" is ignorant of the fact that in the
> case of SATA disks, the "unit" attribute in the disk XML is actually
> *not* being used for the unit, but is instead used to specify the
> "bus" number; each SATA controller has 6 buses, and each bus only
> allows a single unit. This makes it nonsensical to specify unit='n'
> where n is anything other than 0. It also means that the only way to
> connect more than a single device to the implicit SATA controller is
> to explicitly give the bus names, which happen to be "ide.$n", where
> $n can be replaced by the disk's "unit" number.
> ---
>  src/qemu/qemu_command.c                                | 15 ++++++---------
>  tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.args |  2 +-
>  tests/qemuxml2argvdata/qemuxml2argv-q35.args           |  2 +-
>  3 files changed, 8 insertions(+), 11 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 4628dac..e6239c9 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4383,18 +4383,15 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
>          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.
> +             * 00:1F.2 which for some reason is hardcoded with the id
> +             * "ide" instead of the seemingly more reasonable "ahci0"
> +             * or "sata0".
>               */
> -            virBufferAsprintf(&opt, ",unit=%d", disk->info.addr.drive.unit);
> +            virBufferAsprintf(&opt, ",bus=ide.%d", disk->info.addr.drive.unit);

This isn't right - you're now using the 'unit' number to refer to a bus.

If the built-in controller only supports 1 unit and 6 buses, then the
XML should be using one of

   <address type=disk controller=0 bus=0 unit=0/>
   <address type=disk controller=0 bus=1 unit=0/>
   <address type=disk controller=0 bus=2 unit=0/>
   <address type=disk controller=0 bus=3 unit=0/>
   <address type=disk controller=0 bus=4 unit=0/>
   <address type=disk controller=0 bus=5 unit=0/>


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list