[libvirt] [PATCH] virsh domxml-from-native to treat SCSI as the bus type for pseries by default

Shivaprasad bhat shivaprasadbhat at gmail.com
Fri Nov 22 17:31:45 UTC 2013


Hi Cole,

Thanks for the comments.


On Fri, Nov 22, 2013 at 1:54 AM, Cole Robinson <crobinso at redhat.com> wrote:

> On 11/21/2013 03:06 PM, Shivaprasad G Bhat wrote:
> > From: Shivaprasad G Bhat <shivaprasadbhat at gmail.com>
> >
> > The bus type IDE being enum Zero, the bus type on pseries system appears
> as IDE for all the -hda/-cdrom and for disk drives with if="none" type.
> Pseries platform needs this to appear as SCSI instead of IDE. The ide being
> not supported, the explicit requests for ide devices will return an error.
> >
> > Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
> > ---
> >  src/qemu/qemu_command.c                            |   66
> +++++++++++++++++++-
> >  tests/qemuargv2xmltest.c                           |    1
> >  .../qemuxml2argv-pseries-disk.args                 |    5 ++
> >  .../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml |   40 ++++++++++++
> >  4 files changed, 108 insertions(+), 4 deletions(-)
> >  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
> >  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
> >
> > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> > index 8dc7e43..21b5108 100644
> > --- a/src/qemu/qemu_command.c
> > +++ b/src/qemu/qemu_command.c
> > @@ -10032,6 +10032,7 @@ error:
> >  static virDomainDiskDefPtr
> >  qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
> >                           const char *val,
> > +                         virDomainDefPtr dom,
> >                           int nvirtiodisk,
> >                           bool old_style_ceph_args)
> >  {
> > @@ -10055,7 +10056,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr
> xmlopt,
> >      if (VIR_ALLOC(def) < 0)
> >          goto cleanup;
> >
> > -    def->bus = VIR_DOMAIN_DISK_BUS_IDE;
> > +    if (((dom->os.arch == VIR_ARCH_PPC64) &&
> > +        dom->os.machine && STREQ(dom->os.machine, "pseries")))
> > +        def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> > +    else
> > +       def->bus = VIR_DOMAIN_DISK_BUS_IDE;
> >      def->device = VIR_DOMAIN_DISK_DEVICE_DISK;
> >      def->type = VIR_DOMAIN_DISK_TYPE_FILE;
> >
> > @@ -10140,9 +10145,15 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr
> xmlopt,
> >                  def->type = VIR_DOMAIN_DISK_TYPE_FILE;
> >              }
> >          } else if (STREQ(keywords[i], "if")) {
> > -            if (STREQ(values[i], "ide"))
> > +            if (STREQ(values[i], "ide")) {
> >                  def->bus = VIR_DOMAIN_DISK_BUS_IDE;
> > -            else if (STREQ(values[i], "scsi"))
> > +                if (((dom->os.arch == VIR_ARCH_PPC64) &&
> > +                     dom->os.machine && STREQ(dom->os.machine,
> "pseries"))) {
> > +                    virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                                   _("pseries systems do not support
> ide devices '%s'"), val);
> > +                    goto error;
> > +                }
> > +            } else if (STREQ(values[i], "scsi"))
> >                  def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> >              else if (STREQ(values[i], "virtio"))
> >                  def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO;
> > @@ -11368,6 +11379,9 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> >                  disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
> >              if (STREQ(arg, "-cdrom")) {
> >                  disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
> > +                if (((def->os.arch == VIR_ARCH_PPC64) &&
> > +                    def->os.machine && STREQ(def->os.machine,
> "pseries")))
> > +                    disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> >                  if (VIR_STRDUP(disk->dst, "hdc") < 0)
> >                      goto error;
> >                  disk->readonly = true;
> > @@ -11381,6 +11395,9 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> >                          disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
> >                      else
> >                          disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> > +                   if (((def->os.arch == VIR_ARCH_PPC64) &&
> > +                       def->os.machine && STREQ(def->os.machine,
> "pseries")))
> > +                       disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> >                  }
> >                  if (VIR_STRDUP(disk->dst, arg + 1) < 0)
> >                      goto error;
> > @@ -11672,7 +11689,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> >              }
> >          } else if (STREQ(arg, "-drive")) {
> >              WANT_VALUE();
> > -            if (!(disk = qemuParseCommandLineDisk(xmlopt, val,
> > +            if (!(disk = qemuParseCommandLineDisk(xmlopt, val, def,
> >                                                    nvirtiodisk,
> >                                                    ceph_args != NULL)))
> >                  goto error;
> > @@ -11858,6 +11875,47 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> >              }
> >          } else if (STREQ(arg, "-S")) {
> >              /* ignore, always added by libvirt */
> > +        } else if (STREQ(arg, "-device")) {
> > +            /* something we can't fully parse. Check if supported and
> > +             * add it to the qemu namespace
> > +             * cmdline/environment advanced options and hope for the
> best
> > +             */
> > +            bool unsupported = false;
> > +            WANT_VALUE()
> > +
> > +            if ((def->os.arch == VIR_ARCH_PPC64) &&
> > +                def->os.machine && STREQ(def->os.machine, "pseries")) {
> > +                int nkws;
> > +                char **kws;
> > +                char **vals;
> > +                size_t j;
> > +
> > +                if (!qemuParseKeywords(val, &kws, &vals, &nkws, 1)) {
> > +                    for (j = 0; j < nkws; j++) {
> > +                        if (STREQLEN(kws[j], "ide", 3) ||
> > +                            (STREQ(kws[j], "if") && vals[j] &&
> > +                             STREQ(vals[j], "ide"))) {
> > +                            virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                                           _("pseries systems do not
> support ide devices '%s'"), val);
> > +                            unsupported = true;
> > +                            break;
> > +                        }
> > +                    }
> > +                    for (j = 0; j < nkws; j++) {
> > +                        VIR_FREE(kws[j]);
> > +                        VIR_FREE(vals[j]);
> > +                    }
> > +                    VIR_FREE(kws);
> > +                    VIR_FREE(vals);
> > +                }
> > +            }
> > +
> > +            if (unsupported || VIR_REALLOC_N(cmd->args,
> cmd->num_args+2) < 0)
> > +                goto error;
> > +            if (VIR_STRDUP(cmd->args[cmd->num_args++], arg) < 0)
> > +                goto error;
> > +            if (VIR_STRDUP(cmd->args[cmd->num_args++], val) < 0)
> > +                goto error;
>
> This -device handling chunk should at least be a separate patch and have a
> test case that exercises it. But I don't know if that's how we want to
> handle
> -device conversions, just turning them into qemu commandline passthrough
> bits,
> but actually learning to parse -device would be a pretty massive
> undertaking.


I have removed the chunk from v4 and i'll address it separately as
suggested.


> >          } else {
> >              /* something we can't yet parse.  Add it to the qemu
> namespace
> >               * cmdline/environment advanced options and hope for the
> best
> > diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
> > index 6dd8bb0..0bf4c37 100644
> > --- a/tests/qemuargv2xmltest.c
> > +++ b/tests/qemuargv2xmltest.c
> > @@ -249,6 +249,7 @@ mymain(void)
> >      DO_TEST("hyperv");
> >
> >      DO_TEST("pseries-nvram");
> > +    DO_TEST("pseries-disk");
> >
> >      DO_TEST("nosharepages");
> >
> > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
> b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
> > new file mode 100644
> > index 0000000..5fc0938
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
> > @@ -0,0 +1,5 @@
> > +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test
> QEMU_AUDIO_DRV=none \
> > +/usr/bin/qemu-system-ppc64 \
> > +-S -M pseries -m 512 -smp 1 \
> > +-no-acpi -boot c -usb \
> > +-boot c -hda /dev/HostVG/QEMUGuest1 -cdrom /root/boot.iso
>
> Does -hda actually create a scsi disk on pseries? Interesting.
>

Yes. It does. :)


> > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
> b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
> > new file mode 100644
> > index 0000000..dbbd6aa
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
> > @@ -0,0 +1,40 @@
> > +<domain type='qemu'>
> > +  <name>QEMUGuest1</name>
> > +  <uuid>87eedafe-eedc-4336-8130-ed9fe5dc90c8</uuid>
> > +  <memory unit='KiB'>524288</memory>
> > +  <currentMemory unit='KiB'>524288</currentMemory>
> > +  <vcpu placement='static'>1</vcpu>
> > +  <os>
> > +    <type arch='ppc64' machine='pseries'>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-system-ppc64</emulator>
> > +    <disk type='block' device='disk'>
> > +      <driver name='qemu' type='raw'/>
> > +      <source dev='/dev/HostVG/QEMUGuest1'/>
> > +      <target dev='hda' bus='scsi'/>
> > +      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> > +    </disk>
> > +    <disk type='file' device='cdrom'>
> > +      <driver name='qemu' type='raw'/>
> > +      <source file='/root/boot.iso'/>
> > +      <target dev='hdc' bus='scsi'/>
> > +      <readonly/>
> > +      <address type='drive' controller='0' bus='0' target='0' unit='2'/>
> > +    </disk>
> > +    <controller type='usb' index='0'/>
> > +    <controller type='scsi' index='0'/>
> > +    <controller type='pci' index='0' model='pci-root'/>
> > +    <input type='mouse' bus='ps2'/>
> > +    <graphics type='sdl'/>
> > +    <video>
> > +      <model type='cirrus' vram='9216' heads='1'/>
> > +    </video>
> > +    <memballoon model='virtio'/>
> > +  </devices>
> > +</domain>
> >
>
> Does this XML actually work if you 'virsh define' it? I'd think libvirt
> would
> complain about target='hda' with bus='scsi' but I didn't confirm.
>

It works. I see that selinux option is not added by default to the xml.
Otherwise the xml works taking hda to scsiI.


> - Cole
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20131122/365bcf6b/attachment-0001.htm>


More information about the libvir-list mailing list