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