From 57b0fcc4ce60d46e5e4c5368e725d1ccc506400e Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Mon, 22 Aug 2022 16:23:21 +0300 Subject: [PATCH] test/bdevio: Add test for copy IO type Signed-off-by: Evgeniy Kochetov Change-Id: Ic706810416eccd939ee531a6807613eb35cba632 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14349 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto --- test/bdev/bdevio/bdevio.c | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/test/bdev/bdevio/bdevio.c b/test/bdev/bdevio/bdevio.c index 4ed0cf689..63f598375 100644 --- a/test/bdev/bdevio/bdevio.c +++ b/test/bdev/bdevio/bdevio.c @@ -50,6 +50,7 @@ struct bdevio_request { struct iovec fused_iov[BUFFER_IOVS]; int fused_iovcnt; struct io_target *target; + uint64_t src_offset; }; struct io_target *g_io_targets = NULL; @@ -396,6 +397,41 @@ blockdev_read(struct io_target *target, char *rx_buf, execute_spdk_function(__blockdev_read, &req); } +static void +_blockdev_copy(void *arg) +{ + struct bdevio_request *req = arg; + struct io_target *target = req->target; + struct spdk_bdev *bdev = target->bdev; + int rc; + + rc = spdk_bdev_copy_blocks(target->bdev_desc, target->ch, + bdev_bytes_to_blocks(bdev, req->offset), + bdev_bytes_to_blocks(bdev, req->src_offset), + bdev_bytes_to_blocks(bdev, req->data_len), + quick_test_complete, NULL); + + if (rc) { + g_completion_success = false; + wake_ut_thread(); + } +} + +static void +blockdev_copy(struct io_target *target, uint64_t dst_offset, uint64_t src_offset, int data_len) +{ + struct bdevio_request req; + + req.target = target; + req.data_len = data_len; + req.offset = dst_offset; + req.src_offset = src_offset; + + g_completion_success = false; + + execute_spdk_function(_blockdev_copy, &req); +} + static int blockdev_write_read_data_match(char *rx_buf, char *tx_buf, int data_length) { @@ -1134,6 +1170,42 @@ blockdev_test_nvme_admin_passthru(void) CU_ASSERT(pt_req.sc == SPDK_NVME_SC_SUCCESS); } +static void +blockdev_test_copy(void) +{ + uint32_t data_length; + uint64_t src_offset, dst_offset; + struct io_target *target = g_current_io_target; + struct spdk_bdev *bdev = target->bdev; + char *tx_buf = NULL; + char *rx_buf = NULL; + int rc; + + if (!spdk_bdev_io_type_supported(target->bdev, SPDK_BDEV_IO_TYPE_COPY)) { + return; + } + + data_length = spdk_bdev_get_block_size(bdev); + CU_ASSERT_TRUE(data_length < BUFFER_SIZE); + src_offset = 0; + dst_offset = spdk_bdev_get_block_size(bdev); + + initialize_buffer(&tx_buf, 0xAA, data_length); + initialize_buffer(&rx_buf, 0, data_length); + + blockdev_write(target, tx_buf, src_offset, data_length, data_length); + CU_ASSERT_EQUAL(g_completion_success, true); + + blockdev_copy(target, dst_offset, src_offset, data_length); + CU_ASSERT_EQUAL(g_completion_success, true); + + blockdev_read(target, rx_buf, dst_offset, data_length, data_length); + CU_ASSERT_EQUAL(g_completion_success, true); + + rc = blockdev_write_read_data_match(rx_buf, tx_buf, data_length); + CU_ASSERT_EQUAL(rc, 0); +} + static void __stop_init_thread(void *arg) { @@ -1237,6 +1309,8 @@ __setup_ut_on_single_target(struct io_target *target) blockdev_test_nvme_passthru_vendor_specific) == NULL || CU_add_test(suite, "blockdev nvme admin passthru", blockdev_test_nvme_admin_passthru) == NULL + || CU_add_test(suite, "blockdev copy", + blockdev_test_copy) == NULL ) { CU_cleanup_registry(); rc = CU_get_error();