event: Always process events on each reactor loop
Events are the mechanism by which threads are scheduled, so events need to be processed even if there are no threads. Change-Id: I2e908e6a948709f2122b1c7385b6fd771827b9aa Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/447111 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
deb8ee5c33
commit
2d0aa1ad8f
@ -134,10 +134,12 @@ spdk_event_call(struct spdk_event *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
_spdk_event_queue_run_batch(struct spdk_reactor *reactor, struct spdk_thread *thread)
|
_spdk_event_queue_run_batch(struct spdk_reactor *reactor)
|
||||||
{
|
{
|
||||||
unsigned count, i;
|
unsigned count, i;
|
||||||
void *events[SPDK_EVENT_BATCH_SIZE];
|
void *events[SPDK_EVENT_BATCH_SIZE];
|
||||||
|
struct spdk_thread *thread;
|
||||||
|
struct spdk_lw_thread *lw_thread;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
/*
|
/*
|
||||||
@ -153,6 +155,16 @@ _spdk_event_queue_run_batch(struct spdk_reactor *reactor, struct spdk_thread *th
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Execute the events. There are still some remaining events
|
||||||
|
* that must occur on an SPDK thread. To accomodate those, try to
|
||||||
|
* run them on the first thread in the list, if it exists. */
|
||||||
|
lw_thread = TAILQ_FIRST(&reactor->threads);
|
||||||
|
if (lw_thread) {
|
||||||
|
thread = spdk_thread_get_from_ctx(lw_thread);
|
||||||
|
} else {
|
||||||
|
thread = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
spdk_set_thread(thread);
|
spdk_set_thread(thread);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
@ -239,11 +251,11 @@ _spdk_reactor_run(void *arg)
|
|||||||
* is used for all threads. */
|
* is used for all threads. */
|
||||||
now = spdk_get_ticks();
|
now = spdk_get_ticks();
|
||||||
|
|
||||||
|
_spdk_event_queue_run_batch(reactor);
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(lw_thread, &reactor->threads, link, tmp) {
|
TAILQ_FOREACH_SAFE(lw_thread, &reactor->threads, link, tmp) {
|
||||||
thread = spdk_thread_get_from_ctx(lw_thread);
|
thread = spdk_thread_get_from_ctx(lw_thread);
|
||||||
|
|
||||||
_spdk_event_queue_run_batch(reactor, thread);
|
|
||||||
|
|
||||||
spdk_thread_poll(thread, 0, now);
|
spdk_thread_poll(thread, 0, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user