test/service: fix race condition on stopping lcore
authorKevin Laatz <kevin.laatz@intel.com>
Fri, 16 Oct 2020 09:08:04 +0000 (10:08 +0100)
committerDavid Marchand <david.marchand@redhat.com>
Fri, 16 Oct 2020 11:47:07 +0000 (13:47 +0200)
There is a potential race condition in 'service_attr_get' which will cause
test failures since the service core thread is still running while the
values are being retrieved/reset.

This patch fixes the race condition by waiting for the service core thread
to stop before continuing with the unit test checks.

Fixes: 4d55194d76a4 ("service: add attribute get function")

Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
app/test/test_service_cores.c

index 5d92bea..44b6fc3 100644 (file)
@@ -119,6 +119,17 @@ unregister_all(void)
        return TEST_SUCCESS;
 }
 
+/* Wait until service lcore not active, or for 100x SERVICE_DELAY */
+static void
+wait_slcore_inactive(uint32_t slcore_id)
+{
+       int i;
+
+       for (i = 0; rte_service_lcore_may_be_active(slcore_id) == 1 &&
+                       i < 100; i++)
+               rte_delay_ms(SERVICE_DELAY);
+}
+
 /* register a single dummy service */
 static int
 dummy_register(void)
@@ -305,6 +316,8 @@ service_attr_get(void)
 
        rte_service_lcore_stop(slcore_id);
 
+       wait_slcore_inactive(slcore_id);
+
        TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_calls, &attr_value),
                        "Valid attr_get() call didn't return success");
        TEST_ASSERT_EQUAL(1, (attr_value > 0),
@@ -394,11 +407,7 @@ service_lcore_attr_get(void)
        TEST_ASSERT_EQUAL(0, rte_service_lcore_stop(slcore_id),
                        "Failed to stop service lcore");
 
-       /* Wait until service lcore not active, or for 100x SERVICE_DELAY */
-       int i;
-       for (i = 0; rte_service_lcore_may_be_active(slcore_id) == 1 &&
-                       i < 100; i++)
-               rte_delay_ms(SERVICE_DELAY);
+       wait_slcore_inactive(slcore_id);
 
        TEST_ASSERT_EQUAL(0, rte_service_lcore_may_be_active(slcore_id),
                          "Service lcore not stopped after waiting.");