ut/reactor: implement stub for _spdk_get_app_thread()

Functions that set reactor interrupt mode were not tested
since _spdk_get_app_thread() always returned NULL and
implementation did not verify the RC.

This patch will return a thread from scheduling reactor
as the app thread. Which is not exact, but otherwise
a new app thread would have to be added to each UT.

spdk_reactor_set_interrupt_mode() requires the completion to
be executed on app_thread. Added the poll of that thread
to make sure it gets drained.

Since now the UT actually executes the code path,
additional 4 events will be processed.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I0793e6dcc41c447dc11ed8ab28eb9041c5d82628
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8409
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Ziye Yang <ziye.yang@intel.com>
This commit is contained in:
Tomasz Zawadzki 2021-06-14 09:08:53 -04:00
parent a3aa222a39
commit 012b233426

View File

@ -40,7 +40,21 @@
#include "event/scheduler_static.c"
#include "event/scheduler_dynamic.c"
DEFINE_STUB(_spdk_get_app_thread, struct spdk_thread *, (void), NULL);
struct spdk_thread *
_spdk_get_app_thread(void)
{
struct spdk_lw_thread *lw_thread;
struct spdk_thread *thread;
/* Assume there has to be at least one thread on main
* reactor, that has at least one thread. */
lw_thread = TAILQ_FIRST(&g_scheduling_reactor->threads);
SPDK_CU_ASSERT_FATAL(lw_thread != NULL);
thread = spdk_thread_get_from_ctx(lw_thread);
SPDK_CU_ASSERT_FATAL(thread != NULL);
return thread;
}
static void
test_create_reactor(void)
@ -521,6 +535,7 @@ static uint32_t
_run_events_till_completion(uint32_t reactor_count)
{
struct spdk_reactor *reactor;
struct spdk_thread *app_thread = _spdk_get_app_thread();
uint32_t i, events;
uint32_t total_events = 0;
@ -531,6 +546,11 @@ _run_events_till_completion(uint32_t reactor_count)
CU_ASSERT(reactor != NULL);
MOCK_SET(spdk_env_get_current_core, i);
events += event_queue_run_batch(reactor);
/* Some events still require app_thread to run */
MOCK_SET(spdk_env_get_current_core, g_scheduling_reactor->lcore);
spdk_thread_poll(app_thread, 0, 0);
MOCK_CLEAR(spdk_env_get_current_core);
}
total_events += events;
@ -868,7 +888,7 @@ test_governor(void)
MOCK_SET(spdk_env_get_current_core, 0);
_reactors_scheduler_gather_metrics(NULL, NULL);
CU_ASSERT(_run_events_till_completion(2) == 2);
CU_ASSERT(_run_events_till_completion(2) == 6);
MOCK_SET(spdk_env_get_current_core, 0);
/* Main core should be busy more than 50% time now - frequency should be raised */
@ -891,7 +911,7 @@ test_governor(void)
MOCK_SET(spdk_env_get_current_core, 0);
_reactors_scheduler_gather_metrics(NULL, NULL);
CU_ASSERT(_run_events_till_completion(2) == 2);
CU_ASSERT(_run_events_till_completion(2) == 6);
MOCK_SET(spdk_env_get_current_core, 0);
for (i = 0; i < 2; i++) {