[libvirt] [PATCH REPOST v2 3/3] qemu: Add configuration variable to control nodedev enumeration

John Ferlan jferlan at redhat.com
Tue Feb 21 16:33:28 UTC 2017


Add an 'enumerate_nodedev' qemu configuration variable to control
whether the node device enumeration and add/remove event notification
mechanism is enabled. This ensures only those environments that desire
to utilize a domain vHBA need to have the (slight) overhead of adding
the device hash table to qemu and managing add/remove events for
specific scsi_host and scsi_target events.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/qemu/libvirtd_qemu.aug         |  1 +
 src/qemu/qemu.conf                 | 19 +++++++++++++++++++
 src/qemu/qemu_conf.c               |  5 +++++
 src/qemu/qemu_conf.h               |  3 +++
 src/qemu/qemu_driver.c             | 33 +++++++++++++++++++--------------
 src/qemu/test_libvirtd_qemu.aug.in |  1 +
 6 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
index 82bae9e..ef759ce 100644
--- a/src/qemu/libvirtd_qemu.aug
+++ b/src/qemu/libvirtd_qemu.aug
@@ -92,6 +92,7 @@ module Libvirtd_qemu =
    let device_entry = bool_entry "mac_filter"
                  | bool_entry "relaxed_acs_check"
                  | bool_entry "allow_disk_format_probing"
+                 | bool_entry "nodedev_enumeration"
                  | str_entry "lock_manager"
 
    let rpc_entry = int_entry "max_queued"
diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index 9f990c2..712473e 100644
--- a/src/qemu/qemu.conf
+++ b/src/qemu/qemu.conf
@@ -531,6 +531,25 @@
 #allow_disk_format_probing = 1
 
 
+# In order for a properly configured qemu domain to be able to passthrough
+# NPIV vHBA LUN's to the guest qemu will need to enumerate all the node
+# device's and then handle the add and remove events. In order to enable
+# qemu to handle this, set this parameter to 1 and restart libvirtd. This
+# enables communication between qemu and udev node device event management
+# to provide the functionality. When a domain is started or reconnected
+# with a vHBA controller configured in the domain XML or when a vHBA
+# controller is hot-plugged, the qemu driver will handle the "scsi_hostN"
+# device creation and removal events by hot-(un)plugging "scsi_targetB_T_L"
+# (Bus, Target, Lun) Direct-Access LUNs to/from the guest.
+#
+# This is not required for qemu domain environments that utilize the Storage
+# Pool NPIV vHBA's to define LUNs in the domain XML.
+#
+# Defaults to 0.
+#
+#nodedev_enumeration = 1
+
+
 # In order to prevent accidentally starting two domains that
 # share one writable disk, libvirt offers two approaches for
 # locking files. The first one is sanlock, the other one,
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 476179f..5f480d5 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -349,6 +349,8 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged)
         goto error;
 #endif
 
+    cfg->nodeDeviceEnumeration = false;
+
     return cfg;
 
  error:
@@ -712,6 +714,9 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
         goto cleanup;
     if (virConfGetValueBool(conf, "allow_disk_format_probing", &cfg->allowDiskFormatProbing) < 0)
         goto cleanup;
+    if (virConfGetValueBool(conf, "nodedev_enumeration",
+                            &cfg->nodeDeviceEnumeration) < 0)
+        goto cleanup;
     if (virConfGetValueBool(conf, "set_process_name", &cfg->setProcessName) < 0)
         goto cleanup;
     if (virConfGetValueUInt(conf, "max_processes", &cfg->maxProcesses) < 0)
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index d47c9cc..10ccb54 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -198,6 +198,9 @@ struct _virQEMUDriverConfig {
     unsigned int glusterDebugLevel;
 
     char *memoryBackingDir;
+
+    /* Node device enumeration enabled */
+    bool nodeDeviceEnumeration;
 };
 
 /* Main driver state */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 546fea7..db0cf87 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -799,22 +799,27 @@ qemuStateInitialize(bool privileged,
     if (!(qemu_driver->sharedDevices = virHashCreate(30, qemuSharedDeviceEntryFree)))
         goto error;
 
-    /* Create a hash table to keep track of node device's by name */
-    if (!(qemu_driver->nodeDevices = virHashCreate(100, NULL)))
-        goto error;
+    /* If node device enumeration is enabled, create a hash table to
+     * keep track of node device's by name and set up a callback mechanism
+     * with the node device conf code to get called whenever a node device
+     * is added or removed. */
+    if (cfg->nodeDeviceEnumeration) {
+        if (!(qemu_driver->nodeDevices = virHashCreate(100, NULL)))
+            goto error;
 
-    /* Set up a callback mechanism with the node device conf code to get
-     * called whenever a node device is added or removed. */
-    if (!(nodedevEnumCb =
-          virNodeDeviceRegisterCallbackDriver(&qemuNodedevCallbackDriver)))
-        goto error;
+        /* Set up a callback mechanism with the node device conf code to get
+         * called whenever a node device is added or removed. */
+        if (!(nodedevEnumCb =
+              virNodeDeviceRegisterCallbackDriver(&qemuNodedevCallbackDriver)))
+            goto error;
 
-    /* Setting the add/remove callback first ensures that there is no
-     * window of opportunity for a device to be added after enumeration
-     * is complete, but before the callback is in place. So, set the
-     * callback first, then do the enumeration. */
-    if (nodedevEnumCb(qemuNodeDeviceAdd) < 0)
-        goto error;
+        /* Setting the add/remove callback first ensures that there is no
+         * window of opportunity for a device to be added after enumeration
+         * is complete, but before the callback is in place. So, set the
+         * callback first, then do the enumeration. */
+        if (nodedevEnumCb(qemuNodeDeviceAdd) < 0)
+            goto error;
+    }
 
     if (qemuMigrationErrorInit(qemu_driver) < 0)
         goto error;
diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qemu.aug.in
index 6f03898..9b29fff 100644
--- a/src/qemu/test_libvirtd_qemu.aug.in
+++ b/src/qemu/test_libvirtd_qemu.aug.in
@@ -73,6 +73,7 @@ module Test_libvirtd_qemu =
 { "mac_filter" = "1" }
 { "relaxed_acs_check" = "1" }
 { "allow_disk_format_probing" = "1" }
+{ "nodedev_enumeration" = "1" }
 { "lock_manager" = "lockd" }
 { "max_queued" = "0" }
 { "keepalive_interval" = "5" }
-- 
2.9.3




More information about the libvir-list mailing list