From 9fab738e6ee123b09ad4716624878602d2bc9dc9 Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Mon, 21 Feb 2022 19:03:58 +0300 Subject: [PATCH] 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 Change-Id: I3d0db3e7b302b45b4e3bae3452bc5ffa3e62db8e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11687 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- include/spdk/bdev_module.h | 2 +- lib/bdev/bdev.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/spdk/bdev_module.h b/include/spdk/bdev_module.h index d26b7e395..7593307f4 100644 --- a/include/spdk/bdev_module.h +++ b/include/spdk/bdev_module.h @@ -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; diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 1577ea215..f98b89b46 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -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;