ut_multithread: add the support for start/stop poller functions

The multithread testing framework is well positioned
for the QoS testing. As QoS will initiate poller for
the rate limiting. Added the related poller functions
and proper poll_thread handling here.

Change-Id: I253a72d3f85af381703dde4e4d0d7366fe682d78
Signed-off-by: GangCao <gang.cao@intel.com>
Reviewed-on: https://review.gerrithub.io/393012
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
GangCao 2017-12-26 19:10:52 -05:00 committed by Jim Harris
parent d13d21e651
commit 8518ddacd0

View File

@ -52,10 +52,17 @@ struct ut_thread {
struct spdk_thread *thread;
struct spdk_io_channel *ch;
TAILQ_HEAD(, ut_msg) msgs;
TAILQ_HEAD(, ut_poller) pollers;
};
struct ut_thread *g_ut_threads;
struct ut_poller {
spdk_poller_fn fn;
void *arg;
TAILQ_ENTRY(ut_poller) tailq;
};
static void
__send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx)
{
@ -70,6 +77,32 @@ __send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx)
TAILQ_INSERT_TAIL(&thread->msgs, msg, link);
}
static struct spdk_poller *
__start_poller(void *thread_ctx, spdk_thread_fn fn, void *arg, uint64_t period_microseconds)
{
struct ut_thread *thread = thread_ctx;
struct ut_poller *poller = calloc(1, sizeof(struct ut_poller));
SPDK_CU_ASSERT_FATAL(poller != NULL);
poller->fn = fn;
poller->arg = arg;
TAILQ_INSERT_TAIL(&thread->pollers, poller, tailq);
return (struct spdk_poller *)poller;
}
static void
__stop_poller(struct spdk_poller *poller, void *thread_ctx)
{
struct ut_thread *thread = thread_ctx;
TAILQ_REMOVE(&thread->pollers, (struct ut_poller *)poller, tailq);
free(poller);
}
static uintptr_t g_thread_id = MOCK_PASS_THRU;
static void
@ -92,11 +125,13 @@ allocate_threads(int num_threads)
for (i = 0; i < g_ut_num_threads; i++) {
set_thread(i);
spdk_allocate_thread(__send_msg, NULL, NULL, &g_ut_threads[i], NULL);
spdk_allocate_thread(__send_msg, __start_poller, __stop_poller,
&g_ut_threads[i], NULL);
thread = spdk_get_thread();
SPDK_CU_ASSERT_FATAL(thread != NULL);
g_ut_threads[i].thread = thread;
TAILQ_INIT(&g_ut_threads[i].msgs);
TAILQ_INIT(&g_ut_threads[i].pollers);
}
set_thread(MOCK_PASS_THRU);
@ -124,7 +159,9 @@ poll_thread(uintptr_t thread_id)
int count = 0;
struct ut_thread *thread = &g_ut_threads[thread_id];
struct ut_msg *msg;
struct ut_poller *poller;
uintptr_t original_thread_id;
TAILQ_HEAD(, ut_poller) tmp_pollers;
CU_ASSERT(thread_id != (uintptr_t)MOCK_PASS_THRU);
CU_ASSERT(thread_id < g_ut_num_threads);
@ -141,6 +178,21 @@ poll_thread(uintptr_t thread_id)
free(msg);
}
TAILQ_INIT(&tmp_pollers);
while (!TAILQ_EMPTY(&thread->pollers)) {
poller = TAILQ_FIRST(&thread->pollers);
TAILQ_REMOVE(&thread->pollers, poller, tailq);
if (poller->fn) {
poller->fn(poller->arg);
}
TAILQ_INSERT_TAIL(&tmp_pollers, poller, tailq);
}
TAILQ_SWAP(&tmp_pollers, &thread->pollers, ut_poller, tailq);
set_thread(original_thread_id);
return count;