xref: /spdk/test/unit/lib/blob/bs_scheduler.c (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse  *   Copyright (C) 2018 Intel Corporation.
33ca9cd76SPiotr Pelplinski  *   All rights reserved.
43ca9cd76SPiotr Pelplinski  */
53ca9cd76SPiotr Pelplinski 
65fc0475cSJiewei Ke #include "spdk/thread.h"
75fc0475cSJiewei Ke 
83ca9cd76SPiotr Pelplinski bool g_scheduler_delay = false;
93ca9cd76SPiotr Pelplinski 
103ca9cd76SPiotr Pelplinski struct scheduled_ops {
117b940538SBen Walker 	spdk_msg_fn	fn;
123ca9cd76SPiotr Pelplinski 	void		*ctx;
133ca9cd76SPiotr Pelplinski 
143ca9cd76SPiotr Pelplinski 	TAILQ_ENTRY(scheduled_ops)	ops_queue;
153ca9cd76SPiotr Pelplinski };
163ca9cd76SPiotr Pelplinski 
173ca9cd76SPiotr Pelplinski static TAILQ_HEAD(, scheduled_ops) g_scheduled_ops = TAILQ_HEAD_INITIALIZER(g_scheduled_ops);
183ca9cd76SPiotr Pelplinski 
193ca9cd76SPiotr Pelplinski void _bs_flush_scheduler(uint32_t);
203ca9cd76SPiotr Pelplinski 
213ca9cd76SPiotr Pelplinski static void
_bs_send_msg(spdk_msg_fn fn,void * ctx,void * thread_ctx)227b940538SBen Walker _bs_send_msg(spdk_msg_fn fn, void *ctx, void *thread_ctx)
233ca9cd76SPiotr Pelplinski {
243ca9cd76SPiotr Pelplinski 	if (g_scheduler_delay) {
253ca9cd76SPiotr Pelplinski 		struct scheduled_ops *ops = calloc(1, sizeof(*ops));
263ca9cd76SPiotr Pelplinski 
273ca9cd76SPiotr Pelplinski 		SPDK_CU_ASSERT_FATAL(ops != NULL);
283ca9cd76SPiotr Pelplinski 		ops->fn = fn;
293ca9cd76SPiotr Pelplinski 		ops->ctx = ctx;
303ca9cd76SPiotr Pelplinski 		TAILQ_INSERT_TAIL(&g_scheduled_ops, ops, ops_queue);
313ca9cd76SPiotr Pelplinski 
323ca9cd76SPiotr Pelplinski 	} else {
333ca9cd76SPiotr Pelplinski 		fn(ctx);
343ca9cd76SPiotr Pelplinski 	}
353ca9cd76SPiotr Pelplinski }
363ca9cd76SPiotr Pelplinski 
373ca9cd76SPiotr Pelplinski static void
_bs_flush_scheduler_single(void)383ca9cd76SPiotr Pelplinski _bs_flush_scheduler_single(void)
393ca9cd76SPiotr Pelplinski {
403ca9cd76SPiotr Pelplinski 	struct scheduled_ops *op;
413ca9cd76SPiotr Pelplinski 	TAILQ_HEAD(, scheduled_ops) ops;
423ca9cd76SPiotr Pelplinski 	TAILQ_INIT(&ops);
433ca9cd76SPiotr Pelplinski 
443ca9cd76SPiotr Pelplinski 	TAILQ_SWAP(&g_scheduled_ops, &ops, scheduled_ops, ops_queue);
453ca9cd76SPiotr Pelplinski 
463ca9cd76SPiotr Pelplinski 	while (!TAILQ_EMPTY(&ops)) {
473ca9cd76SPiotr Pelplinski 		op = TAILQ_FIRST(&ops);
483ca9cd76SPiotr Pelplinski 		TAILQ_REMOVE(&ops, op, ops_queue);
493ca9cd76SPiotr Pelplinski 
503ca9cd76SPiotr Pelplinski 		op->fn(op->ctx);
513ca9cd76SPiotr Pelplinski 		free(op);
523ca9cd76SPiotr Pelplinski 	}
533ca9cd76SPiotr Pelplinski }
543ca9cd76SPiotr Pelplinski 
553ca9cd76SPiotr Pelplinski void
_bs_flush_scheduler(uint32_t n)563ca9cd76SPiotr Pelplinski _bs_flush_scheduler(uint32_t n)
573ca9cd76SPiotr Pelplinski {
583ca9cd76SPiotr Pelplinski 	while (n--) {
593ca9cd76SPiotr Pelplinski 		_bs_flush_scheduler_single();
603ca9cd76SPiotr Pelplinski 	}
613ca9cd76SPiotr Pelplinski }
62