diff --git a/module/bdev/malloc/bdev_malloc.c b/module/bdev/malloc/bdev_malloc.c index a9c6e472b..df6fc1abe 100644 --- a/module/bdev/malloc/bdev_malloc.c +++ b/module/bdev/malloc/bdev_malloc.c @@ -282,8 +282,7 @@ bdev_malloc_writev(struct malloc_disk *mdisk, struct spdk_io_channel *ch, struct malloc_task *task, struct spdk_bdev_io *bdev_io) { uint64_t len, offset, md_offset; - int i, res = 0; - void *dst; + int res = 0; size_t md_len; len = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; @@ -295,27 +294,26 @@ bdev_malloc_writev(struct malloc_disk *mdisk, struct spdk_io_channel *ch, return; } + task->status = SPDK_BDEV_IO_STATUS_SUCCESS; + task->num_outstanding = 0; + task->iov.iov_base = mdisk->malloc_buf + offset; + task->iov.iov_len = len; + SPDK_DEBUGLOG(bdev_malloc, "wrote %zu bytes to offset %#" PRIx64 ", iovcnt=%d\n", len, offset, bdev_io->u.bdev.iovcnt); - dst = mdisk->malloc_buf + offset; - - task->status = SPDK_BDEV_IO_STATUS_SUCCESS; - task->num_outstanding = 0; - - for (i = 0; i < bdev_io->u.bdev.iovcnt; i++) { - task->num_outstanding++; - res = spdk_accel_submit_copy(ch, dst, bdev_io->u.bdev.iovs[i].iov_base, - bdev_io->u.bdev.iovs[i].iov_len, 0, malloc_done, task); - - if (res != 0) { - malloc_done(task, res); - break; - } - - dst += bdev_io->u.bdev.iovs[i].iov_len; + task->num_outstanding++; + res = spdk_accel_append_copy(&bdev_io->u.bdev.accel_sequence, ch, &task->iov, 1, NULL, NULL, + bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, + bdev_io->u.bdev.memory_domain, + bdev_io->u.bdev.memory_domain_ctx, 0, NULL, NULL); + if (spdk_unlikely(res != 0)) { + malloc_sequence_fail(task, res); + return; } + spdk_accel_sequence_finish(bdev_io->u.bdev.accel_sequence, malloc_sequence_done, task); + if (bdev_io->u.bdev.md_buf == NULL) { return; } diff --git a/test/bdev/chaining.sh b/test/bdev/chaining.sh index 1313a2ada..4fe02ff8a 100755 --- a/test/bdev/chaining.sh +++ b/test/bdev/chaining.sh @@ -79,7 +79,7 @@ update_stats # Write a single 64K request and check the stats dd if=/dev/urandom of="$input" bs=1K count=64 spdk_dd --if "$input" --ob Nvme0n1 --bs $((64 * 1024)) --count 1 -(($(get_stat sequence_executed) == stats[sequence_executed] + 1)) +(($(get_stat sequence_executed) == stats[sequence_executed] + 2)) (($(get_stat executed encrypt) == stats[encrypt_executed] + 2)) (($(get_stat executed decrypt) == stats[decrypt_executed])) # There's still one copy performed by the malloc bdev @@ -98,7 +98,7 @@ update_stats # Now do the same using 4K requests spdk_dd --if "$input" --ob Nvme0n1 --bs 4096 --count 16 -(($(get_stat sequence_executed) == stats[sequence_executed] + 16)) +(($(get_stat sequence_executed) == stats[sequence_executed] + 32)) (($(get_stat executed encrypt) == stats[encrypt_executed] + 32)) (($(get_stat executed decrypt) == stats[decrypt_executed])) (($(get_stat executed copy) == stats[copy_executed] + 16))