]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: put virtiofsd in the emulator cgroup
authorJán Tomko <jtomko@redhat.com>
Tue, 18 Feb 2020 15:12:29 +0000 (16:12 +0100)
committerJán Tomko <jtomko@redhat.com>
Wed, 4 Mar 2020 11:08:50 +0000 (12:08 +0100)
Wire up the code to put virtiofsd in the emulator cgroup on domain
startup.

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Tested-by: Andrea Bolognani <abologna@redhat.com>
src/qemu/qemu_extdevice.c
src/qemu/qemu_virtiofs.c
src/qemu/qemu_virtiofs.h

index bfa770f45a16550321392606dc5d3b145a58b14a..f66bafb62fee35e92850d00057fa2276b1c87110 100644 (file)
@@ -248,6 +248,13 @@ qemuExtDevicesHasDevice(virDomainDefPtr def)
     if (def->tpm && def->tpm->type == VIR_DOMAIN_TPM_TYPE_EMULATOR)
         return true;
 
+    for (i = 0; i < def->nfss; i++) {
+        virDomainFSDefPtr fs = def->fss[i];
+
+        if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS)
+            return true;
+    }
+
     return false;
 }
 
@@ -272,5 +279,13 @@ qemuExtDevicesSetupCgroup(virQEMUDriverPtr driver,
         qemuExtTPMSetupCgroup(driver, def, cgroup) < 0)
         return -1;
 
+    for (i = 0; i < def->nfss; i++) {
+        virDomainFSDefPtr fs = def->fss[i];
+
+        if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS &&
+            qemuVirtioFSSetupCgroup(vm, fs, cgroup) < 0)
+            return -1;
+    }
+
     return 0;
 }
index 09ab2cef27d2e231eb664f3911770bf773b23d3e..194855ece8614c6bf94b09ed0d9d0b51febd45a3 100644 (file)
@@ -299,3 +299,29 @@ qemuVirtioFSStop(virQEMUDriverPtr driver G_GNUC_UNUSED,
  cleanup:
     virErrorRestore(&orig_err);
 }
+
+
+int
+qemuVirtioFSSetupCgroup(virDomainObjPtr vm,
+                        virDomainFSDefPtr fs,
+                        virCgroupPtr cgroup)
+{
+    g_autofree char *pidfile = NULL;
+    pid_t pid = -1;
+    int rc;
+
+    if (!(pidfile = qemuVirtioFSCreatePidFilename(vm, fs->info.alias)))
+        return -1;
+
+    rc = virPidFileReadPathIfAlive(pidfile, &pid, NULL);
+    if (rc < 0 || pid == (pid_t) -1) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("virtiofsd died unexpectedly"));
+        return -1;
+    }
+
+    if (virCgroupAddProcess(cgroup, pid) < 0)
+        return -1;
+
+    return 0;
+}
index b2f0c57d0cba5879f96ddbbd1f20e41b2598828d..1db59917c6fd388ddb03dccb94dfecd8a153198f 100644 (file)
@@ -35,3 +35,8 @@ void
 qemuVirtioFSStop(virQEMUDriverPtr driver,
                  virDomainObjPtr vm,
                  virDomainFSDefPtr fs);
+
+int
+qemuVirtioFSSetupCgroup(virDomainObjPtr vm,
+                        virDomainFSDefPtr fs,
+                        virCgroupPtr cgroup);