test/scheduler: make spdk_for_each_reactor test optional

(84ab68c) test/scheduler: add a for_each_reactor shutdown test

Patch above added regression test for handling spdk_for_each_reactor
during shutdown, by adding constant repeat of this operation
while application is running.

Reactor event processing (especially constant) has impact on the
reactor_interrupt_run(). spdk_fd_group_wait() will almost always
execute an event, skewing the results of scheduler test.
Reactor that should have been idle, will show active usage via
/proc/stat.

Fixes #1950

This patch makes this regression test optional, and enables it
only in test that does not measure CPU utilization from the system.
The ./test/event/scheduler/scheduler.sh is the only one where it is
enabled, as it's purpose is to verify the test scheduler application.
Remaining ./test/scheduler/*.sh tests do verify CPU utilization,
so the regression test is disabled in those.

Modified the for_each_done, to for_each_reactor_start, to better
reflect the intention.

On my system enabling spdk_for_each_reactor test flag on the
scheduler application with no threads (except app thread),
consumes ~20-25% CPU from every core in CPU mask.
Meanwhile disabling it, idle cores are 100% idle
and active cores spend 100% of CPU time in usr.

Change-Id: I40eda15a748e76b95dc5441144cd8931e46edee5
Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15210
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
Tomasz Zawadzki 2022-11-02 15:38:31 +01:00
parent cabbb25d5d
commit 88f16162e7
2 changed files with 30 additions and 5 deletions

View File

@ -20,6 +20,7 @@
static bool g_is_running = true;
pthread_mutex_t g_sched_list_mutex = PTHREAD_MUTEX_INITIALIZER;
#define TIMESLICE_US 100 * 1000
static bool g_for_each_reactor = false;
struct sched_thread {
struct spdk_thread *thread;
@ -370,9 +371,9 @@ for_each_nop(void *arg1, void *arg2)
}
static void
for_each_done(void *arg1, void *arg2)
for_each_reactor_start(void *arg1, void *arg2)
{
spdk_for_each_reactor(for_each_nop, NULL, NULL, for_each_done);
spdk_for_each_reactor(for_each_nop, NULL, NULL, for_each_reactor_start);
}
static void
@ -385,7 +386,28 @@ test_start(void *arg1)
* that any pending spdk_for_each_reactor operations are
* completed before reactors are shut down.
*/
for_each_done(NULL, NULL);
if (g_for_each_reactor) {
for_each_reactor_start(NULL, NULL);
}
}
static void
scheduler_usage(void)
{
printf(" -f Enable spdk_for_each_reactor regression test\n");
}
static int
scheduler_parse_arg(int ch, char *arg)
{
switch (ch) {
case 'f':
g_for_each_reactor = true;
break;
default:
return -EINVAL;
}
return 0;
}
int
@ -399,7 +421,7 @@ main(int argc, char **argv)
opts.shutdown_cb = test_shutdown;
if ((rc = spdk_app_parse_args(argc, argv, &opts,
NULL, NULL, NULL, NULL)) != SPDK_APP_PARSE_ARGS_SUCCESS) {
"f", NULL, scheduler_parse_arg, scheduler_usage)) != SPDK_APP_PARSE_ARGS_SUCCESS) {
return rc;
}

View File

@ -24,7 +24,10 @@ function scheduler_create_thread() {
rpc=rpc_cmd
$testdir/scheduler -m 0xF -p 0x2 --wait-for-rpc &
# Use -f to enable spdk_for_each_reactor regression test for #2206.
# This results in constant event processing even on reactors without any SPDK threads.
# The utilization of reactors might differ from expected.
$testdir/scheduler -m 0xF -p 0x2 --wait-for-rpc -f &
scheduler_pid=$!
trap 'killprocess $scheduler_pid; exit 1' SIGINT SIGTERM EXIT
waitforlisten $scheduler_pid