Commit 9fab738e authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

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: default avatarAlexey Marchuk <alexeymar@mellanox.com>
Change-Id: I3d0db3e7b302b45b4e3bae3452bc5ffa3e62db8e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11687


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent ffdb4541
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+10 −9
Original line number Diff line number Diff line
@@ -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;