test/bdevio: Add test for copy IO type

Signed-off-by: Evgeniy Kochetov <evgeniik@nvidia.com>
Change-Id: Ic706810416eccd939ee531a6807613eb35cba632
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14349
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
Evgeniy Kochetov 2022-08-22 16:23:21 +03:00 committed by Tomasz Zawadzki
parent 8c3590a983
commit 57b0fcc4ce

View File

@ -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();