]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_hotplug: Prepare NVMe disks on hotplug
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 9 Jul 2019 15:39:33 +0000 (17:39 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 17 Dec 2019 09:04:44 +0000 (10:04 +0100)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Cole Robinson <crobinso@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_hostdev.c
src/qemu/qemu_hostdev.h

index eeaa14379afd20ab9e66c93bdbc0dd75459e5d61..20a96297608bf1c55d381b720a103c4845961791 100644 (file)
@@ -11531,6 +11531,54 @@ typedef enum {
 } qemuDomainStorageSourceAccessFlags;
 
 
+static int
+qemuDomainStorageSourceAccessModifyNVMe(virQEMUDriverPtr driver,
+                                        virDomainObjPtr vm,
+                                        virStorageSourcePtr src,
+                                        bool revoke)
+{
+    bool revoke_maxmemlock = false;
+    bool revoke_hostdev = false;
+    int ret = -1;
+
+    if (!virStorageSourceChainHasNVMe(src))
+        return 0;
+
+    VIR_DEBUG("Modifying access for a NVMe disk src=%p revoke=%d",
+              src, revoke);
+
+    if (revoke) {
+        revoke_maxmemlock = true;
+        revoke_hostdev = true;
+        ret = 0;
+        goto revoke;
+    }
+
+    if (qemuDomainAdjustMaxMemLock(vm, true) < 0)
+        goto revoke;
+
+    revoke_maxmemlock = true;
+
+    if (qemuHostdevPrepareOneNVMeDisk(driver, vm->def->name, src) < 0)
+        goto revoke;
+
+    revoke_hostdev = true;
+
+    return 0;
+
+ revoke:
+    if (revoke_maxmemlock) {
+        if (qemuDomainAdjustMaxMemLock(vm, false) < 0)
+            VIR_WARN("Unable to change max memlock limit");
+    }
+
+    if (revoke_hostdev)
+        qemuHostdevReAttachOneNVMeDisk(driver, vm->def->name, src);
+
+    return ret;
+}
+
+
 /**
  * qemuDomainStorageSourceAccessModify:
  * @driver: qemu driver struct
@@ -11562,6 +11610,7 @@ qemuDomainStorageSourceAccessModify(virQEMUDriverPtr driver,
     bool revoke_cgroup = false;
     bool revoke_label = false;
     bool revoke_namespace = false;
+    bool revoke_nvme = false;
     bool revoke_lockspace = false;
 
     VIR_DEBUG("src='%s' readonly=%d force_ro=%d force_rw=%d revoke=%d chain=%d",
@@ -11579,6 +11628,7 @@ qemuDomainStorageSourceAccessModify(virQEMUDriverPtr driver,
         revoke_cgroup = true;
         revoke_label = true;
         revoke_namespace = true;
+        revoke_nvme = true;
         revoke_lockspace = true;
         ret = 0;
         goto revoke;
@@ -11589,6 +11639,11 @@ qemuDomainStorageSourceAccessModify(virQEMUDriverPtr driver,
 
     revoke_lockspace = true;
 
+    if (qemuDomainStorageSourceAccessModifyNVMe(driver, vm, src, false) < 0)
+        goto revoke;
+
+    revoke_nvme = true;
+
     /* When modifying access of existing @src namespace does not need update */
     if (!(flags & QEMU_DOMAIN_STORAGE_SOURCE_ACCESS_MODIFY_ACCESS)) {
         if (qemuDomainNamespaceSetupDisk(vm, src) < 0)
@@ -11639,6 +11694,9 @@ qemuDomainStorageSourceAccessModify(virQEMUDriverPtr driver,
             VIR_WARN("Unable to remove /dev entry for %s", srcstr);
     }
 
+    if (revoke_nvme)
+        qemuDomainStorageSourceAccessModifyNVMe(driver, vm, src, true);
+
     if (revoke_lockspace) {
         if (virDomainLockImageDetach(driver->lockManager, vm, src) < 0)
             VIR_WARN("Unable to release lock on %s", srcstr);
index 5ab0217858e8b1228cf2d6b241ab24f27f67da3f..6ab052724a5551eada737819a75e10aac873a7e5 100644 (file)
@@ -212,6 +212,17 @@ qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDefPtr *hostdevs,
     return true;
 }
 
+int
+qemuHostdevPrepareOneNVMeDisk(virQEMUDriverPtr driver,
+                              const char *name,
+                              virStorageSourcePtr src)
+{
+    return virHostdevPrepareOneNVMeDevice(driver->hostdevMgr,
+                                          QEMU_DRIVER_NAME,
+                                          name,
+                                          src);
+}
+
 int
 qemuHostdevPrepareNVMeDisks(virQEMUDriverPtr driver,
                             const char *name,
@@ -369,6 +380,17 @@ qemuHostdevPrepareDomainDevices(virQEMUDriverPtr driver,
     return 0;
 }
 
+void
+qemuHostdevReAttachOneNVMeDisk(virQEMUDriverPtr driver,
+                               const char *name,
+                               virStorageSourcePtr src)
+{
+    virHostdevReAttachOneNVMeDevice(driver->hostdevMgr,
+                                    QEMU_DRIVER_NAME,
+                                    name,
+                                    src);
+}
+
 void
 qemuHostdevReAttachNVMeDisks(virQEMUDriverPtr driver,
                              const char *name,
index 735414b6aa389c3633f605d34bffb5e7c29af72d..23df9255290bdb29d626c65b39f2ab3419abc744 100644 (file)
@@ -41,6 +41,9 @@ int qemuHostdevUpdateActiveSCSIDevices(virQEMUDriverPtr driver,
 int qemuHostdevUpdateActiveDomainDevices(virQEMUDriverPtr driver,
                                          virDomainDefPtr def);
 
+int qemuHostdevPrepareOneNVMeDisk(virQEMUDriverPtr driver,
+                                  const char *name,
+                                  virStorageSourcePtr src);
 int qemuHostdevPrepareNVMeDisks(virQEMUDriverPtr driver,
                                 const char *name,
                                 virDomainDiskDefPtr *disks,
@@ -74,6 +77,9 @@ int qemuHostdevPrepareDomainDevices(virQEMUDriverPtr driver,
                                     virQEMUCapsPtr qemuCaps,
                                     unsigned int flags);
 
+void qemuHostdevReAttachOneNVMeDisk(virQEMUDriverPtr driver,
+                                    const char *name,
+                                    virStorageSourcePtr src);
 void qemuHostdevReAttachNVMeDisks(virQEMUDriverPtr driver,
                                   const char *name,
                                   virDomainDiskDefPtr *disks,