From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
For each vhost-user GPUs,
- build a socket chardev, and pass the vhost-user socket to it
- build a vhost-user video device and associate it with the chardev
Signed-off-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/qemu/qemu_command.c | 46 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 44 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8bef103f68..0e1d9510e5 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4672,8 +4672,15 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
goto error;
}
- if (STREQ(model, "virtio-gpu")) {
- if (qemuBuildVirtioDevStr(&buf, "virtio-gpu", qemuCaps,
+ if (video->vhostuser) {
+ if (STREQ(model, "virtio-vga"))
+ model = "vhost-user-vga";
+ if (STREQ(model, "virtio-gpu"))
+ model = "vhost-user-gpu";
+ }
+
+ if (STREQ(model, "virtio-gpu") || STREQ(model, "vhost-user-gpu"))
{
+ if (qemuBuildVirtioDevStr(&buf, model, qemuCaps,
VIR_DOMAIN_DEVICE_VIDEO, video) < 0) {
goto error;
}
@@ -4715,6 +4722,10 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
if (video->heads)
virBufferAsprintf(&buf, ",max_outputs=%u",
video->heads);
}
+ } else if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
video->vhostuser) {
+ if (video->heads)
+ virBufferAsprintf(&buf, ",max_outputs=%u", video->heads);
+ virBufferAsprintf(&buf, ",chardev=chr-vu-%s",
video->info.alias);
} else if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_MAX_OUTPUTS)) {
if (video->heads)
@@ -4830,6 +4841,23 @@ qemuBuildVgaVideoCommand(virCommandPtr cmd,
}
+static char *
+qemuBuildVhostUserChardevStr(const char *alias,
+ int *fd,
+ virCommandPtr cmd)
+{
+ char *chardev = NULL;
+
+ if (virAsprintf(&chardev, "socket,id=chr-vu-%s,fd=%d", alias, *fd) <
0)
+ return NULL;
+
+ virCommandPassFD(cmd, *fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+ *fd = -1;
+
+ return chardev;
+}
+
+
static int
qemuBuildVideoCommandLine(virCommandPtr cmd,
const virDomainDef *def,
@@ -4837,6 +4865,20 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
{
size_t i;
+ for (i = 0; i < def->nvideos; i++) {
+ VIR_AUTOFREE(char *) chardev = NULL;
+ virDomainVideoDefPtr video = def->videos[i];
+
+ if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
video->vhostuser) {
+ if (!(chardev = qemuBuildVhostUserChardevStr(video->info.alias,
+
&video->info.vhost_user_fd,
+ cmd)))
+ return -1;
+
+ virCommandAddArgList(cmd, "-chardev", chardev, NULL);
+ }
+ }
+
for (i = 0; i < def->nvideos; i++) {
char *str = NULL;
virDomainVideoDefPtr video = def->videos[i];
--
2.21.0