bdev: Use iovec to save original md buffer in IO request

That is a preparation for adding memory domains
pull/push functionality which works with iovec
structure instead of pointers

Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com>
Change-Id: I3d0db3e7b302b45b4e3bae3452bc5ffa3e62db8e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11687
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Alexey Marchuk 2022-02-21 19:03:58 +03:00 committed by Tomasz Zawadzki
parent ffdb454114
commit 9fab738e6e
2 changed files with 11 additions and 10 deletions

View File

@ -746,9 +746,9 @@ struct spdk_bdev_io {
/** if the request is double buffered, store original request iovs here */
struct iovec bounce_iov;
struct iovec orig_md_iov;
struct iovec *orig_iovs;
int orig_iovcnt;
void *orig_md_buf;
/** Callback for when the aux buf is allocated */
spdk_bdev_io_get_aux_buf_cb get_aux_buf_cb;

View File

@ -854,12 +854,13 @@ static void
_bdev_io_set_bounce_md_buf(struct spdk_bdev_io *bdev_io, void *md_buf, size_t len)
{
/* save original md_buf */
bdev_io->internal.orig_md_buf = bdev_io->u.bdev.md_buf;
bdev_io->internal.orig_md_iov.iov_base = bdev_io->u.bdev.md_buf;
bdev_io->internal.orig_md_iov.iov_len = len;
/* set bounce md_buf */
bdev_io->u.bdev.md_buf = md_buf;
if (bdev_io->type == SPDK_BDEV_IO_TYPE_WRITE) {
memcpy(md_buf, bdev_io->internal.orig_md_buf, len);
memcpy(md_buf, bdev_io->internal.orig_md_iov.iov_base, bdev_io->internal.orig_md_iov.iov_len);
}
}
@ -1056,17 +1057,17 @@ static inline void
_bdev_io_push_bounce_md_buffer(struct spdk_bdev_io *bdev_io)
{
/* do the same for metadata buffer */
if (spdk_unlikely(bdev_io->internal.orig_md_buf != NULL)) {
if (spdk_unlikely(bdev_io->internal.orig_md_iov.iov_base != NULL)) {
assert(spdk_bdev_is_md_separate(bdev_io->bdev));
if (bdev_io->type == SPDK_BDEV_IO_TYPE_READ &&
bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS) {
memcpy(bdev_io->internal.orig_md_buf, bdev_io->u.bdev.md_buf,
bdev_io->u.bdev.num_blocks * spdk_bdev_get_md_size(bdev_io->bdev));
memcpy(bdev_io->internal.orig_md_iov.iov_base, bdev_io->u.bdev.md_buf,
bdev_io->internal.orig_md_iov.iov_len);
}
bdev_io->u.bdev.md_buf = bdev_io->internal.orig_md_buf;
bdev_io->internal.orig_md_buf = NULL;
bdev_io->u.bdev.md_buf = bdev_io->internal.orig_md_iov.iov_base;
bdev_io->internal.orig_md_iov.iov_base = NULL;
}
/* We want to free the bounce buffer here since we know we're done with it (as opposed
@ -1094,7 +1095,7 @@ static void
_bdev_io_unset_bounce_buf(struct spdk_bdev_io *bdev_io)
{
if (spdk_likely(bdev_io->internal.orig_iovcnt == 0)) {
assert(bdev_io->internal.orig_md_buf == NULL);
assert(bdev_io->internal.orig_md_iov.iov_base == NULL);
return;
}
@ -2759,7 +2760,7 @@ bdev_io_init(struct spdk_bdev_io *bdev_io,
bdev_io->internal.io_submit_ch = NULL;
bdev_io->internal.orig_iovs = NULL;
bdev_io->internal.orig_iovcnt = 0;
bdev_io->internal.orig_md_buf = NULL;
bdev_io->internal.orig_md_iov.iov_base = NULL;
bdev_io->internal.error.nvme.cdw0 = 0;
bdev_io->num_retries = 0;
bdev_io->internal.get_buf_cb = NULL;