[libvirt] [PATCH v3 0/4]use newer video device by -device in qemu commandline

v2: Check qemu version, it has to be qemu >= 1.2 for using new video device with -device qemu option v3: Add a new caps bit QEMU_CAPS_1DOT20_PLUS to mark qemu >= 1.2 Add a new testcase for improved qemu commandline Fixed all placed pointed out in v2 This patch set aims to use qemu VGA device with -device option to replace -vga option. The mapping is as follows. '-device VGA' maps to '-vga std' '-device cirrus-vga' maps to '-vga cirrus' '-device qxl-vga' maps to '-vga qxl' (there is also '-device qxl' for secondary devices) '-device vmware-svga' maps to '-vga vmware' Through this change, guests will be able to use any available PCI slot number rather than fixed 0x2 slot for primary video device. Guannan Ren(4) [PATCH v3 1/4] qemu: add qemu vga devices caps and one cap to mark them [PATCH v3 2/4] conf: add optional attribte primary to video <model> [PATCH v3 3/4] qemu: use newer -device video device in qemu commandline [PATCH v3 4/4] tests: add one -device video device testcase docs/formatdomain.html.in | 6 ++++- docs/schemas/domaincommon.rng | 8 ++++++ src/conf/domain_conf.c | 27 ++++++++++++++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 14 ++++++++++- src/qemu/qemu_capabilities.h | 5 ++++ src/qemu/qemu_command.c | 178 ++++++++++++++++++++++++++++++++++++.. src/qemu/qemu_command.h | 4 ++- tests/qemuhelptest.c | 50 +++++++++++++++++++++++++++++++------- tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args | 9 +++++++ tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml | 44 +++++++++++++++++++++++++++++++++ tests/qemuxml2argvtest.c | 14 ++++++++--- 12 files changed, 293 insertions(+), 67 deletions(-)

QEMU_CAPS_DEVICE_QXL -device qxl QEMU_CAPS_DEVICE_VGA -device VGA QEMU_CAPS_DEVICE_CIRRUS_VGA -device cirrus-vga QEMU_CAPS_DEVICE_VMWARE_SVGA -device vmware-svga QEMU_CAPS_1DOT20_PLUS /* safe to use -device XXX for primary video device */ Fix a typo in qemuCapsObjectTypes, the string 'qxl' here should be -device qxl rather than -vga [...|qxl|..] --- src/qemu/qemu_capabilities.c | 14 ++++++++++++- src/qemu/qemu_capabilities.h | 5 +++++ tests/qemuhelptest.c | 50 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 98e65f1..e186443 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -194,6 +194,12 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST, "usb-redir.bootindex", "usb-host.bootindex", "blockdev-snapshot-sync", + "qxl", + + "VGA", /* 120 */ + "cirrus-vga", + "vmware-svga", + "qemu1.20+" ); struct _qemuCaps { @@ -1177,6 +1183,9 @@ qemuCapsComputeCmdFlags(const char *help, if (version >= 11000) qemuCapsSet(caps, QEMU_CAPS_CPU_HOST); + + if (version >= 1002000) + qemuCapsSet(caps, QEMU_CAPS_1DOT20_PLUS); return 0; } @@ -1322,11 +1331,14 @@ struct qemuCapsStringFlags qemuCapsObjectTypes[] = { { "virtio-scsi-pci", QEMU_CAPS_VIRTIO_SCSI_PCI }, { "spicevmc", QEMU_CAPS_DEVICE_SPICEVMC }, { "qxl-vga", QEMU_CAPS_DEVICE_QXL_VGA }, - { "qxl", QEMU_CAPS_VGA_QXL }, + { "qxl", QEMU_CAPS_DEVICE_QXL }, { "sga", QEMU_CAPS_SGA }, { "scsi-block", QEMU_CAPS_SCSI_BLOCK }, { "scsi-cd", QEMU_CAPS_SCSI_CD }, { "ide-cd", QEMU_CAPS_IDE_CD }, + { "VGA", QEMU_CAPS_DEVICE_VGA }, + { "cirrus-vga", QEMU_CAPS_DEVICE_CIRRUS_VGA }, + { "vmware-svga", QEMU_CAPS_DEVICE_VMWARE_SVGA }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 3da8672..4a092ab 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -156,6 +156,11 @@ enum qemuCapsFlags { QEMU_CAPS_USB_REDIR_BOOTINDEX = 116, /* usb-redir.bootindex */ QEMU_CAPS_USB_HOST_BOOTINDEX = 117, /* usb-host.bootindex */ QEMU_CAPS_DISK_SNAPSHOT = 118, /* blockdev-snapshot-sync command */ + QEMU_CAPS_DEVICE_QXL = 119, /* -device qxl */ + QEMU_CAPS_DEVICE_VGA = 120, /* -device VGA */ + QEMU_CAPS_DEVICE_CIRRUS_VGA = 121, /* -device cirrus-vga */ + QEMU_CAPS_DEVICE_VMWARE_SVGA = 122, /* -device vmware-svga */ + QEMU_CAPS_1DOT20_PLUS = 123, /* safe to use -device XXX for primary video device */ QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 021b3dc..0c6b106 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -391,7 +391,11 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -477,7 +481,6 @@ mymain(void) QEMU_CAPS_NESTING, QEMU_CAPS_NAME_PROCESS, QEMU_CAPS_SMBIOS_TYPE, - QEMU_CAPS_VGA_QXL, QEMU_CAPS_SPICE, QEMU_CAPS_VGA_NONE, QEMU_CAPS_MIGRATE_QEMU_FD, @@ -495,7 +498,11 @@ mymain(void) QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_SCSI_LSI, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -554,7 +561,11 @@ mymain(void) QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -623,7 +634,10 @@ mymain(void) QEMU_CAPS_CPU_HOST, QEMU_CAPS_SCSI_CD, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -697,7 +711,11 @@ mymain(void) QEMU_CAPS_IDE_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-1.1.0", 1001000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -779,7 +797,11 @@ mymain(void) QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-1.2.0", 1002000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -871,7 +893,12 @@ mymain(void) QEMU_CAPS_DUMP_GUEST_CORE, QEMU_CAPS_VNC, QEMU_CAPS_USB_REDIR_BOOTINDEX, - QEMU_CAPS_USB_HOST_BOOTINDEX); + QEMU_CAPS_USB_HOST_BOOTINDEX, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA, + QEMU_CAPS_1DOT20_PLUS); DO_TEST("qemu-kvm-1.2.0", 1002000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -968,7 +995,12 @@ mymain(void) QEMU_CAPS_DUMP_GUEST_CORE, QEMU_CAPS_VNC, QEMU_CAPS_USB_REDIR_BOOTINDEX, - QEMU_CAPS_USB_HOST_BOOTINDEX); + QEMU_CAPS_USB_HOST_BOOTINDEX, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA, + QEMU_CAPS_1DOT20_PLUS); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.7.11.2

On 12/13/2012 02:06 AM, Guannan Ren wrote:
QEMU_CAPS_DEVICE_QXL -device qxl QEMU_CAPS_DEVICE_VGA -device VGA QEMU_CAPS_DEVICE_CIRRUS_VGA -device cirrus-vga QEMU_CAPS_DEVICE_VMWARE_SVGA -device vmware-svga
QEMU_CAPS_1DOT20_PLUS /* safe to use -device XXX for primary video device */
NACK to this name; see my complaints on the cover letter. We'll need a v4 that picks a name more appropriate to the actual feature being tested, rather than a name that merely reflects our current implementation of why we decided the feature is available. Hmm, maybe I misunderstood what the actual feature is when I suggested QEMU_CAPS_SECONDARY_DISPLAY; based on the comment you used here, maybe a better name is QEMU_CAPS_PRIMARY_DISPLAY_DEVICE.
+ + "VGA", /* 120 */ + "cirrus-vga", + "vmware-svga", + "qemu1.20+"
Again, this XML name does not reflect the feature; we need something nicer.
);
struct _qemuCaps { @@ -1177,6 +1183,9 @@ qemuCapsComputeCmdFlags(const char *help,
if (version >= 11000) qemuCapsSet(caps, QEMU_CAPS_CPU_HOST); + + if (version >= 1002000) + qemuCapsSet(caps, QEMU_CAPS_1DOT20_PLUS); return 0;
And here, what I envision if Red Hat decides to backport this feature into their qemu 0.12.1.x monster, the Red Hat specific backport patch would look like: + + if (version >= 1002000) + qemuCapsSet(caps, QEMU_CAPS_PRIMARY_DISPLAY_DEVICE); +#if BACKPORT_ONLY + else if (version is 12001 but feature is backported) + qemuCapsSet(caps, QEMU_CAPS_PRIMARY_DISPLAY_DEVICE); +#endif Remember, RHEL 6.x qemu will NOT be version 1.2 or later, it will stay at version 0.12.1 + lots of backports. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

QEMU_CAPS_DEVICE_QXL -device qxl QEMU_CAPS_DEVICE_VGA -device VGA QEMU_CAPS_DEVICE_CIRRUS_VGA -device cirrus-vga QEMU_CAPS_DEVICE_VMWARE_SVGA -device vmware-svga QEMU_CAPS_DEVICE_VIDEO_PRIMARY /* safe to use -device XXX for primary video device */ Fix a typo in qemuCapsObjectTypes, the string 'qxl' here should be -device qxl rather than -vga [...|qxl|..] --- src/qemu/qemu_capabilities.c | 14 ++++++++++++- src/qemu/qemu_capabilities.h | 5 +++++ tests/qemuhelptest.c | 50 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 98e65f1..e186443 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -194,6 +194,12 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST, "usb-redir.bootindex", "usb-host.bootindex", "blockdev-snapshot-sync", + "qxl", + + "VGA", /* 120 */ + "cirrus-vga", + "vmware-svga", + "device-video-primary", ); struct _qemuCaps { @@ -1177,6 +1183,9 @@ qemuCapsComputeCmdFlags(const char *help, if (version >= 11000) qemuCapsSet(caps, QEMU_CAPS_CPU_HOST); + + if (version >= 1002000) + qemuCapsSet(caps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); return 0; } @@ -1322,11 +1331,14 @@ struct qemuCapsStringFlags qemuCapsObjectTypes[] = { { "virtio-scsi-pci", QEMU_CAPS_VIRTIO_SCSI_PCI }, { "spicevmc", QEMU_CAPS_DEVICE_SPICEVMC }, { "qxl-vga", QEMU_CAPS_DEVICE_QXL_VGA }, - { "qxl", QEMU_CAPS_VGA_QXL }, + { "qxl", QEMU_CAPS_DEVICE_QXL }, { "sga", QEMU_CAPS_SGA }, { "scsi-block", QEMU_CAPS_SCSI_BLOCK }, { "scsi-cd", QEMU_CAPS_SCSI_CD }, { "ide-cd", QEMU_CAPS_IDE_CD }, + { "VGA", QEMU_CAPS_DEVICE_VGA }, + { "cirrus-vga", QEMU_CAPS_DEVICE_CIRRUS_VGA }, + { "vmware-svga", QEMU_CAPS_DEVICE_VMWARE_SVGA }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 3da8672..4a092ab 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -156,6 +156,12 @@ enum qemuCapsFlags { QEMU_CAPS_USB_REDIR_BOOTINDEX = 116, /* usb-redir.bootindex */ QEMU_CAPS_USB_HOST_BOOTINDEX = 117, /* usb-host.bootindex */ QEMU_CAPS_DISK_SNAPSHOT = 118, /* blockdev-snapshot-sync command */ + QEMU_CAPS_DEVICE_QXL = 119, /* -device qxl */ + QEMU_CAPS_DEVICE_VGA = 120, /* -device VGA */ + QEMU_CAPS_DEVICE_CIRRUS_VGA = 121, /* -device cirrus-vga */ + QEMU_CAPS_DEVICE_VMWARE_SVGA = 122, /* -device vmware-svga */ + QEMU_CAPS_DEVICE_VIDEO_PRIMARY = 123, /* safe to use -device XXX + for primary video device */ QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 021b3dc..0c6b106 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -391,7 +391,11 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -477,7 +481,6 @@ mymain(void) QEMU_CAPS_NESTING, QEMU_CAPS_NAME_PROCESS, QEMU_CAPS_SMBIOS_TYPE, - QEMU_CAPS_VGA_QXL, QEMU_CAPS_SPICE, QEMU_CAPS_VGA_NONE, QEMU_CAPS_MIGRATE_QEMU_FD, @@ -495,7 +498,11 @@ mymain(void) QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_SCSI_LSI, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -554,7 +561,11 @@ mymain(void) QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -623,7 +634,10 @@ mymain(void) QEMU_CAPS_CPU_HOST, QEMU_CAPS_SCSI_CD, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -697,7 +711,11 @@ mymain(void) QEMU_CAPS_IDE_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-1.1.0", 1001000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -779,7 +797,11 @@ mymain(void) QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI_PCI, QEMU_CAPS_BLOCKIO, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA); DO_TEST("qemu-1.2.0", 1002000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -871,7 +893,12 @@ mymain(void) QEMU_CAPS_DUMP_GUEST_CORE, QEMU_CAPS_VNC, QEMU_CAPS_USB_REDIR_BOOTINDEX, - QEMU_CAPS_USB_HOST_BOOTINDEX); + QEMU_CAPS_USB_HOST_BOOTINDEX, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA, + QEMU_CAPS_DEVICE_VIDEO_PRIMARY); DO_TEST("qemu-kvm-1.2.0", 1002000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -968,7 +995,12 @@ mymain(void) QEMU_CAPS_DUMP_GUEST_CORE, QEMU_CAPS_VNC, QEMU_CAPS_USB_REDIR_BOOTINDEX, - QEMU_CAPS_USB_HOST_BOOTINDEX); + QEMU_CAPS_USB_HOST_BOOTINDEX, + QEMU_CAPS_DEVICE_QXL, + QEMU_CAPS_DEVICE_VGA, + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_VMWARE_SVGA, + QEMU_CAPS_DEVICE_VIDEO_PRIMARY); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.7.11.2

On 12/14/2012 12:06 AM, Guannan Ren wrote:
QEMU_CAPS_DEVICE_QXL -device qxl QEMU_CAPS_DEVICE_VGA -device VGA QEMU_CAPS_DEVICE_CIRRUS_VGA -device cirrus-vga QEMU_CAPS_DEVICE_VMWARE_SVGA -device vmware-svga
QEMU_CAPS_DEVICE_VIDEO_PRIMARY /* safe to use -device XXX for primary video device */
Fix a typo in qemuCapsObjectTypes, the string 'qxl' here should be -device qxl rather than -vga [...|qxl|..] --- src/qemu/qemu_capabilities.c | 14 ++++++++++++- src/qemu/qemu_capabilities.h | 5 +++++ tests/qemuhelptest.c | 50 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 10 deletions(-)
Much better. ACK; but I'd like a second opinion on whether this is a candidate on 1.0.1 or whether we should wait until post-release, since it missed rc2. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

If there are multiple video devices primary = 'yes' marks this video device as the primary one. The rest are secondary video devices. No more than one could be mark as primary. If none of them has primary attribute, the first one will be the primary by default like what it was. The reason of this changing is that for qemu, only one primary video device is permitted which can be of any type. For secondary video devices, only qxl is allowd. Primary attribute removes the restriction that the first have to be the primary one. We always put the primary video device into the first position of video device structure array after parsing. --- docs/formatdomain.html.in | 6 +++++- docs/schemas/domaincommon.rng | 8 ++++++++ src/conf/domain_conf.c | 27 ++++++++++++++++++++++++++- src/conf/domain_conf.h | 1 + 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 8e234fd..7a11a0d 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3500,7 +3500,11 @@ qemu-kvm -net nic,model=? /dev/null will add a default <code>video</code> according to the guest type. For a guest of type "kvm", the default <code>video</code> for it is: <code>type</code> with value "cirrus", <code>vram</code> with value - "9216", and <code>heads</code> with value "1". + "9216", and <code>heads</code> with value "1". By default, the first + video device in domain xml is the primary one, but the optional + attribute <code>primary</code> (<span class="since">since 1.0.2</span>) + with value 'yes' can be used to mark the primary in cases of mutiple + video device. The non-primary must be type of "qxl". </dd> <dt><code>model</code></dt> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 14344e2..cdc5115 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2260,6 +2260,14 @@ </attribute> </optional> <optional> + <attribute name="primary"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + </optional> + <optional> <element name="acceleration"> <optional> <attribute name="accel3d"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 12eeb5e..f847aeb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7275,6 +7275,7 @@ virDomainVideoDefParseXML(const xmlNodePtr node, char *type = NULL; char *heads = NULL; char *vram = NULL; + char *primary = NULL; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -7289,6 +7290,11 @@ virDomainVideoDefParseXML(const xmlNodePtr node, type = virXMLPropString(cur, "type"); vram = virXMLPropString(cur, "vram"); heads = virXMLPropString(cur, "heads"); + + if ((primary = virXMLPropString(cur, "primary")) != NULL) + if (STREQ(primary, "yes")) + def->primary = 1; + def->accel = virDomainVideoAccelDefParseXML(cur); } } @@ -8709,6 +8715,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, xmlNodePtr cur; bool usb_none = false; bool usb_other = false; + bool primaryVideo = false; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -10001,7 +10008,23 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, flags); if (!video) goto error; - def->videos[def->nvideos++] = video; + + size_t ii = def->nvideos; + if (video->primary) { + if (primaryVideo) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only one primary video device is supported")); + goto error; + } + + ii = 0; + primaryVideo = true; + } + if (VIR_INSERT_ELEMENT_INPLACE(def->videos, + ii, + def->nvideos, + video) < 0) + goto error; } VIR_FREE(nodes); @@ -13151,6 +13174,8 @@ virDomainVideoDefFormat(virBufferPtr buf, virBufferAsprintf(buf, " vram='%u'", def->vram); if (def->heads) virBufferAsprintf(buf, " heads='%u'", def->heads); + if (def->primary) + virBufferAddLit(buf, " primary='yes'"); if (def->accel) { virBufferAddLit(buf, ">\n"); virDomainVideoAccelDefFormat(buf, def->accel); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e6659cd..bc9ef88 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1121,6 +1121,7 @@ struct _virDomainVideoDef { int type; unsigned int vram; unsigned int heads; + bool primary; virDomainVideoAccelDefPtr accel; virDomainDeviceInfo info; }; -- 1.7.11.2

On 12/13/2012 02:06 AM, Guannan Ren wrote:
If there are multiple video devices primary = 'yes' marks this video device as the primary one. The rest are secondary video devices. No more than one could be mark as primary. If none of them has primary attribute, the first one will be the primary by default like what it was. The reason of this changing is that for qemu, only one primary video device is permitted which can be of any type. For secondary video devices, only qxl is allowd. Primary attribute removes the restriction that the first have to be the primary one.
We always put the primary video device into the first position of video device structure array after parsing.
@@ -10001,7 +10008,23 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, flags); if (!video) goto error; - def->videos[def->nvideos++] = video; + + size_t ii = def->nvideos;
The compiler didn't warn about a declaration after a goto? C99 permits this late declaration, but our style has tended to be more like C89 with declarations hoisted to the top. ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

'-device VGA' maps to '-vga std' '-device cirrus-vga' maps to '-vga cirrus' '-device qxl-vga' maps to '-vga qxl' (there is also '-device qxl' for secondary devices) '-device vmware-svga' maps to '-vga vmware' For qemu(>=1.2), we can use -device to replace -vga for video device. For the primary video device, the patch trys to use 0x2 slot for matching old qemu. If the 0x2 slot is allocated already, the addr property could help for using any available slot. For qemu(< 1.2), we keep using -vga for primary device. --- src/qemu/qemu_command.c | 178 +++++++++++++++++++++++++++++++++-------------- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvtest.c | 9 ++- 3 files changed, 136 insertions(+), 55 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e10eb09..c6783d9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -93,6 +93,16 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, "", /* don't support vbox */ "qxl"); +VIR_ENUM_DECL(qemuDeviceVideo) + +VIR_ENUM_IMPL(qemuDeviceVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, + "VGA", + "cirrus-vga", + "vmware-svga", + "", /* no device for xen */ + "", /* don't support vbox */ + "qxl-vga"); + VIR_ENUM_DECL(qemuSoundCodec) VIR_ENUM_IMPL(qemuSoundCodec, VIR_DOMAIN_SOUND_CODEC_TYPE_LAST, @@ -1063,7 +1073,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def))) goto cleanup; - if (qemuAssignDevicePCISlots(def, addrs) < 0) + if (qemuAssignDevicePCISlots(def, caps, addrs) < 0) goto cleanup; } @@ -1421,12 +1431,15 @@ int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, * skip over info.type == PCI */ int -qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) +qemuAssignDevicePCISlots(virDomainDefPtr def, + qemuCapsPtr caps, + qemuDomainPCIAddressSetPtr addrs) { size_t i, j; bool reservedIDE = false; bool reservedUSB = false; int function; + bool qemuDeviceVideoUsable = qemuCapsGet(caps, QEMU_CAPS_1DOT20_PLUS); /* Host bridge */ if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0) @@ -1493,29 +1506,42 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) goto error; } - /* First VGA is hardcoded slot=2 */ if (def->nvideos > 0) { - if (def->videos[0]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { - if (def->videos[0]->info.addr.pci.domain != 0 || - def->videos[0]->info.addr.pci.bus != 0 || - def->videos[0]->info.addr.pci.slot != 2 || - def->videos[0]->info.addr.pci.function != 0) { + virDomainVideoDefPtr primaryVideo = def->videos[0]; + if (primaryVideo->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + primaryVideo->info.addr.pci.domain = 0; + primaryVideo->info.addr.pci.bus = 0; + primaryVideo->info.addr.pci.slot = 2; + primaryVideo->info.addr.pci.function = 0; + + if (qemuDomainPCIAddressCheckSlot(addrs, &primaryVideo->info) < 0) { + if (qemuDeviceVideoUsable) { + virResetLastError(); + if (qemuDomainPCIAddressSetNextAddr(addrs, &primaryVideo->info) < 0) + goto error; + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("PCI address 0:0:2.0 is in use, " + "QEMU needs it for primary video")); + goto error; + } + } else if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) { + goto error; + } + } else if (!qemuDeviceVideoUsable) { + if (primaryVideo->info.addr.pci.domain != 0 || + primaryVideo->info.addr.pci.bus != 0 || + primaryVideo->info.addr.pci.slot != 2 || + primaryVideo->info.addr.pci.function != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Primary video card must have PCI address 0:0:2.0")); goto error; } /* If TYPE==PCI, then qemuCollectPCIAddress() function * has already reserved the address, so we must skip */ - } else { - def->videos[0]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - def->videos[0]->info.addr.pci.domain = 0; - def->videos[0]->info.addr.pci.bus = 0; - def->videos[0]->info.addr.pci.slot = 2; - def->videos[0]->info.addr.pci.function = 0; - if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) - goto error; } - } else { + } else if (!qemuDeviceVideoUsable) { virDomainDeviceInfo dev; memset(&dev, 0, sizeof(dev)); dev.addr.pci.slot = 2; @@ -1688,8 +1714,13 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) goto error; } - /* Further non-primary video cards */ + /* Further non-primary video cards which have to be qxl type */ for (i = 1; i < def->nvideos ; i++) { + if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("non-primary video device must be type of 'qxl'")); + goto error; + } if (def->videos[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) continue; if (qemuDomainPCIAddressSetNextAddr(addrs, &def->videos[i]->info) < 0) @@ -3507,16 +3538,35 @@ error: } static char * -qemuBuildVideoDevStr(virDomainVideoDefPtr video, - qemuCapsPtr caps) +qemuBuildDeviceVideoStr(virDomainVideoDefPtr video, + qemuCapsPtr caps, + bool primary) { virBuffer buf = VIR_BUFFER_INITIALIZER; - const char *model = qemuVideoTypeToString(video->type); + const char *model; - if (!model) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid video model")); - goto error; + if (primary) { + model = qemuDeviceVideoTypeToString(video->type); + if (!model || STREQ(model, "")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type %s is not supported with QEMU"), + virDomainVideoTypeToString(video->type)); + goto error; + } + } else { + if (video->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("non-primary video device must be type of 'qxl'")); + goto error; + } + + if (!qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("only one video card is currently supported")); + goto error; + } + + model = "qxl"; } virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias); @@ -6433,22 +6483,42 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } if (def->nvideos > 0) { - if (qemuCapsGet(caps, QEMU_CAPS_VGA)) { - if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) { + int primaryVideoType = def->videos[0]->type; + if (qemuCapsGet(caps, QEMU_CAPS_1DOT20_PLUS) && + ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VGA && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_VGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_CIRRUS && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_CIRRUS_VGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VMVGA && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_VMWARE_SVGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL_VGA))) + ) { + for (i = 0 ; i < def->nvideos ; i++) { + char *str; + virCommandAddArg(cmd, "-device"); + if (!(str = qemuBuildDeviceVideoStr(def->videos[i], caps, !i))) + goto error; + + virCommandAddArg(cmd, str); + VIR_FREE(str); + } + } else if (qemuCapsGet(caps, QEMU_CAPS_VGA)) { + if (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_XEN) { /* nothing - vga has no effect on Xen pvfb */ } else { - if ((def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) && + if ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL) && !qemuCapsGet(caps, QEMU_CAPS_VGA_QXL)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("This QEMU does not support QXL graphics adapters")); goto error; } - const char *vgastr = qemuVideoTypeToString(def->videos[0]->type); + const char *vgastr = qemuVideoTypeToString(primaryVideoType); if (!vgastr || STREQ(vgastr, "")) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("video type %s is not supported with QEMU"), - virDomainVideoTypeToString(def->videos[0]->type)); + virDomainVideoTypeToString(primaryVideoType)); goto error; } @@ -6475,6 +6545,32 @@ qemuBuildCommandLine(virConnectPtr conn, } } } + + if (def->nvideos > 1) { + if (qemuCapsGet(caps, QEMU_CAPS_DEVICE)) { + for (i = 1 ; i < def->nvideos ; i++) { + char *str; + if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type %s is only valid as primary video card"), + virDomainVideoTypeToString(def->videos[0]->type)); + goto error; + } + + virCommandAddArg(cmd, "-device"); + + if (!(str = qemuBuildDeviceVideoStr(def->videos[i], caps, false))) + goto error; + + virCommandAddArg(cmd, str); + VIR_FREE(str); + } + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("only one video card is currently supported")); + goto error; + } + } } else { switch (def->videos[0]->type) { @@ -6497,28 +6593,8 @@ qemuBuildCommandLine(virConnectPtr conn, virDomainVideoTypeToString(def->videos[0]->type)); goto error; } - } - - if (def->nvideos > 1) { - if (qemuCapsGet(caps, QEMU_CAPS_DEVICE)) { - for (i = 1 ; i < def->nvideos ; i++) { - char *str; - if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("video type %s is only valid as primary video card"), - virDomainVideoTypeToString(def->videos[0]->type)); - goto error; - } - virCommandAddArg(cmd, "-device"); - - if (!(str = qemuBuildVideoDevStr(def->videos[i], caps))) - goto error; - - virCommandAddArg(cmd, str); - VIR_FREE(str); - } - } else { + if (def->nvideos > 1) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("only one video card is currently supported")); goto error; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 6556e6e..0dde4be 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -211,7 +211,9 @@ int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot); void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs); -int qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs); +int qemuAssignDevicePCISlots(virDomainDefPtr def, + qemuCapsPtr caps, + qemuDomainPCIAddressSetPtr addrs); int qemuAssignDeviceAliases(virDomainDefPtr def, qemuCapsPtr caps); int qemuDomainNetVLAN(virDomainNetDefPtr def); diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index bb233ed..ae6c2a8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -574,7 +574,8 @@ mymain(void) QEMU_CAPS_VGA, QEMU_CAPS_VGA_NONE); DO_TEST("graphics-spice", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, - QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); + QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-agentmouse", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, @@ -582,7 +583,8 @@ mymain(void) QEMU_CAPS_NODEFCONFIG); DO_TEST("graphics-spice-compression", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, - QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); + QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-timeout", QEMU_CAPS_DRIVE, QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, @@ -591,7 +593,8 @@ mymain(void) DO_TEST("graphics-spice-qxl-vga", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, - QEMU_CAPS_DEVICE_QXL_VGA); + QEMU_CAPS_DEVICE_QXL_VGA, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-usb-redir", QEMU_CAPS_VGA, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, -- 1.7.11.2

On 12/13/2012 02:06 AM, Guannan Ren wrote:
'-device VGA' maps to '-vga std' '-device cirrus-vga' maps to '-vga cirrus' '-device qxl-vga' maps to '-vga qxl' (there is also '-device qxl' for secondary devices) '-device vmware-svga' maps to '-vga vmware'
For qemu(>=1.2), we can use -device to replace -vga for video device. For the primary video device, the patch trys to use 0x2
s/trys/tries/
slot for matching old qemu. If the 0x2 slot is allocated already, the addr property could help for using any available slot. For qemu(< 1.2), we keep using -vga for primary device. --- src/qemu/qemu_command.c | 178 +++++++++++++++++++++++++++++++++-------------- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvtest.c | 9 ++- 3 files changed, 136 insertions(+), 55 deletions(-)
+qemuAssignDevicePCISlots(virDomainDefPtr def, + qemuCapsPtr caps, + qemuDomainPCIAddressSetPtr addrs) { size_t i, j; bool reservedIDE = false; bool reservedUSB = false; int function; + bool qemuDeviceVideoUsable = qemuCapsGet(caps, QEMU_CAPS_1DOT20_PLUS);
This will need to change based on the rename in 1/4.
@@ -6433,22 +6483,42 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } if (def->nvideos > 0) { - if (qemuCapsGet(caps, QEMU_CAPS_VGA)) { - if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) { + int primaryVideoType = def->videos[0]->type; + if (qemuCapsGet(caps, QEMU_CAPS_1DOT20_PLUS) &&
and another place. The rest of this seems reasonable. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

'-device VGA' maps to '-vga std' '-device cirrus-vga' maps to '-vga cirrus' '-device qxl-vga' maps to '-vga qxl' (there is also '-device qxl' for secondary devices) '-device vmware-svga' maps to '-vga vmware' For qemu(>=1.2), we can use -device to replace -vga for video device. For the primary video device, the patch tries to use 0x2 slot for matching old qemu. If the 0x2 slot is allocated already, the addr property could help for using any available slot. For qemu(< 1.2), we keep using -vga for primary device. --- src/qemu/qemu_command.c | 178 +++++++++++++++++++++++++++++++++-------------- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvtest.c | 9 ++- 3 files changed, 136 insertions(+), 55 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e10eb09..c6783d9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -93,6 +93,16 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, "", /* don't support vbox */ "qxl"); +VIR_ENUM_DECL(qemuDeviceVideo) + +VIR_ENUM_IMPL(qemuDeviceVideo, VIR_DOMAIN_VIDEO_TYPE_LAST, + "VGA", + "cirrus-vga", + "vmware-svga", + "", /* no device for xen */ + "", /* don't support vbox */ + "qxl-vga"); + VIR_ENUM_DECL(qemuSoundCodec) VIR_ENUM_IMPL(qemuSoundCodec, VIR_DOMAIN_SOUND_CODEC_TYPE_LAST, @@ -1063,7 +1073,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def))) goto cleanup; - if (qemuAssignDevicePCISlots(def, addrs) < 0) + if (qemuAssignDevicePCISlots(def, caps, addrs) < 0) goto cleanup; } @@ -1421,12 +1431,15 @@ int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, * skip over info.type == PCI */ int -qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) +qemuAssignDevicePCISlots(virDomainDefPtr def, + qemuCapsPtr caps, + qemuDomainPCIAddressSetPtr addrs) { size_t i, j; bool reservedIDE = false; bool reservedUSB = false; int function; + bool qemuDeviceVideoUsable = qemuCapsGet(caps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); /* Host bridge */ if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0) @@ -1493,29 +1506,42 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) goto error; } - /* First VGA is hardcoded slot=2 */ if (def->nvideos > 0) { - if (def->videos[0]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { - if (def->videos[0]->info.addr.pci.domain != 0 || - def->videos[0]->info.addr.pci.bus != 0 || - def->videos[0]->info.addr.pci.slot != 2 || - def->videos[0]->info.addr.pci.function != 0) { + virDomainVideoDefPtr primaryVideo = def->videos[0]; + if (primaryVideo->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + primaryVideo->info.addr.pci.domain = 0; + primaryVideo->info.addr.pci.bus = 0; + primaryVideo->info.addr.pci.slot = 2; + primaryVideo->info.addr.pci.function = 0; + + if (qemuDomainPCIAddressCheckSlot(addrs, &primaryVideo->info) < 0) { + if (qemuDeviceVideoUsable) { + virResetLastError(); + if (qemuDomainPCIAddressSetNextAddr(addrs, &primaryVideo->info) < 0) + goto error; + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("PCI address 0:0:2.0 is in use, " + "QEMU needs it for primary video")); + goto error; + } + } else if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) { + goto error; + } + } else if (!qemuDeviceVideoUsable) { + if (primaryVideo->info.addr.pci.domain != 0 || + primaryVideo->info.addr.pci.bus != 0 || + primaryVideo->info.addr.pci.slot != 2 || + primaryVideo->info.addr.pci.function != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Primary video card must have PCI address 0:0:2.0")); goto error; } /* If TYPE==PCI, then qemuCollectPCIAddress() function * has already reserved the address, so we must skip */ - } else { - def->videos[0]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - def->videos[0]->info.addr.pci.domain = 0; - def->videos[0]->info.addr.pci.bus = 0; - def->videos[0]->info.addr.pci.slot = 2; - def->videos[0]->info.addr.pci.function = 0; - if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) - goto error; } - } else { + } else if (!qemuDeviceVideoUsable) { virDomainDeviceInfo dev; memset(&dev, 0, sizeof(dev)); dev.addr.pci.slot = 2; @@ -1688,8 +1714,13 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs) goto error; } - /* Further non-primary video cards */ + /* Further non-primary video cards which have to be qxl type */ for (i = 1; i < def->nvideos ; i++) { + if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("non-primary video device must be type of 'qxl'")); + goto error; + } if (def->videos[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) continue; if (qemuDomainPCIAddressSetNextAddr(addrs, &def->videos[i]->info) < 0) @@ -3507,16 +3538,35 @@ error: } static char * -qemuBuildVideoDevStr(virDomainVideoDefPtr video, - qemuCapsPtr caps) +qemuBuildDeviceVideoStr(virDomainVideoDefPtr video, + qemuCapsPtr caps, + bool primary) { virBuffer buf = VIR_BUFFER_INITIALIZER; - const char *model = qemuVideoTypeToString(video->type); + const char *model; - if (!model) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid video model")); - goto error; + if (primary) { + model = qemuDeviceVideoTypeToString(video->type); + if (!model || STREQ(model, "")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type %s is not supported with QEMU"), + virDomainVideoTypeToString(video->type)); + goto error; + } + } else { + if (video->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("non-primary video device must be type of 'qxl'")); + goto error; + } + + if (!qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("only one video card is currently supported")); + goto error; + } + + model = "qxl"; } virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias); @@ -6433,22 +6483,42 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } if (def->nvideos > 0) { - if (qemuCapsGet(caps, QEMU_CAPS_VGA)) { - if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) { + int primaryVideoType = def->videos[0]->type; + if (qemuCapsGet(caps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY) && + ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VGA && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_VGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_CIRRUS && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_CIRRUS_VGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VMVGA && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_VMWARE_SVGA)) || + (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL && + qemuCapsGet(caps, QEMU_CAPS_DEVICE_QXL_VGA))) + ) { + for (i = 0 ; i < def->nvideos ; i++) { + char *str; + virCommandAddArg(cmd, "-device"); + if (!(str = qemuBuildDeviceVideoStr(def->videos[i], caps, !i))) + goto error; + + virCommandAddArg(cmd, str); + VIR_FREE(str); + } + } else if (qemuCapsGet(caps, QEMU_CAPS_VGA)) { + if (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_XEN) { /* nothing - vga has no effect on Xen pvfb */ } else { - if ((def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) && + if ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL) && !qemuCapsGet(caps, QEMU_CAPS_VGA_QXL)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("This QEMU does not support QXL graphics adapters")); goto error; } - const char *vgastr = qemuVideoTypeToString(def->videos[0]->type); + const char *vgastr = qemuVideoTypeToString(primaryVideoType); if (!vgastr || STREQ(vgastr, "")) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("video type %s is not supported with QEMU"), - virDomainVideoTypeToString(def->videos[0]->type)); + virDomainVideoTypeToString(primaryVideoType)); goto error; } @@ -6475,6 +6545,32 @@ qemuBuildCommandLine(virConnectPtr conn, } } } + + if (def->nvideos > 1) { + if (qemuCapsGet(caps, QEMU_CAPS_DEVICE)) { + for (i = 1 ; i < def->nvideos ; i++) { + char *str; + if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("video type %s is only valid as primary video card"), + virDomainVideoTypeToString(def->videos[0]->type)); + goto error; + } + + virCommandAddArg(cmd, "-device"); + + if (!(str = qemuBuildDeviceVideoStr(def->videos[i], caps, false))) + goto error; + + virCommandAddArg(cmd, str); + VIR_FREE(str); + } + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("only one video card is currently supported")); + goto error; + } + } } else { switch (def->videos[0]->type) { @@ -6497,28 +6593,8 @@ qemuBuildCommandLine(virConnectPtr conn, virDomainVideoTypeToString(def->videos[0]->type)); goto error; } - } - - if (def->nvideos > 1) { - if (qemuCapsGet(caps, QEMU_CAPS_DEVICE)) { - for (i = 1 ; i < def->nvideos ; i++) { - char *str; - if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("video type %s is only valid as primary video card"), - virDomainVideoTypeToString(def->videos[0]->type)); - goto error; - } - virCommandAddArg(cmd, "-device"); - - if (!(str = qemuBuildVideoDevStr(def->videos[i], caps))) - goto error; - - virCommandAddArg(cmd, str); - VIR_FREE(str); - } - } else { + if (def->nvideos > 1) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("only one video card is currently supported")); goto error; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 6556e6e..0dde4be 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -211,7 +211,9 @@ int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot); void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs); -int qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs); +int qemuAssignDevicePCISlots(virDomainDefPtr def, + qemuCapsPtr caps, + qemuDomainPCIAddressSetPtr addrs); int qemuAssignDeviceAliases(virDomainDefPtr def, qemuCapsPtr caps); int qemuDomainNetVLAN(virDomainNetDefPtr def); diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index bb233ed..ae6c2a8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -574,7 +574,8 @@ mymain(void) QEMU_CAPS_VGA, QEMU_CAPS_VGA_NONE); DO_TEST("graphics-spice", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, - QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); + QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-agentmouse", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, @@ -582,7 +583,8 @@ mymain(void) QEMU_CAPS_NODEFCONFIG); DO_TEST("graphics-spice-compression", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, - QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE); + QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-timeout", QEMU_CAPS_DRIVE, QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, @@ -591,7 +593,8 @@ mymain(void) DO_TEST("graphics-spice-qxl-vga", QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE, - QEMU_CAPS_DEVICE_QXL_VGA); + QEMU_CAPS_DEVICE_QXL_VGA, + QEMU_CAPS_DEVICE_QXL); DO_TEST("graphics-spice-usb-redir", QEMU_CAPS_VGA, QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, -- 1.7.11.2

The testcase is for testing non-fixed PCI address for primary video device and using video args to -deivce qemu option. --- .../qemuxml2argv-video-device-pciaddr-default.args | 9 +++++ .../qemuxml2argv-video-device-pciaddr-default.xml | 44 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args new file mode 100644 index 0000000..9ce852f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args @@ -0,0 +1,9 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu -S -M pc-0.15 -m 1024 -smp 1 -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-usb \ +-hda /var/lib/libvirt/images/QEMUGuest1 -vnc 127.0.0.1:-5900 \ +-device qxl-vga,id=video0,vram_size=67108864,bus=pci.0,addr=0x3 \ +-device qxl,id=video1,vram_size=67108864,bus=pci.0,addr=0x4 \ +-device qxl,id=video2,vram_size=67108864,bus=pci.0,addr=0x5 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml new file mode 100644 index 0000000..120e7f4 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml @@ -0,0 +1,44 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>cdbebdfa-1d6d-65c3-be0f-fd74b978a773</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc-0.15'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' cache='none'/> + <source file='/var/lib/libvirt/images/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + </controller> + <controller type='ide' index='0'> + </controller> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='qxl' vram='65536' heads='1'/> + </video> + <video> + <model type='qxl' vram='65536' heads='1' primary='yes'/> + </video> + <video> + <model type='qxl' vram='65536' heads='1'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ae6c2a8..fe131ff 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -869,6 +869,11 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD, QEMU_CAPS_BLOCKIO); + DO_TEST("video-device-pciaddr-default", + QEMU_CAPS_KVM, QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE, QEMU_CAPS_1DOT20_PLUS, + QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_QXL_VGA); + VIR_FREE(driver.stateDir); virCapabilitiesFree(driver.caps); VIR_FREE(map); -- 1.7.11.2

On 12/13/2012 02:06 AM, Guannan Ren wrote:
The testcase is for testing non-fixed PCI address for primary video device and using video args to -deivce qemu option. --- .../qemuxml2argv-video-device-pciaddr-default.args | 9 +++++ .../qemuxml2argv-video-device-pciaddr-default.xml | 44 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml
+++ b/tests/qemuxml2argvtest.c @@ -869,6 +869,11 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD, QEMU_CAPS_BLOCKIO);
+ DO_TEST("video-device-pciaddr-default", + QEMU_CAPS_KVM, QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE, QEMU_CAPS_1DOT20_PLUS,
ACK, once you rebase on top of the naming fix in 1/4. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

The testcase is for testing non-fixed PCI address for primary video device and using video args to -deivce qemu option. --- .../qemuxml2argv-video-device-pciaddr-default.args | 9 +++++ .../qemuxml2argv-video-device-pciaddr-default.xml | 44 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args new file mode 100644 index 0000000..9ce852f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args @@ -0,0 +1,9 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu -S -M pc-0.15 -m 1024 -smp 1 -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-usb \ +-hda /var/lib/libvirt/images/QEMUGuest1 -vnc 127.0.0.1:-5900 \ +-device qxl-vga,id=video0,vram_size=67108864,bus=pci.0,addr=0x3 \ +-device qxl,id=video1,vram_size=67108864,bus=pci.0,addr=0x4 \ +-device qxl,id=video2,vram_size=67108864,bus=pci.0,addr=0x5 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml new file mode 100644 index 0000000..120e7f4 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml @@ -0,0 +1,44 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>cdbebdfa-1d6d-65c3-be0f-fd74b978a773</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc-0.15'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' cache='none'/> + <source file='/var/lib/libvirt/images/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + </controller> + <controller type='ide' index='0'> + </controller> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='qxl' vram='65536' heads='1'/> + </video> + <video> + <model type='qxl' vram='65536' heads='1' primary='yes'/> + </video> + <video> + <model type='qxl' vram='65536' heads='1'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ae6c2a8..fe131ff 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -869,6 +869,11 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_IDE_CD, QEMU_CAPS_BLOCKIO); + DO_TEST("video-device-pciaddr-default", + QEMU_CAPS_KVM, QEMU_CAPS_VNC, + QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, + QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_QXL_VGA); + VIR_FREE(driver.stateDir); virCapabilitiesFree(driver.caps); VIR_FREE(map); -- 1.7.11.2

On 12/13/2012 02:06 AM, Guannan Ren wrote:
v2: Check qemu version, it has to be qemu >= 1.2 for using new video device with -device qemu option v3: Add a new caps bit QEMU_CAPS_1DOT20_PLUS to mark qemu >= 1.2
Not quite what I had in mind. The bit should be named based on what FEATURE we are using, not what version check we used when determining to set that bit. Something like: QEMU_CAPS_SECONDARY_DISPLAY /* supports secondary qxl displays */ would be a more appropriate naming. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 12/13/2012 05:06 PM, Guannan Ren wrote:
v2: Check qemu version, it has to be qemu >= 1.2 for using new video device with -device qemu option v3: Add a new caps bit QEMU_CAPS_1DOT20_PLUS to mark qemu >= 1.2 Add a new testcase for improved qemu commandline Fixed all placed pointed out in v2
This patch set aims to use qemu VGA device with -device option to replace -vga option. The mapping is as follows.
'-device VGA' maps to '-vga std' '-device cirrus-vga' maps to '-vga cirrus' '-device qxl-vga' maps to '-vga qxl' (there is also '-device qxl' for secondary devices) '-device vmware-svga' maps to '-vga vmware'
Through this change, guests will be able to use any available PCI slot number rather than fixed 0x2 slot for primary video device.
Guannan Ren(4) [PATCH v3 1/4] qemu: add qemu vga devices caps and one cap to mark them [PATCH v3 2/4] conf: add optional attribte primary to video <model> [PATCH v3 3/4] qemu: use newer -device video device in qemu commandline [PATCH v3 4/4] tests: add one -device video device testcase
docs/formatdomain.html.in | 6 ++++- docs/schemas/domaincommon.rng | 8 ++++++ src/conf/domain_conf.c | 27 ++++++++++++++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 14 ++++++++++- src/qemu/qemu_capabilities.h | 5 ++++ src/qemu/qemu_command.c | 178 ++++++++++++++++++++++++++++++++++++.. src/qemu/qemu_command.h | 4 ++- tests/qemuhelptest.c | 50 +++++++++++++++++++++++++++++++------- tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.args | 9 +++++++ tests/qemuxml2argvdata/qemuxml2argv-video-device-pciaddr-default.xml | 44 +++++++++++++++++++++++++++++++++ tests/qemuxml2argvtest.c | 14 ++++++++--- 12 files changed, 293 insertions(+), 67 deletions(-)
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Thanks the review and pushed. Guannan
participants (2)
-
Eric Blake
-
Guannan Ren