Commit d7c8bcf8 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Konrad Sztyber
Browse files

nvme: Add accel fn to append copy task



Extend the spdk_nvme_accel_fn_table structure with
append_copy callback. Add callback implementation to
bdev_nvme

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: Iaf32d03b9055b4e319149f0ff6198990081b5e4d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24688


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
parent 6438af6b
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -358,6 +358,13 @@ struct spdk_nvme_accel_fn_table {
	int (*append_crc32c)(void *ctx, void **seq, uint32_t *dst, struct iovec *iovs, uint32_t iovcnt,
			     struct spdk_memory_domain *memory_domain, void *domain_ctx,
			     uint32_t seed, spdk_nvme_accel_step_cb cb_fn, void *cb_arg);

	/** Append a copy operation to a sequence */
	int (*append_copy)(void *ctx, void **seq, struct iovec *dst_iovs, uint32_t dst_iovcnt,
			   struct spdk_memory_domain *dst_domain, void *dst_domain_ctx,
			   struct iovec *src_iovs, uint32_t src_iovcnt,
			   struct spdk_memory_domain *src_domain, void *src_domain_ctx,
			   spdk_nvme_accel_step_cb cb_fn, void *cb_arg);
};

/**
+7 −4
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2020 Intel Corporation.
 *   Copyright (c) 2021 Mellanox Technologies LTD.
 *   Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES.
 *   All rights reserved.
 *   Copyright (c) 2021 Mellanox Technologies LTD. All rights reserved.
 */

#include "nvme_internal.h"
@@ -29,12 +30,13 @@ spdk_nvme_poll_group_create(void *ctx, struct spdk_nvme_accel_fn_table *table)

		SET_FIELD(submit_accel_crc32c);
		SET_FIELD(append_crc32c);
		SET_FIELD(append_copy);
		SET_FIELD(finish_sequence);
		SET_FIELD(reverse_sequence);
		SET_FIELD(abort_sequence);
		/* Do not remove this statement, you should always update this statement when you adding a new field,
		 * and do not forget to add the SET_FIELD statement for your added field. */
		SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_accel_fn_table) == 48, "Incorrect size");
		SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_accel_fn_table) == 56, "Incorrect size");

#undef SET_FIELD
	}
@@ -51,8 +53,9 @@ spdk_nvme_poll_group_create(void *ctx, struct spdk_nvme_accel_fn_table *table)
	}

	/* Make sure that sequence callbacks are implemented if append* callbacks are provided */
	if (group->accel_fn_table.append_crc32c && !group->accel_fn_table.finish_sequence) {
		SPDK_ERRLOG("Invalid accel_fn_table configuration: append_crc32c requires sequence "
	if ((group->accel_fn_table.append_crc32c || group->accel_fn_table.append_copy) &&
	    !group->accel_fn_table.finish_sequence) {
		SPDK_ERRLOG("Invalid accel_fn_table configuration: append_crc32c and/or append_copy require sequence "
			    "callbacks to be provided\n");
		free(group);
		return NULL;
+22 −0
Original line number Diff line number Diff line
@@ -3580,9 +3580,31 @@ bdev_nvme_append_crc32c(void *ctx, void **seq, uint32_t *dst, struct iovec *iovs
					domain, domain_ctx, seed, cb_fn, cb_arg);
}

static int
bdev_nvme_append_copy(void *ctx, void **seq, struct iovec *dst_iovs, uint32_t dst_iovcnt,
		      struct spdk_memory_domain *dst_domain, void *dst_domain_ctx,
		      struct iovec *src_iovs, uint32_t src_iovcnt,
		      struct spdk_memory_domain *src_domain, void *src_domain_ctx,
		      spdk_nvme_accel_step_cb cb_fn, void *cb_arg)
{
	struct spdk_io_channel *ch;
	struct nvme_poll_group *group = ctx;

	ch = bdev_nvme_get_accel_channel(group);
	if (spdk_unlikely(ch == NULL)) {
		return -ENOMEM;
	}

	return spdk_accel_append_copy((struct spdk_accel_sequence **)seq, ch,
				      dst_iovs, dst_iovcnt, dst_domain, dst_domain_ctx,
				      src_iovs, src_iovcnt, src_domain, src_domain_ctx,
				      cb_fn, cb_arg);
}

static struct spdk_nvme_accel_fn_table g_bdev_nvme_accel_fn_table = {
	.table_size		= sizeof(struct spdk_nvme_accel_fn_table),
	.append_crc32c		= bdev_nvme_append_crc32c,
	.append_copy		= bdev_nvme_append_copy,
	.finish_sequence	= bdev_nvme_finish_sequence,
	.reverse_sequence	= bdev_nvme_reverse_sequence,
	.abort_sequence		= bdev_nvme_abort_sequence,
+8 −1
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2021 Intel Corporation.
 *   All rights reserved.
 *   Copyright (c) 2021, 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 *   Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 */

#include "spdk/stdinc.h"
@@ -254,6 +254,13 @@ DEFINE_STUB(spdk_accel_append_crc32c, int,
	    (struct spdk_accel_sequence **seq, struct spdk_io_channel *ch, uint32_t *dst,
	     struct iovec *iovs, uint32_t iovcnt, struct spdk_memory_domain *domain, void *domain_ctx,
	     uint32_t seed, spdk_accel_step_cb cb_fn, void *cb_arg), 0);
DEFINE_STUB(spdk_accel_append_copy, int,
	    (struct spdk_accel_sequence **pseq, struct spdk_io_channel *ch,
	     struct iovec *dst_iovs, uint32_t dst_iovcnt,
	     struct spdk_memory_domain *dst_domain, void *dst_domain_ctx,
	     struct iovec *src_iovs, uint32_t src_iovcnt,
	     struct spdk_memory_domain *src_domain, void *src_domain_ctx,
	     spdk_accel_step_cb cb_fn, void *cb_arg), 0);
DEFINE_STUB_V(spdk_accel_sequence_finish,
	      (struct spdk_accel_sequence *seq, spdk_accel_completion_cb cb_fn, void *cb_arg));
DEFINE_STUB_V(spdk_accel_sequence_abort, (struct spdk_accel_sequence *seq));