Commit a711d629 authored by Slawomir Ptak's avatar Slawomir Ptak Committed by Tomasz Zawadzki
Browse files

lib/util/dif: Add an ext_opts param to spdk_dif_ctx_init



The extended options structure for the dif context
initialization allows for adding new arguments
without the function signature change. The first
extended parameter is the DIF Protection Information
format (CRC-16).

Change-Id: I6a32e8570676265d757fc7251441e5547bbb475d
Signed-off-by: default avatarSlawomir Ptak <slawomir.ptak@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18146


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent d2f30e5c
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -752,7 +752,10 @@ bdevperf_verify_dif(struct bdevperf_task *task, struct iovec *iovs, int iovcnt)
	struct spdk_dif_ctx	dif_ctx;
	struct spdk_dif_error	err_blk = {};
	int			rc;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
	rc = spdk_dif_ctx_init(&dif_ctx,
			       spdk_bdev_get_block_size(bdev),
			       spdk_bdev_get_md_size(bdev),
@@ -760,7 +763,7 @@ bdevperf_verify_dif(struct bdevperf_task *task, struct iovec *iovs, int iovcnt)
			       spdk_bdev_is_dif_head_of_md(bdev),
			       spdk_bdev_get_dif_type(bdev),
			       job->dif_check_flags,
			       task->offset_blocks, 0, 0, 0, 0);
			       task->offset_blocks, 0, 0, 0, 0, &dif_opts);
	if (rc != 0) {
		fprintf(stderr, "Initialization of DIF context failed\n");
		return rc;
@@ -927,7 +930,10 @@ bdevperf_generate_dif(struct bdevperf_task *task)
	struct spdk_bdev	*bdev = job->bdev;
	struct spdk_dif_ctx	dif_ctx;
	int			rc;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
	rc = spdk_dif_ctx_init(&dif_ctx,
			       spdk_bdev_get_block_size(bdev),
			       spdk_bdev_get_md_size(bdev),
@@ -935,7 +941,7 @@ bdevperf_generate_dif(struct bdevperf_task *task)
			       spdk_bdev_is_dif_head_of_md(bdev),
			       spdk_bdev_get_dif_type(bdev),
			       job->dif_check_flags,
			       task->offset_blocks, 0, 0, 0, 0);
			       task->offset_blocks, 0, 0, 0, 0, &dif_opts);
	if (rc != 0) {
		fprintf(stderr, "Initialization of DIF context failed\n");
		return rc;
+10 −2
Original line number Diff line number Diff line
@@ -795,6 +795,7 @@ fio_extended_lba_setup_pi(struct spdk_fio_qpair *fio_qpair, struct io_u *io_u)
	uint64_t lba;
	struct iovec iov;
	int rc;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	/* Set appmask and apptag when PRACT is enabled */
	if (fio_qpair->io_flags & SPDK_NVME_IO_FLAGS_PRACT) {
@@ -808,10 +809,13 @@ fio_extended_lba_setup_pi(struct spdk_fio_qpair *fio_qpair, struct io_u *io_u)
	lba = io_u->offset / extended_lba_size;
	lba_count = io_u->xfer_buflen / extended_lba_size;

	dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
	rc = spdk_dif_ctx_init(&fio_req->dif_ctx, extended_lba_size, md_size,
			       true, fio_qpair->md_start,
			       (enum spdk_dif_type)spdk_nvme_ns_get_pi_type(ns),
			       fio_qpair->io_flags, lba, g_spdk_apptag_mask, g_spdk_apptag, 0, 0);
			       fio_qpair->io_flags, lba, g_spdk_apptag_mask, g_spdk_apptag,
			       0, 0, &dif_opts);
	if (rc != 0) {
		fprintf(stderr, "Initialization of DIF context failed\n");
		return rc;
@@ -840,6 +844,7 @@ fio_separate_md_setup_pi(struct spdk_fio_qpair *fio_qpair, struct io_u *io_u)
	uint64_t lba;
	struct iovec iov, md_iov;
	int rc;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	/* Set appmask and apptag when PRACT is enabled */
	if (fio_qpair->io_flags & SPDK_NVME_IO_FLAGS_PRACT) {
@@ -853,10 +858,13 @@ fio_separate_md_setup_pi(struct spdk_fio_qpair *fio_qpair, struct io_u *io_u)
	lba = io_u->offset / block_size;
	lba_count = io_u->xfer_buflen / block_size;

	dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
	rc = spdk_dif_ctx_init(&fio_req->dif_ctx, block_size, md_size,
			       false, fio_qpair->md_start,
			       (enum spdk_dif_type)spdk_nvme_ns_get_pi_type(ns),
			       fio_qpair->io_flags, lba, g_spdk_apptag_mask, g_spdk_apptag, 0, 0);
			       fio_qpair->io_flags, lba, g_spdk_apptag_mask, g_spdk_apptag,
			       0, 0, &dif_opts);
	if (rc != 0) {
		fprintf(stderr, "Initialization of DIF context failed\n");
		return rc;
+4 −1
Original line number Diff line number Diff line
@@ -846,6 +846,7 @@ nvme_submit_io(struct perf_task *task, struct ns_worker_ctx *ns_ctx,
	uint64_t lba;
	int rc;
	int qp_num;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	enum dif_mode {
		DIF_MODE_NONE = 0,
@@ -870,10 +871,12 @@ nvme_submit_io(struct perf_task *task, struct ns_worker_ctx *ns_ctx,
	}

	if (mode != DIF_MODE_NONE) {
		dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
		dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
		rc = spdk_dif_ctx_init(&task->dif_ctx, entry->block_size, entry->md_size,
				       entry->md_interleave, entry->pi_loc,
				       (enum spdk_dif_type)entry->pi_type, entry->io_flags,
				       lba, 0xFFFF, (uint16_t)entry->io_size_blocks, 0, 0);
				       lba, 0xFFFF, (uint16_t)entry->io_size_blocks, 0, 0, &dif_opts);
		if (rc != 0) {
			fprintf(stderr, "Initialization of DIF context failed\n");
			exit(1);
+17 −1
Original line number Diff line number Diff line
@@ -30,6 +30,18 @@ enum spdk_dif_check_type {
	SPDK_DIF_CHECK_TYPE_GUARD = 3,
};

enum spdk_dif_pi_format {
	SPDK_DIF_PI_FORMAT_16 = 1
};

struct spdk_dif_ctx_init_ext_opts {
	/** size of this structure in bytes */
	size_t size;

	enum spdk_dif_pi_format dif_pi_format;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct spdk_dif_ctx_init_ext_opts) == 12, "Incorrect size");

struct spdk_dif {
	uint16_t guard;
	uint16_t app_tag;
@@ -54,6 +66,9 @@ struct spdk_dif_ctx {
	/** DIF type */
	enum spdk_dif_type	dif_type;

	/** DIF Protection Information format */
	enum spdk_dif_pi_format dif_pi_format;

	/* Flags to specify the DIF action */
	uint32_t		dif_flags;

@@ -119,13 +134,14 @@ struct spdk_dif_error {
 * \param app_tag Application tag.
 * \param data_offset Byte offset from the start of the whole data buffer.
 * \param guard_seed Seed value for guard computation.
 * \param opts Extended options for DIF context.
 *
 * \return 0 on success and negated errno otherwise.
 */
int spdk_dif_ctx_init(struct spdk_dif_ctx *ctx, uint32_t block_size, uint32_t md_size,
		      bool md_interleave, bool dif_loc, enum spdk_dif_type dif_type, uint32_t dif_flags,
		      uint32_t init_ref_tag, uint16_t apptag_mask, uint16_t app_tag,
		      uint32_t data_offset, uint16_t guard_seed);
		      uint32_t data_offset, uint16_t guard_seed, struct spdk_dif_ctx_init_ext_opts *opts);

/**
 * Update date offset of DIF context.
+4 −1
Original line number Diff line number Diff line
@@ -201,15 +201,18 @@ bdev_part_remap_dif(struct spdk_bdev_io *bdev_io, uint32_t offset,
	struct spdk_dif_ctx dif_ctx;
	struct spdk_dif_error err_blk = {};
	int rc;
	struct spdk_dif_ctx_init_ext_opts dif_opts;

	if (spdk_likely(!(bdev->dif_check_flags & SPDK_DIF_FLAGS_REFTAG_CHECK))) {
		return 0;
	}

	dif_opts.size = sizeof(struct spdk_dif_ctx_init_ext_opts);
	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
	rc = spdk_dif_ctx_init(&dif_ctx,
			       bdev->blocklen, bdev->md_len, bdev->md_interleave,
			       bdev->dif_is_head_of_md, bdev->dif_type, bdev->dif_check_flags,
			       offset, 0, 0, 0, 0);
			       offset, 0, 0, 0, 0, &dif_opts);
	if (rc != 0) {
		SPDK_ERRLOG("Initialization of DIF context failed\n");
		return rc;
Loading