Commit 0d61c7d6 authored by Ankit Kumar's avatar Ankit Kumar Committed by Jim Harris
Browse files

nvme/fio_plugin: trim add support for multiple ranges



For FIO_IOOPS_VERSION >= 34 fio supports multiple ranges per trim
request. fio option num_range can be used to specify that.
If multiple ranges are specified the io_u data buffer contains the
start offset and number of bytes to be trimmed for each range.

This commit adds the necessary changes to support multi range trim by:
 * allocating per IO request dsm range buffer with correct size.
 * parsing the io_u data buffer and creating the trim request.

Change-Id: Ied274feeaba6dc36cab157ffd217730f9560da73
Signed-off-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/22890


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent 6e53c85b
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -24,9 +24,11 @@
#ifdef for_each_rw_ddir
#define FIO_HAS_ZBD (FIO_IOOPS_VERSION >= 26)
#define FIO_HAS_FDP (FIO_IOOPS_VERSION >= 32)
#define FIO_HAS_MRT (FIO_IOOPS_VERSION >= 34)
#else
#define FIO_HAS_ZBD (0)
#define FIO_HAS_FDP (0)
#define FIO_HAS_MRT (0)
#endif

/* FreeBSD is missing CLOCK_MONOTONIC_RAW,
@@ -784,7 +786,12 @@ spdk_fio_io_u_init(struct thread_data *td, struct io_u *io_u)
	}

	if (!(td->io_ops->flags & FIO_ASYNCIO_SYNC_TRIM)) {
#if FIO_HAS_MRT
		/* By default number of range is set to 1 */
		dsm_size = td->o.num_range * sizeof(struct spdk_nvme_dsm_range);
#else
		dsm_size = sizeof(struct spdk_nvme_dsm_range);
#endif
		fio_req->dsm_range = calloc(1, dsm_size);
		if (fio_req->dsm_range == NULL) {
			free(fio_req);
@@ -1186,10 +1193,30 @@ spdk_fio_queue(struct thread_data *td, struct io_u *io_u)
		}

		range = fio_req->dsm_range;
#if FIO_HAS_MRT
		if (td->o.num_range == 1) {
			range->attributes.raw = 0;
			range->length = lba_count;
			range->starting_lba = lba;
			num_range = 1;
		} else {
			struct trim_range *tr = (struct trim_range *)io_u->xfer_buf;
			for (uint32_t i = 0; i < io_u->number_trim; i++) {
				range->attributes.raw = 0;
				range->length = tr->len / block_size;
				range->starting_lba = tr->start / block_size;
				range++;
				tr++;
			}
			num_range = io_u->number_trim;
			range = fio_req->dsm_range;
		}
#else
		range->attributes.raw = 0;
		range->length = lba_count;
		range->starting_lba = lba;
		num_range = 1;
#endif

		rc = spdk_nvme_ns_cmd_dataset_management(ns, fio_qpair->qpair,
				SPDK_NVME_DSM_ATTR_DEALLOCATE, range, num_range,
@@ -1894,7 +1921,11 @@ struct ioengine_ops ioengine = {
#if FIO_HAS_FDP
	.fdp_fetch_ruhs		= spdk_fio_fdp_fetch_ruhs,
#endif
#if FIO_HAS_MRT
	.flags			= FIO_RAWIO | FIO_NOEXTEND | FIO_NODISKUTIL | FIO_MEMALIGN | FIO_DISKLESSIO | FIO_MULTI_RANGE_TRIM,
#else
	.flags			= FIO_RAWIO | FIO_NOEXTEND | FIO_NODISKUTIL | FIO_MEMALIGN | FIO_DISKLESSIO,
#endif
	.options		= options,
	.option_struct_size	= sizeof(struct spdk_fio_options),
};