On 2013年01月04日 04:02, Eric Blake wrote:
On 01/02/2013 07:37 AM, Osier Yang wrote:
This introduces a hash table for qemu driver, to store the shared
disk's info as (@major:minor, @ref_count). @ref_count is the number
of domains which shares the disk.

Since we only care about if the disk support unprivileged SG_IO
commands, and the SG_IO commands only make sense for block disk,
this patch only manages (add/remove hash entry) the shared disk for
block disk.

* src/qemu/qemu_conf.h: (Add member 'sharedDisks' of type
                          virHashTablePtr; Declare helpers
                          qemuGetSharedDiskKey, qemuAddSharedDisk
                          and qemuRemoveSharedDisk)
* src/qemu/qemu_conf.c (Implement the 3 helpers)
* src/qemu/qemu_process.c (Update 'sharedDisks' when domain
                            starting and shutdown)
* src/qemu/qemu_driver.c (Update 'sharedDisks' when attaching
                           or detaching disk).
---
  src/qemu/qemu_conf.c    |   86 +++++++++++++++++++++++++++++++++++++++++++++++
  src/qemu/qemu_conf.h    |   12 ++++++
  src/qemu/qemu_driver.c  |   22 ++++++++++++
  src/qemu/qemu_process.c |   15 ++++++++
  4 files changed, 135 insertions(+), 0 deletions(-)

ACK, as I'd like to see this go in sooner rather than later, and what
you have works.  However...


diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index c6deb10..8440247 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -552,3 +552,89 @@ qemuDriverCloseCallbackRunAll(virQEMUDriverPtr driver,

      virHashForEach(driver->closeCallbacks, qemuDriverCloseCallbackRun,&data);
  }
+
+/* Construct the hash key for sharedDisks as "major:minor" */
+char *
+qemuGetSharedDiskKey(const char *disk_path)
+{

Why are we converting major and minor into a malloc'd char*,...

+    int major, minor;

Here, I'd use 'maj' and 'min' to avoid any shadowing of the major() and
minor() macros.

Oh, okay, I missed that.


+int
+qemuAddSharedDisk(virHashTablePtr sharedDisks,
+                  const char *disk_path)
+{
+    size_t *ref = NULL;
+    char *key = NULL;
+
+    if (!(key = qemuGetSharedDiskKey(disk_path)))
+        return -1;
+
+    if ((ref = virHashLookup(sharedDisks, key))) {

...when you could just use a single int value comprising the combination
of major and minor as the hash key, if only you had used

Sounds good, how about something like "805516", where "8" is major, and "16" is the minor? It should be small enough to be not overflowing.

virHashCreateFull() with custom comparators.  That would be more
efficient (no need to malloc each kay, comparisons are much faster as an
integer compare instead of a strcmp, and so on).  It may be worth a
followup patch that re-does the hash table to be more efficient.

+++ b/src/qemu/qemu_driver.c
@@ -843,6 +843,9 @@ qemuStartup(bool privileged,
      if ((qemu_driver->inactivePciHostdevs = pciDeviceListNew()) == NULL)
          goto error;

+    if (!(qemu_driver->sharedDisks = virHashCreate(30, NULL)))

Here's where the virHashCreateFull would let you avoid having to convert
the key into a string.


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to