[libvirt PATCH 4/7] qemu: remove sharedDevices hash table

Ján Tomko jtomko at redhat.com
Thu Jan 13 17:47:39 UTC 2022


Its only use was to check conflicts of the sgio attributes between
devices shared with other domains.

Signed-off-by: Ján Tomko <jtomko at redhat.com>
---
 src/qemu/qemu_conf.c    | 292 ----------------------------------------
 src/qemu/qemu_conf.h    |  35 -----
 src/qemu/qemu_driver.c  |   3 -
 src/qemu/qemu_hostdev.c |  28 ----
 src/qemu/qemu_hotplug.c |  20 ---
 src/qemu/qemu_process.c |  27 +---
 6 files changed, 1 insertion(+), 404 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 28cbdd6e61..81449b8b77 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1450,298 +1450,6 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
 }
 
 
-struct _qemuSharedDeviceEntry {
-    size_t ref;
-    char **domains; /* array of domain names */
-};
-
-/* Construct the hash key for sharedDevices as "major:minor" */
-char *
-qemuGetSharedDeviceKey(const char *device_path)
-{
-    int maj, min;
-    int rc;
-
-    if ((rc = virGetDeviceID(device_path, &maj, &min)) < 0) {
-        virReportSystemError(-rc,
-                             _("Unable to get minor number of device '%s'"),
-                             device_path);
-        return NULL;
-    }
-
-    return g_strdup_printf("%d:%d", maj, min);
-}
-
-
-bool
-qemuSharedDeviceEntryDomainExists(qemuSharedDeviceEntry *entry,
-                                  const char *name,
-                                  int *idx)
-{
-    size_t i;
-
-    for (i = 0; i < entry->ref; i++) {
-        if (STREQ(entry->domains[i], name)) {
-            if (idx)
-                *idx = i;
-            return true;
-        }
-    }
-
-    return false;
-}
-
-void
-qemuSharedDeviceEntryFree(void *payload)
-{
-    qemuSharedDeviceEntry *entry = payload;
-    size_t i;
-
-    if (!entry)
-        return;
-
-    for (i = 0; i < entry->ref; i++)
-        g_free(entry->domains[i]);
-    g_free(entry->domains);
-    g_free(entry);
-}
-
-
-static int
-qemuSharedDeviceEntryInsert(virQEMUDriver *driver,
-                            const char *key,
-                            const char *name)
-{
-    qemuSharedDeviceEntry *entry = NULL;
-
-    if ((entry = virHashLookup(driver->sharedDevices, key))) {
-        /* Nothing to do if the shared scsi host device is already
-         * recorded in the table.
-         */
-        if (!qemuSharedDeviceEntryDomainExists(entry, name, NULL)) {
-            VIR_EXPAND_N(entry->domains, entry->ref, 1);
-            entry->domains[entry->ref - 1] = g_strdup(name);
-        }
-    } else {
-        entry = g_new0(qemuSharedDeviceEntry, 1);
-        entry->domains = g_new0(char *, 1);
-
-        entry->domains[0] = g_strdup(name);
-
-        entry->ref = 1;
-
-        if (virHashAddEntry(driver->sharedDevices, key, entry) < 0)
-            goto error;
-    }
-
-    return 0;
-
- error:
-    qemuSharedDeviceEntryFree(entry);
-    return -1;
-}
-
-
-static int
-qemuSharedDeviceEntryRemove(virQEMUDriver *driver,
-                            const char *key,
-                            const char *name)
-{
-    qemuSharedDeviceEntry *entry = NULL;
-    int idx;
-
-    if (!(entry = virHashLookup(driver->sharedDevices, key)))
-        return -1;
-
-    /* Nothing to do if the shared disk is not recorded in the table. */
-    if (!qemuSharedDeviceEntryDomainExists(entry, name, &idx))
-        return 0;
-
-    if (entry->ref != 1) {
-        VIR_FREE(entry->domains[idx]);
-        VIR_DELETE_ELEMENT(entry->domains, idx, entry->ref);
-    } else {
-        ignore_value(virHashRemoveEntry(driver->sharedDevices, key));
-    }
-
-    return 0;
-}
-
-
-static int
-qemuSharedDiskAddRemoveInternal(virQEMUDriver *driver,
-                                virDomainDiskDef *disk,
-                                const char *name,
-                                bool addDisk)
-{
-    g_autofree char *key = NULL;
-    int ret = -1;
-
-    if (virStorageSourceIsEmpty(disk->src) ||
-        !disk->src->shared ||
-        !virStorageSourceIsBlockLocal(disk->src))
-        return 0;
-
-    qemuDriverLock(driver);
-
-    if (!(key = qemuGetSharedDeviceKey(virDomainDiskGetSource(disk))))
-        goto cleanup;
-
-    if (addDisk) {
-        if (qemuSharedDeviceEntryInsert(driver, key, name) < 0)
-            goto cleanup;
-    } else {
-        if (qemuSharedDeviceEntryRemove(driver, key, name) < 0)
-            goto cleanup;
-    }
-
-    ret = 0;
- cleanup:
-    qemuDriverUnlock(driver);
-    return ret;
-}
-
-
-/* qemuAddSharedDisk:
- * @driver: Pointer to qemu driver struct
- * @src: disk source
- * @name: The domain name
- *
- * Increase ref count and add the domain name into the list which
- * records all the domains that use the shared device if the entry
- * already exists, otherwise add a new entry.
- */
-int
-qemuAddSharedDisk(virQEMUDriver *driver,
-                  virDomainDiskDef *disk,
-                  const char *name)
-{
-    return qemuSharedDiskAddRemoveInternal(driver, disk, name, true);
-}
-
-
-static bool
-qemuIsSharedHostdev(virDomainHostdevDef *hostdev)
-{
-    return (hostdev->shareable &&
-            (virHostdevIsSCSIDevice(hostdev) &&
-             hostdev->source.subsys.u.scsi.protocol !=
-             VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI));
-}
-
-
-static char *
-qemuGetHostdevPath(virDomainHostdevDef *hostdev)
-{
-    virDomainHostdevSubsysSCSI *scsisrc = &hostdev->source.subsys.u.scsi;
-    virDomainHostdevSubsysSCSIHost *scsihostsrc = &scsisrc->u.host;
-    g_autofree char *dev_name = NULL;
-
-    if (!(dev_name = virSCSIDeviceGetDevName(NULL,
-                                             scsihostsrc->adapter,
-                                             scsihostsrc->bus,
-                                             scsihostsrc->target,
-                                             scsihostsrc->unit)))
-        return NULL;
-
-    return g_strdup_printf("/dev/%s", dev_name);
-}
-
-
-static int
-qemuSharedHostdevAddRemoveInternal(virQEMUDriver *driver,
-                                   virDomainHostdevDef *hostdev,
-                                   const char *name,
-                                   bool addDevice)
-{
-    g_autofree char *dev_path = NULL;
-    g_autofree char *key = NULL;
-    int ret = -1;
-
-    if (!qemuIsSharedHostdev(hostdev))
-        return 0;
-
-    if (!(dev_path = qemuGetHostdevPath(hostdev)) ||
-        !(key = qemuGetSharedDeviceKey(dev_path)))
-        return -1;
-
-    qemuDriverLock(driver);
-
-    if (addDevice)
-        ret = qemuSharedDeviceEntryInsert(driver, key, name);
-    else
-        ret = qemuSharedDeviceEntryRemove(driver, key, name);
-
-    qemuDriverUnlock(driver);
-
-    return ret;
-}
-
-static int
-qemuSharedDeviceAddRemoveInternal(virQEMUDriver *driver,
-                                  virDomainDeviceDef *dev,
-                                  const char *name,
-                                  bool addDevice)
-{
-    /* Currently the only conflicts we have to care about for
-     * the shared disk and shared host device is "sgio" setting,
-     * which is only valid for block disk and scsi host device.
-     */
-    if (dev->type == VIR_DOMAIN_DEVICE_DISK)
-        return qemuSharedDiskAddRemoveInternal(driver, dev->data.disk,
-                                               name, addDevice);
-    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV)
-        return qemuSharedHostdevAddRemoveInternal(driver, dev->data.hostdev,
-                                                  name, addDevice);
-    return 0;
-}
-
-
-/* qemuAddSharedDevice:
- * @driver: Pointer to qemu driver struct
- * @dev: The device def
- * @name: The domain name
- *
- * Increase ref count and add the domain name into the list which
- * records all the domains that use the shared device if the entry
- * already exists, otherwise add a new entry.
- */
-int
-qemuAddSharedDevice(virQEMUDriver *driver,
-                    virDomainDeviceDef *dev,
-                    const char *name)
-{
-    return qemuSharedDeviceAddRemoveInternal(driver, dev, name, true);
-}
-
-
-int
-qemuRemoveSharedDisk(virQEMUDriver *driver,
-                     virDomainDiskDef *disk,
-                     const char *name)
-{
-    return qemuSharedDiskAddRemoveInternal(driver, disk, name, false);
-}
-
-
-/* qemuRemoveSharedDevice:
- * @driver: Pointer to qemu driver struct
- * @device: The device def
- * @name: The domain name
- *
- * Decrease ref count and remove the domain name from the list which
- * records all the domains that use the shared device if ref is not
- * 1, otherwise remove the entry.
- */
-int
-qemuRemoveSharedDevice(virQEMUDriver *driver,
-                       virDomainDeviceDef *dev,
-                       const char *name)
-{
-    return qemuSharedDeviceAddRemoveInternal(driver, dev, name, false);
-}
-
-
 int qemuDriverAllocateID(virQEMUDriver *driver)
 {
     return g_atomic_int_add(&driver->lastvmid, 1) + 1;
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 5961b0b205..c71a666aea 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -292,9 +292,6 @@ struct _virQEMUDriver {
 
     virHostdevManager *hostdevMgr;
 
-    /* Immutable pointer. Unsafe APIs. XXX */
-    GHashTable *sharedDevices;
-
     /* Immutable pointer, immutable object */
     virPortAllocatorRange *remotePorts;
 
@@ -344,38 +341,6 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
                                    virArch arch,
                                    virDomainVirtType virttype);
 
-typedef struct _qemuSharedDeviceEntry qemuSharedDeviceEntry;
-
-bool qemuSharedDeviceEntryDomainExists(qemuSharedDeviceEntry *entry,
-                                       const char *name,
-                                       int *idx)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
-char *qemuGetSharedDeviceKey(const char *disk_path)
-    ATTRIBUTE_NONNULL(1);
-
-void qemuSharedDeviceEntryFree(void *payload);
-
-int qemuAddSharedDisk(virQEMUDriver *driver,
-                      virDomainDiskDef *disk,
-                      const char *name)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
-
-int qemuAddSharedDevice(virQEMUDriver *driver,
-                        virDomainDeviceDef *dev,
-                        const char *name)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
-
-int qemuRemoveSharedDevice(virQEMUDriver *driver,
-                           virDomainDeviceDef *dev,
-                           const char *name)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
-
-int qemuRemoveSharedDisk(virQEMUDriver *driver,
-                         virDomainDiskDef *disk,
-                         const char *name)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
-
 int qemuDriverAllocateID(virQEMUDriver *driver);
 virDomainXMLOption *virQEMUDriverCreateXMLConf(virQEMUDriver *driver,
                                                  const char *defsecmodel);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 65ac5ef367..028b53b4ad 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -735,8 +735,6 @@ qemuStateInitialize(bool privileged,
     if (!(qemu_driver->hostdevMgr = virHostdevManagerGetDefault()))
         goto error;
 
-    qemu_driver->sharedDevices = virHashNew(qemuSharedDeviceEntryFree);
-
     if (qemuMigrationDstErrorInit(qemu_driver) < 0)
         goto error;
 
@@ -1078,7 +1076,6 @@ qemuStateCleanup(void)
     virPortAllocatorRangeFree(qemu_driver->migrationPorts);
     virPortAllocatorRangeFree(qemu_driver->webSocketPorts);
     virPortAllocatorRangeFree(qemu_driver->remotePorts);
-    g_clear_pointer(&qemu_driver->sharedDevices, g_hash_table_unref);
     virObjectUnref(qemu_driver->hostdevMgr);
     virObjectUnref(qemu_driver->securityManager);
     virObjectUnref(qemu_driver->domainEventState);
diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
index 5461de459a..dfe657c51e 100644
--- a/src/qemu/qemu_hostdev.c
+++ b/src/qemu/qemu_hostdev.c
@@ -272,25 +272,8 @@ qemuHostdevPrepareSCSIDevices(virQEMUDriver *driver,
                               virDomainHostdevDef **hostdevs,
                               int nhostdevs)
 {
-    size_t i;
     virHostdevManager *hostdev_mgr = driver->hostdevMgr;
 
-    /* Loop 1: Add the shared scsi host device to shared device
-     * table.
-     */
-    for (i = 0; i < nhostdevs; i++) {
-        virDomainDeviceDef dev;
-
-        if (!virHostdevIsSCSIDevice(hostdevs[i]))
-            continue;
-
-        dev.type = VIR_DOMAIN_DEVICE_HOSTDEV;
-        dev.data.hostdev = hostdevs[i];
-
-        if (qemuAddSharedDevice(driver, &dev, name) < 0)
-            return -1;
-    }
-
     return virHostdevPrepareSCSIDevices(hostdev_mgr, QEMU_DRIVER_NAME,
                                         name, hostdevs, nhostdevs);
 }
@@ -426,19 +409,8 @@ qemuHostdevReAttachSCSIDevices(virQEMUDriver *driver,
                                virDomainHostdevDef **hostdevs,
                                int nhostdevs)
 {
-    size_t i;
     virHostdevManager *hostdev_mgr = driver->hostdevMgr;
 
-    for (i = 0; i < nhostdevs; i++) {
-        virDomainHostdevDef *hostdev = hostdevs[i];
-        virDomainDeviceDef dev;
-
-        dev.type = VIR_DOMAIN_DEVICE_HOSTDEV;
-        dev.data.hostdev = hostdev;
-
-        ignore_value(qemuRemoveSharedDevice(driver, &dev, name));
-    }
-
     virHostdevReAttachSCSIDevices(hostdev_mgr, QEMU_DRIVER_NAME,
                                   name, hostdevs, nhostdevs);
 }
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 0dd3121221..9dc74d89d2 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -603,7 +603,6 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver,
     qemuDomainObjPrivate *priv = vm->privateData;
     virStorageSource *oldsrc = disk->src;
     qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-    bool sharedAdded = false;
     bool managedpr = virStorageSourceChainHasManagedPR(oldsrc) ||
                      virStorageSourceChainHasManagedPR(newsrc);
     int ret = -1;
@@ -620,11 +619,6 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver,
     if (virDomainDiskTranslateSourcePool(disk) < 0)
         goto cleanup;
 
-    if (qemuAddSharedDisk(driver, disk, vm->def->name) < 0)
-        goto cleanup;
-
-    sharedAdded = true;
-
     if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
         goto cleanup;
 
@@ -649,7 +643,6 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver,
 
     /* remove the old source from shared device list */
     disk->src = oldsrc;
-    ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
     ignore_value(qemuDomainStorageSourceChainAccessRevoke(driver, vm, oldsrc));
 
     /* media was changed, so we can remove the old media definition now */
@@ -662,9 +655,6 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver,
  cleanup:
     /* undo changes to the new disk */
     if (ret < 0) {
-        if (sharedAdded)
-            ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
-
         ignore_value(qemuDomainStorageSourceChainAccessRevoke(driver, vm, newsrc));
     }
 
@@ -977,9 +967,6 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
     if (virDomainDiskTranslateSourcePool(disk) < 0)
         goto cleanup;
 
-    if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
-        goto cleanup;
-
     if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
         goto cleanup;
 
@@ -1076,8 +1063,6 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
 
  cleanup:
     if (ret < 0) {
-        ignore_value(qemuRemoveSharedDevice(driver, dev, vm->def->name));
-
         if (releaseUSB)
             virDomainUSBAddressRelease(priv->usbaddrs, &disk->info);
 
@@ -4418,7 +4403,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
 {
     qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
     g_autoptr(qemuBlockStorageSourceChainData) diskBackend = NULL;
-    virDomainDeviceDef dev;
     size_t i;
     qemuDomainObjPrivate *priv = vm->privateData;
     bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
@@ -4482,10 +4466,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
     if (diskBackend)
         qemuDomainStorageSourceChainAccessRevoke(driver, vm, disk->src);
 
-    dev.type = VIR_DOMAIN_DEVICE_DISK;
-    dev.data.disk = disk;
-    ignore_value(qemuRemoveSharedDevice(driver, &dev, vm->def->name));
-
     if (virStorageSourceChainHasManagedPR(disk->src) &&
         qemuHotplugRemoveManagedPR(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
         goto cleanup;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b425acfec1..6203efef3a 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5022,7 +5022,7 @@ qemuProcessSetupGraphics(virQEMUDriver *driver,
 
 
 static int
-qemuProcessSetupRawIO(virQEMUDriver *driver,
+qemuProcessSetupRawIO(virQEMUDriver *driver G_GNUC_UNUSED,
                       virDomainObj *vm,
                       virCommand *cmd G_GNUC_UNUSED)
 {
@@ -5032,7 +5032,6 @@ qemuProcessSetupRawIO(virQEMUDriver *driver,
 
     /* in case a certain disk is desirous of CAP_SYS_RAWIO, add this */
     for (i = 0; i < vm->def->ndisks; i++) {
-        virDomainDeviceDef dev;
         virDomainDiskDef *disk = vm->def->disks[i];
 
         if (disk->rawio == VIR_TRISTATE_BOOL_YES) {
@@ -5041,11 +5040,6 @@ qemuProcessSetupRawIO(virQEMUDriver *driver,
             break;
 #endif
         }
-
-        dev.type = VIR_DOMAIN_DEVICE_DISK;
-        dev.data.disk = disk;
-        if (qemuAddSharedDevice(driver, &dev, vm->def->name) < 0)
-            goto cleanup;
     }
 
     /* If rawio not already set, check hostdevs as well */
@@ -5066,7 +5060,6 @@ qemuProcessSetupRawIO(virQEMUDriver *driver,
 
     ret = 0;
 
- cleanup:
     if (rawio) {
 #ifdef CAP_SYS_RAWIO
         if (ret == 0)
@@ -8134,15 +8127,6 @@ void qemuProcessStop(virQEMUDriver *driver,
         qemuSecurityRestoreAllLabel(driver, vm,
                                     !!(flags & VIR_QEMU_PROCESS_STOP_MIGRATED));
 
-    for (i = 0; i < vm->def->ndisks; i++) {
-        virDomainDeviceDef dev;
-        virDomainDiskDef *disk = vm->def->disks[i];
-
-        dev.type = VIR_DOMAIN_DEVICE_DISK;
-        dev.data.disk = disk;
-        ignore_value(qemuRemoveSharedDevice(driver, &dev, vm->def->name));
-    }
-
     /* Clear out dynamically assigned labels */
     for (i = 0; i < vm->def->nseclabels; i++) {
         if (vm->def->seclabels[i]->type == VIR_DOMAIN_SECLABEL_DYNAMIC)
@@ -8789,12 +8773,8 @@ qemuProcessReconnect(void *opaque)
     if (qemuDomainInitializePflashStorageSource(obj) < 0)
         goto error;
 
-    /* XXX: Need to change as long as lock is introduced for
-     * qemu_driver->sharedDevices.
-     */
     for (i = 0; i < obj->def->ndisks; i++) {
         virDomainDiskDef *disk = obj->def->disks[i];
-        virDomainDeviceDef dev;
 
         if (virDomainDiskTranslateSourcePool(disk) < 0)
             goto error;
@@ -8811,11 +8791,6 @@ qemuProcessReconnect(void *opaque)
         } else {
             VIR_DEBUG("skipping backing chain detection for '%s'", disk->dst);
         }
-
-        dev.type = VIR_DOMAIN_DEVICE_DISK;
-        dev.data.disk = disk;
-        if (qemuAddSharedDevice(driver, &dev, obj->def->name) < 0)
-            goto error;
     }
 
     for (i = 0; i < obj->def->ngraphics; i++) {
-- 
2.31.1




More information about the libvir-list mailing list