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:
parent
8c3590a983
commit
57b0fcc4ce
@ -50,6 +50,7 @@ struct bdevio_request {
|
|||||||
struct iovec fused_iov[BUFFER_IOVS];
|
struct iovec fused_iov[BUFFER_IOVS];
|
||||||
int fused_iovcnt;
|
int fused_iovcnt;
|
||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
|
uint64_t src_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct io_target *g_io_targets = NULL;
|
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);
|
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
|
static int
|
||||||
blockdev_write_read_data_match(char *rx_buf, char *tx_buf, int data_length)
|
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);
|
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
|
static void
|
||||||
__stop_init_thread(void *arg)
|
__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
|
blockdev_test_nvme_passthru_vendor_specific) == NULL
|
||||||
|| CU_add_test(suite, "blockdev nvme admin passthru",
|
|| CU_add_test(suite, "blockdev nvme admin passthru",
|
||||||
blockdev_test_nvme_admin_passthru) == NULL
|
blockdev_test_nvme_admin_passthru) == NULL
|
||||||
|
|| CU_add_test(suite, "blockdev copy",
|
||||||
|
blockdev_test_copy) == NULL
|
||||||
) {
|
) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
rc = CU_get_error();
|
rc = CU_get_error();
|
||||||
|
Loading…
Reference in New Issue
Block a user