diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index a37700176..27bc9b03e 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -54,17 +54,6 @@ char *g_xattr_names[] = {"first", "second", "third"}; char *g_xattr_values[] = {"one", "two", "three"}; uint64_t g_ctx = 1729; -bool g_scheduler_delay = false; - -struct scheduled_ops { - spdk_thread_fn fn; - void *ctx; - - TAILQ_ENTRY(scheduled_ops) ops_queue; -}; - -static TAILQ_HEAD(, scheduled_ops) g_scheduled_ops = TAILQ_HEAD_INITIALIZER(g_scheduled_ops); - struct spdk_bs_super_block_ver1 { uint8_t signature[8]; uint32_t version; @@ -121,35 +110,6 @@ _get_xattr_value_null(void *arg, const char *name, } -static void -_bs_send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx) -{ - if (g_scheduler_delay) { - struct scheduled_ops *ops = calloc(1, sizeof(*ops)); - - SPDK_CU_ASSERT_FATAL(ops != NULL); - ops->fn = fn; - ops->ctx = ctx; - TAILQ_INSERT_TAIL(&g_scheduled_ops, ops, ops_queue); - } else { - fn(ctx); - } -} - -#if 0 -static void -_bs_flush_scheduler(void) -{ - struct scheduled_ops *ops; - - while (!TAILQ_EMPTY(&g_scheduled_ops)) { - ops = TAILQ_FIRST(&g_scheduled_ops); - TAILQ_REMOVE(&g_scheduled_ops, ops, ops_queue); - ops->fn(ops->ctx); - free(ops); - } -} -#endif static void bs_op_complete(void *cb_arg, int bserrno) diff --git a/test/unit/lib/blob/bs_dev_common.c b/test/unit/lib/blob/bs_dev_common.c index b24de2126..088ef2bc7 100644 --- a/test/unit/lib/blob/bs_dev_common.c +++ b/test/unit/lib/blob/bs_dev_common.c @@ -32,6 +32,8 @@ */ #include "spdk/io_channel.h" +#include "bs_scheduler.c" + #define DEV_BUFFER_SIZE (64 * 1024 * 1024) #define DEV_BUFFER_BLOCKLEN (4096) @@ -58,14 +60,21 @@ dev_destroy(struct spdk_bs_dev *dev) free(dev); } + static void -dev_complete(void *arg) +dev_complete_cb(void *arg) { struct spdk_bs_dev_cb_args *cb_args = arg; cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0); } +static void +dev_complete(void *arg) +{ + _bs_send_msg(dev_complete_cb, arg, NULL); +} + static void dev_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload, uint64_t lba, uint32_t lba_count, diff --git a/test/unit/lib/blob/bs_scheduler.c b/test/unit/lib/blob/bs_scheduler.c new file mode 100644 index 000000000..76fa067ee --- /dev/null +++ b/test/unit/lib/blob/bs_scheduler.c @@ -0,0 +1,87 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +bool g_scheduler_delay = false; + +struct scheduled_ops { + spdk_thread_fn fn; + void *ctx; + + TAILQ_ENTRY(scheduled_ops) ops_queue; +}; + +static TAILQ_HEAD(, scheduled_ops) g_scheduled_ops = TAILQ_HEAD_INITIALIZER(g_scheduled_ops); + +void _bs_flush_scheduler(uint32_t); + +static void +_bs_send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx) +{ + if (g_scheduler_delay) { + struct scheduled_ops *ops = calloc(1, sizeof(*ops)); + + SPDK_CU_ASSERT_FATAL(ops != NULL); + ops->fn = fn; + ops->ctx = ctx; + TAILQ_INSERT_TAIL(&g_scheduled_ops, ops, ops_queue); + + } else { + fn(ctx); + } +} + +static void +_bs_flush_scheduler_single(void) +{ + struct scheduled_ops *op; + TAILQ_HEAD(, scheduled_ops) ops; + TAILQ_INIT(&ops); + + TAILQ_SWAP(&g_scheduled_ops, &ops, scheduled_ops, ops_queue); + + while (!TAILQ_EMPTY(&ops)) { + op = TAILQ_FIRST(&ops); + TAILQ_REMOVE(&ops, op, ops_queue); + + op->fn(op->ctx); + free(op); + } +} + +void +_bs_flush_scheduler(uint32_t n) +{ + while (n--) { + _bs_flush_scheduler_single(); + } +}