On 11/20/14 20:21, Pavel Hrdina wrote:
Add attribute to set vgamem_mb parameter of QXL device for QEMU.
This
value sets the size of VGA framebuffer for QXL device. Default value in
QEMU is 8MB so reuse it also in libvirt to not break things.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1076098
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
docs/formatdomain.html.in | 4 +++-
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 26 ++++++++++++++++++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_command.c | 22 ++++++++++++++++--
src/qemu/qemu_domain.c | 18 +++++++++++++++
.../qemuxml2argv-graphics-spice-compression.xml | 4 ++--
.../qemuxml2argv-graphics-spice-qxl-vga.xml | 4 ++--
.../qemuxml2argv-graphics-spice.xml | 4 ++--
.../qemuxml2argv-pcihole64-q35.xml | 2 +-
tests/qemuxml2argvdata/qemuxml2argv-q35.xml | 2 +-
.../qemuxml2argv-serial-spiceport.xml | 2 +-
.../qemuxml2argv-video-qxl-device-vgamem.args | 4 ++--
.../qemuxml2argv-video-qxl-sec-device-vgamem.args | 6 ++---
tests/qemuxml2argvtest.c | 6 +++--
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml | 2 +-
16 files changed, 92 insertions(+), 20 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 4e6b919..444e681 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4704,7 +4704,9 @@ qemu-kvm -net nic,model=? /dev/null
only and specifies the size of the primary bar, while the optional
attribute <code>vram</code> specifies the secondary bar size.
If "ram" or "vram" are not supplied a default value is
used. The ram
- should also be rounded to power of two as vram.
+ should also be rounded to power of two as vram. There is also optional
+ attribute <code>vgamem</code> (<span
class="since">since 1.2.11</span>)
qemu only
+ to set the size of VGA framebuffer for fallback mode of
QXL device.
</p>
</dd>
...
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b6ea6e4..c89afc2 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1278,6 +1278,7 @@ struct _virDomainVideoDef {
int type;
unsigned int ram; /* kibibytes (multiples of 1024) */
unsigned int vram; /* kibibytes (multiples of 1024) */
+ unsigned int vgamem; /* kibibytes (multiples of 1024) */
They are now also powers of two, aren't they? also "multiples of 1024"
in that case means "at least 1024". We should state that in the comment
also in the previous patch that changes the meaning of the two above.
unsigned int heads;
bool primary;
virDomainVideoAccelDefPtr accel;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index ac36567..5c0ca75 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5031,6 +5031,12 @@ qemuBuildDeviceVideoStr(virDomainDefPtr def,
/* QEMU accepts bytes for vram_size. */
virBufferAsprintf(&buf, ",vram_size=%u", video->vram *
1024);
}
+
+ if ((primary && virQEMUCapsGet(qemuCaps, QEMU_CAPS_QXL_VGA_VGAMEM)) ||
+ (!primary && virQEMUCapsGet(qemuCaps, QEMU_CAPS_QXL_VGAMEM))) {
+ /* QEMU accepts mibibytes for vgamem_mb. */
mebibytes
+ virBufferAsprintf(&buf, ",vgamem_mb=%u",
video->vgamem / 1024);
+ }
} else if (video->vram &&
((video->type == VIR_DOMAIN_VIDEO_TYPE_VGA &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_VGA_VGAMEM)) ||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 01bf39b..0dc3ed2 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1176,6 +1176,24 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
goto cleanup;
}
+ if (dev->type == VIR_DOMAIN_DEVICE_VIDEO &&
+ dev->data.video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
+ if (dev->data.video->vgamem) {
+ if (dev->data.video->vgamem % 1024) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("value for 'vgamem' must be multiple of
1024"));
+ goto cleanup;
+ }
+ if (dev->data.video->vgamem !=
VIR_ROUND_UP_POWER_OF_TWO(dev->data.video->vgamem)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("value for 'vgamem' must be power of
two"));
+ goto cleanup;
+ }
Again, these two checks together form a condition "at least 1024 &&
power of two"
+ } else {
+ dev->data.video->vgamem = 8 * 1024;
+ }
+ }
+
ret = 0;
cleanup:
Peter