event: Nest the thread's spdk_fd_groups in interrupt mode

Instead of adding the spdk_fd_group's fd to the reactor fd group, use
the new nesting functionality.

Change-Id: I00727e836da6ba191d5bf778613f31956c9baacf
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15477
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
This commit is contained in:
Ben Walker 2022-11-16 12:55:23 -07:00 committed by Jim Harris
parent d83e476240
commit fe2d64cecf

View File

@ -354,6 +354,7 @@ _reactor_set_interrupt_mode(void *arg1, void *arg2)
{ {
struct spdk_reactor *target = arg1; struct spdk_reactor *target = arg1;
struct spdk_thread *thread; struct spdk_thread *thread;
struct spdk_fd_group *grp;
struct spdk_lw_thread *lw_thread, *tmp; struct spdk_lw_thread *lw_thread, *tmp;
assert(target == spdk_reactor_get(spdk_env_get_current_core())); assert(target == spdk_reactor_get(spdk_env_get_current_core()));
@ -368,6 +369,14 @@ _reactor_set_interrupt_mode(void *arg1, void *arg2)
/* Align spdk_thread with reactor to interrupt mode or poll mode */ /* Align spdk_thread with reactor to interrupt mode or poll mode */
TAILQ_FOREACH_SAFE(lw_thread, &target->threads, link, tmp) { TAILQ_FOREACH_SAFE(lw_thread, &target->threads, link, tmp) {
thread = spdk_thread_get_from_ctx(lw_thread); thread = spdk_thread_get_from_ctx(lw_thread);
if (target->in_interrupt) {
grp = spdk_thread_get_interrupt_fd_group(thread);
spdk_fd_group_nest(target->fgrp, grp);
} else {
grp = spdk_thread_get_interrupt_fd_group(thread);
spdk_fd_group_unnest(target->fgrp, grp);
}
spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, target); spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, target);
} }
} }
@ -835,7 +844,7 @@ static void
_reactor_remove_lw_thread(struct spdk_reactor *reactor, struct spdk_lw_thread *lw_thread) _reactor_remove_lw_thread(struct spdk_reactor *reactor, struct spdk_lw_thread *lw_thread)
{ {
struct spdk_thread *thread = spdk_thread_get_from_ctx(lw_thread); struct spdk_thread *thread = spdk_thread_get_from_ctx(lw_thread);
int efd; struct spdk_fd_group *grp;
TAILQ_REMOVE(&reactor->threads, lw_thread, link); TAILQ_REMOVE(&reactor->threads, lw_thread, link);
assert(reactor->thread_count > 0); assert(reactor->thread_count > 0);
@ -843,8 +852,10 @@ _reactor_remove_lw_thread(struct spdk_reactor *reactor, struct spdk_lw_thread *l
/* Operate thread intr if running with full interrupt ability */ /* Operate thread intr if running with full interrupt ability */
if (spdk_interrupt_mode_is_enabled()) { if (spdk_interrupt_mode_is_enabled()) {
efd = spdk_thread_get_interrupt_fd(thread); if (reactor->in_interrupt) {
spdk_fd_group_remove(reactor->fgrp, efd); grp = spdk_thread_get_interrupt_fd_group(thread);
spdk_fd_group_unnest(reactor->fgrp, grp);
}
} }
} }
@ -985,11 +996,15 @@ reactor_run(void *arg)
if (spdk_thread_is_exited(thread)) { if (spdk_thread_is_exited(thread)) {
_reactor_remove_lw_thread(reactor, lw_thread); _reactor_remove_lw_thread(reactor, lw_thread);
spdk_thread_destroy(thread); spdk_thread_destroy(thread);
} else {
if (spdk_unlikely(reactor->in_interrupt)) {
reactor_interrupt_run(reactor);
} else { } else {
spdk_thread_poll(thread, 0, 0); spdk_thread_poll(thread, 0, 0);
} }
} }
} }
}
return 0; return 0;
} }
@ -1100,35 +1115,6 @@ spdk_reactors_stop(void *arg1)
static pthread_mutex_t g_scheduler_mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_scheduler_mtx = PTHREAD_MUTEX_INITIALIZER;
static uint32_t g_next_core = UINT32_MAX; static uint32_t g_next_core = UINT32_MAX;
static int
thread_process_interrupts(void *arg)
{
struct spdk_thread *thread = arg;
struct spdk_reactor *reactor = spdk_reactor_get(spdk_env_get_current_core());
uint64_t now;
int rc;
assert(reactor != NULL);
/* Update idle_tsc between the end of last intr_fn and the start of this intr_fn. */
now = spdk_get_ticks();
reactor->idle_tsc += now - reactor->tsc_last;
reactor->tsc_last = now;
rc = spdk_thread_poll(thread, 0, now);
/* Update tsc between the start and the end of this intr_fn. */
now = spdk_thread_get_last_tsc(thread);
if (rc == 0) {
reactor->idle_tsc += now - reactor->tsc_last;
} else if (rc > 0) {
reactor->busy_tsc += now - reactor->tsc_last;
}
reactor->tsc_last = now;
return rc;
}
static void static void
_schedule_thread(void *arg1, void *arg2) _schedule_thread(void *arg1, void *arg2)
{ {
@ -1136,7 +1122,7 @@ _schedule_thread(void *arg1, void *arg2)
struct spdk_thread *thread; struct spdk_thread *thread;
struct spdk_reactor *reactor; struct spdk_reactor *reactor;
uint32_t current_core; uint32_t current_core;
int efd; struct spdk_fd_group *grp;
current_core = spdk_env_get_current_core(); current_core = spdk_env_get_current_core();
reactor = spdk_reactor_get(current_core); reactor = spdk_reactor_get(current_core);
@ -1158,12 +1144,13 @@ _schedule_thread(void *arg1, void *arg2)
if (spdk_interrupt_mode_is_enabled()) { if (spdk_interrupt_mode_is_enabled()) {
int rc; int rc;
efd = spdk_thread_get_interrupt_fd(thread); if (reactor->in_interrupt) {
rc = SPDK_FD_GROUP_ADD(reactor->fgrp, efd, grp = spdk_thread_get_interrupt_fd_group(thread);
thread_process_interrupts, thread); rc = spdk_fd_group_nest(reactor->fgrp, grp);
if (rc < 0) { if (rc < 0) {
SPDK_ERRLOG("Failed to schedule spdk_thread: %s.\n", spdk_strerror(-rc)); SPDK_ERRLOG("Failed to schedule spdk_thread: %s.\n", spdk_strerror(-rc));
} }
}
/* Align spdk_thread with reactor to interrupt mode or poll mode */ /* Align spdk_thread with reactor to interrupt mode or poll mode */
spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, reactor); spdk_thread_send_msg(thread, _reactor_set_thread_interrupt_mode, reactor);