[libvirt] [PATCH v2 4/4] tests: hostdev: Add more tests

Andrea Bolognani abologna at redhat.com
Fri Mar 18 17:03:53 UTC 2016


Ensure the code behaves properly even for situations that were not
being considered before, such as simply detaching devices from the
host without attaching them to a guest and attaching devices as
managed even though they had already been manually detached from
the host.
---
 tests/virhostdevtest.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 78 insertions(+), 6 deletions(-)

diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c
index 5eb2e7e..610b02a 100644
--- a/tests/virhostdevtest.c
+++ b/tests/virhostdevtest.c
@@ -253,7 +253,7 @@ testVirHostdevReAttachPCIHostdevs_unmanaged(void)
 }
 
 static int
-testVirHostdevPreparePCIHostdevs_managed(void)
+testVirHostdevPreparePCIHostdevs_managed(bool mixed)
 {
     int ret = -1;
     size_t active_count, inactive_count, i;
@@ -270,7 +270,13 @@ testVirHostdevPreparePCIHostdevs_managed(void)
                                      hostdevs, nhostdevs, 0) < 0)
         goto cleanup;
     CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count + nhostdevs);
-    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
+    /* If testing a mixed roundtrip, devices are already in the inactive list
+     * before we start and are removed from it as soon as we attach them to
+     * the guest */
+    if (mixed)
+        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count - nhostdevs);
+    else
+        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
 
     /* Test conflict */
     active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
@@ -304,7 +310,7 @@ testVirHostdevPreparePCIHostdevs_managed(void)
 }
 
 static int
-testVirHostdevReAttachPCIHostdevs_managed(void)
+testVirHostdevReAttachPCIHostdevs_managed(bool mixed)
 {
     int ret = -1;
     size_t active_count, inactive_count, i;
@@ -328,7 +334,12 @@ testVirHostdevReAttachPCIHostdevs_managed(void)
     virHostdevReAttachPCIDevices(mgr, drv_name, dom_name,
                                   hostdevs, nhostdevs, NULL);
     CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count - nhostdevs);
-    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
+    /* If testing a mixed roundtrip, devices are added back to the inactive
+     * list as soon as we detach from the guest */
+    if (mixed)
+        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count + nhostdevs);
+    else
+        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
 
     ret = 0;
 
@@ -432,6 +443,31 @@ testVirHostdevUpdateActivePCIHostdevs(void)
 }
 
 /**
+ * testVirHostdevRoundtripNoGuest:
+ * @opaque: unused
+ *
+ * Perform a roundtrip without ever assigning devices to the guest.
+ *
+ *   1. Detach devices from the host
+ *   2. Reattach devices to the host
+ */
+static int
+testVirHostdevRoundtripNoGuest(const void *opaque ATTRIBUTE_UNUSED)
+{
+    int ret = -1;
+
+    if (testVirHostdevDetachPCINodeDevice() < 0)
+        goto out;
+    if (testVirHostdevReAttachPCINodeDevice() < 0)
+        goto out;
+
+    ret = 0;
+
+ out:
+    return ret;
+}
+
+/**
  * testVirHostdevRoundtripUnmanaged:
  * @opaque: unused
  *
@@ -479,9 +515,9 @@ testVirHostdevRoundtripManaged(const void *opaque ATTRIBUTE_UNUSED)
     int ret = -1;
 
     if (virHostdevHostSupportsPassthroughKVM()) {
-        if (testVirHostdevPreparePCIHostdevs_managed() < 0)
+        if (testVirHostdevPreparePCIHostdevs_managed(false) < 0)
             goto out;
-        if (testVirHostdevReAttachPCIHostdevs_managed() < 0)
+        if (testVirHostdevReAttachPCIHostdevs_managed(false) < 0)
             goto out;
     }
 
@@ -492,6 +528,40 @@ testVirHostdevRoundtripManaged(const void *opaque ATTRIBUTE_UNUSED)
 }
 
 /**
+ * testVirHostdevRoundtripMixed:
+ * @opaque: unused
+ *
+ * Perform a roundtrip with managed devices but manually detach the devices
+ * from the host first.
+ *
+ *   1. Detach devices from the host
+ *   2. Attach devices to the guest as managed
+ *   3. Detach devices from the guest as managed
+ *   4. Reattach devices to the host
+ */
+static int
+testVirHostdevRoundtripMixed(const void *opaque ATTRIBUTE_UNUSED)
+{
+    int ret = -1;
+
+    if (testVirHostdevDetachPCINodeDevice() < 0)
+        goto out;
+    if (virHostdevHostSupportsPassthroughKVM()) {
+        if (testVirHostdevPreparePCIHostdevs_managed(true) < 0)
+            goto out;
+        if (testVirHostdevReAttachPCIHostdevs_managed(true) < 0)
+            goto out;
+    }
+    if (testVirHostdevReAttachPCINodeDevice() < 0)
+        goto out;
+
+    ret = 0;
+
+ out:
+    return ret;
+}
+
+/**
  * testVirHostdevOther:
  * @opaque: unused
  *
@@ -546,8 +616,10 @@ mymain(void)
     if (myInit() < 0)
         fprintf(stderr, "Init data structures failed.");
 
+    DO_TEST(testVirHostdevRoundtripNoGuest);
     DO_TEST(testVirHostdevRoundtripUnmanaged);
     DO_TEST(testVirHostdevRoundtripManaged);
+    DO_TEST(testVirHostdevRoundtripMixed);
     DO_TEST(testVirHostdevOther);
 
     myCleanup();
-- 
2.5.0




More information about the libvir-list mailing list