]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Sort cache banks in capabilities XML
authorMartin Kletzander <mkletzan@redhat.com>
Fri, 10 Nov 2017 12:19:31 +0000 (13:19 +0100)
committerMartin Kletzander <mkletzan@redhat.com>
Sat, 18 Nov 2017 09:45:10 +0000 (10:45 +0100)
Because the cache banks are initialized based on the order in which their
respective directories exist on the filesystem, they can appear in different
order.  This is here mainly for tests because the cache directory might have
different order of children nodes and tests would fail otherwise.  It should not
be the case with sysfs, but one can never be sure.  And this does not take
almost any extra time, mainly because it gets initialized once per driver.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/conf/capabilities.c

index 9920a675aca335e0b0361e84b7384666ea909514..1f7d8cdb31475dc4515a049b7385fe788c15ad72 100644 (file)
@@ -1561,6 +1561,23 @@ virCapsHostCacheBankFree(virCapsHostCacheBankPtr ptr)
     VIR_FREE(ptr);
 }
 
+
+static int
+virCapsHostCacheBankSorter(const void *a,
+                           const void *b)
+{
+    virCapsHostCacheBankPtr ca = *(virCapsHostCacheBankPtr *)a;
+    virCapsHostCacheBankPtr cb = *(virCapsHostCacheBankPtr *)b;
+
+    if (ca->level < cb->level)
+        return -1;
+    if (ca->level > cb->level)
+        return 1;
+
+    return ca->id - cb->id;
+}
+
+
 int
 virCapabilitiesInitCaches(virCapsPtr caps)
 {
@@ -1700,6 +1717,12 @@ virCapabilitiesInitCaches(virCapsPtr caps)
             goto cleanup;
     }
 
+    /* Sort the array in order for the tests to be predictable.  This way we can
+     * still traverse the directory instead of guessing names (in case there is
+     * 'index1' and 'index3' but no 'index2'). */
+    qsort(caps->host.caches, caps->host.ncaches,
+          sizeof(*caps->host.caches), virCapsHostCacheBankSorter);
+
     ret = 0;
  cleanup:
     VIR_FREE(type);