reactor: apply spdk_thread_set_interrupt_mode

The interrupt mode of spdk_thread can be operated
by reactor based on reactor's interrupt mode when
the spdk_thread is scheduled or the reactor is set
into interrupt mode.

Change-Id: Ibeef7ffb759589a7b372bd78e59e3410be061383
Signed-off-by: Liu Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6709
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Liu Xiaodong 2021-02-26 08:52:18 -05:00 committed by Tomasz Zawadzki
parent 2d52c6a15b
commit b763ebfe1d

View File

@ -375,20 +375,35 @@ _reactor_set_notify_cpuset_cpl(void *arg1, void *arg2)
}
}
static void
_reactor_set_thread_interrupt_mode(void *ctx)
{
struct spdk_reactor *reactor = ctx;
spdk_thread_set_interrupt_mode(reactor->in_interrupt);
}
static void
_reactor_set_interrupt_mode(void *arg1, void *arg2)
{
struct spdk_reactor *target = arg1;
struct spdk_thread *thread;
struct spdk_lw_thread *lw_thread, *tmp;
assert(target == spdk_reactor_get(spdk_env_get_current_core()));
assert(target != NULL);
assert(target->in_interrupt != target->new_in_interrupt);
assert(TAILQ_EMPTY(&target->threads));
SPDK_DEBUGLOG(reactor, "Do reactor set on core %u from %s to state %s\n",
target->lcore, !target->in_interrupt ? "intr" : "poll", target->new_in_interrupt ? "intr" : "poll");
target->in_interrupt = target->new_in_interrupt;
/* Align spdk_thread with reactor to interrupt mode or poll mode */
TAILQ_FOREACH_SAFE(lw_thread, &target->threads, link, tmp) {
thread = spdk_thread_get_from_ctx(lw_thread);
spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, target);
}
if (target->new_in_interrupt == false) {
spdk_for_each_reactor(_reactor_set_notify_cpuset, target, NULL, _reactor_set_notify_cpuset_cpl);
} else {
@ -1127,6 +1142,9 @@ _schedule_thread(void *arg1, void *arg2)
if (rc < 0) {
SPDK_ERRLOG("Failed to schedule spdk_thread: %s.\n", spdk_strerror(-rc));
}
/* Align spdk_thread with reactor to interrupt mode or poll mode */
spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, reactor);
}
}