From 84429e7bbb4041a30bb2684b5d8af05ce024374f Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Wed, 15 May 2019 08:29:55 -0400 Subject: [PATCH] test/bdevio: add function to create target from single bdev Adding ability to create targets from single bdev, will allow to create set of targets (not all) to run tests. Idea is for bdevio to no longer run tests on all bdevs and shutdown right after. Rather await RPC for configuring bdevs then start test suite on select targets via RPC. This is first patch in that direction. Change-Id: I8645a3c22150e8611ff8a59f740e2ebf4edb4c1f Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/454622 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- test/bdev/bdevio/bdevio.c | 60 +++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/test/bdev/bdevio/bdevio.c b/test/bdev/bdevio/bdevio.c index 5af8652d2..185fd6a24 100644 --- a/test/bdev/bdevio/bdevio.c +++ b/test/bdev/bdevio/bdevio.c @@ -101,42 +101,54 @@ __get_io_channel(void *arg1, void *arg2) wake_ut_thread(); } +static int +bdevio_construct_target(struct spdk_bdev *bdev) +{ + struct io_target *target; + int rc; + uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev); + uint32_t block_size = spdk_bdev_get_block_size(bdev); + + target = malloc(sizeof(struct io_target)); + if (target == NULL) { + return -ENOMEM; + } + + rc = spdk_bdev_open(bdev, true, NULL, NULL, &target->bdev_desc); + if (rc != 0) { + free(target); + SPDK_ERRLOG("Could not open leaf bdev %s, error=%d\n", spdk_bdev_get_name(bdev), rc); + return rc; + } + + printf(" %s: %" PRIu64 " blocks of %" PRIu32 " bytes (%" PRIu64 " MiB)\n", + spdk_bdev_get_name(bdev), + num_blocks, block_size, + (num_blocks * block_size + 1024 * 1024 - 1) / (1024 * 1024)); + + target->bdev = bdev; + target->next = g_io_targets; + execute_spdk_function(__get_io_channel, target, NULL); + g_io_targets = target; + + return 0; +} + static int bdevio_construct_targets(void) { struct spdk_bdev *bdev; - struct io_target *target; int rc; printf("I/O targets:\n"); bdev = spdk_bdev_first_leaf(); while (bdev != NULL) { - uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev); - uint32_t block_size = spdk_bdev_get_block_size(bdev); - - target = malloc(sizeof(struct io_target)); - if (target == NULL) { - return -ENOMEM; - } - - rc = spdk_bdev_open(bdev, true, NULL, NULL, &target->bdev_desc); - if (rc != 0) { - free(target); - SPDK_ERRLOG("Could not open leaf bdev %s, error=%d\n", spdk_bdev_get_name(bdev), rc); + rc = bdevio_construct_target(bdev); + if (rc < 0) { + SPDK_ERRLOG("Could not construct bdev %s, error=%d\n", spdk_bdev_get_name(bdev), rc); return rc; } - - printf(" %s: %" PRIu64 " blocks of %" PRIu32 " bytes (%" PRIu64 " MiB)\n", - spdk_bdev_get_name(bdev), - num_blocks, block_size, - (num_blocks * block_size + 1024 * 1024 - 1) / (1024 * 1024)); - - target->bdev = bdev; - target->next = g_io_targets; - execute_spdk_function(__get_io_channel, target, NULL); - g_io_targets = target; - bdev = spdk_bdev_next_leaf(bdev); }