Spdk/include/spdk_internal/accel_module.h
Konrad Sztyber 957076108f accel: remove nbytes from spdk_accel_task
All operations are using iovecs to describe their buffers and only
encrypt/decrypt additionally used nbytes to store the total size of a
src buffer.  We don't really need this value in the generic accel code,
so we can let modules calculate it, if necessary.  That way, we won't
waste cycles calculating it if a module doesn't use it and it makes the
code a bit easier, as we won't have to deal with the fact that nbytes is
only valid for certain operations.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I29252be34a9af9fd40f4c7fec9d0a0c1139c562d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16306
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
2023-01-17 23:34:43 +00:00

144 lines
3.9 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C) 2020 Intel Corporation.
* Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES
* All rights reserved.
*/
#ifndef SPDK_ACCEL_MODULE_H
#define SPDK_ACCEL_MODULE_H
#include "spdk/stdinc.h"
#include "spdk/accel.h"
#include "spdk/queue.h"
#include "spdk/config.h"
struct spdk_accel_module_if;
struct spdk_accel_task;
void spdk_accel_task_complete(struct spdk_accel_task *task, int status);
/** Some reasonable key length used with strnlen() */
#define SPDK_ACCEL_CRYPTO_KEY_MAX_HEX_LENGTH (256 + 1)
struct spdk_accel_crypto_key {
void *priv; /**< Module private data */
char *key; /**< Key in binary form */
size_t key_size; /**< Key size in bytes */
char *key2; /**< Key2 in binary form */
size_t key2_size; /**< Key2 size in bytes */
struct spdk_accel_module_if *module_if; /**< Accel module the key belongs to */
struct spdk_accel_crypto_key_create_param param; /**< User input parameters */
TAILQ_ENTRY(spdk_accel_crypto_key) link;
};
enum spdk_accel_aux_iov_type {
SPDK_ACCEL_AUX_IOV_SRC,
SPDK_ACCEL_AUX_IOV_DST,
SPDK_ACCEL_AUX_IOV_SRC2,
SPDK_ACCEL_AUX_IOV_DST2,
SPDK_ACCEL_AUX_IOV_MAX,
};
struct spdk_accel_task {
struct accel_io_channel *accel_ch;
spdk_accel_completion_cb cb_fn;
void *cb_arg;
spdk_accel_step_cb step_cb_fn;
void *step_cb_arg;
struct spdk_memory_domain *src_domain;
void *src_domain_ctx;
struct spdk_memory_domain *dst_domain;
void *dst_domain_ctx;
struct {
struct iovec *iovs; /* iovs passed by the caller */
uint32_t iovcnt; /* iovcnt passed by the caller */
} s;
union {
struct {
struct iovec *iovs; /* iovs passed by the caller */
uint32_t iovcnt; /* iovcnt passed by the caller */
} d;
struct {
struct iovec *iovs;
uint32_t iovcnt;
} s2;
};
union {
struct {
struct iovec *iovs;
uint32_t iovcnt;
} d2;
uint32_t seed;
uint64_t fill_pattern;
struct spdk_accel_crypto_key *crypto_key;
};
union {
uint32_t *crc_dst;
uint32_t *output_size;
uint32_t block_size; /* for crypto op */
};
enum accel_opcode op_code;
uint64_t iv; /* Initialization vector (tweak) for crypto op */
int flags;
int status;
struct iovec aux_iovs[SPDK_ACCEL_AUX_IOV_MAX];
TAILQ_ENTRY(spdk_accel_task) link;
TAILQ_ENTRY(spdk_accel_task) seq_link;
};
struct spdk_accel_module_if {
/** Initialization function for the module. Called by the spdk
* application during startup.
*
* Modules are required to define this function.
*/
int (*module_init)(void);
/** Finish function for the module. Called by the spdk application
* before the spdk application exits to perform any necessary cleanup.
*
* Modules are not required to define this function.
*/
void (*module_fini)(void *ctx);
/**
* Write Acceleration module configuration into provided JSON context.
*/
void (*write_config_json)(struct spdk_json_write_ctx *w);
/**
* Returns the allocation size required for the modules to use for context.
*/
size_t (*get_ctx_size)(void);
const char *name;
bool (*supports_opcode)(enum accel_opcode);
struct spdk_io_channel *(*get_io_channel)(void);
int (*submit_tasks)(struct spdk_io_channel *ch, struct spdk_accel_task *accel_task);
/**
* Create crypto key function. Module is responsible to fill all necessary parameters in
* \b spdk_accel_crypto_key structure
*/
int (*crypto_key_init)(struct spdk_accel_crypto_key *key);
void (*crypto_key_deinit)(struct spdk_accel_crypto_key *key);
TAILQ_ENTRY(spdk_accel_module_if) tailq;
};
void spdk_accel_module_list_add(struct spdk_accel_module_if *accel_module);
#define SPDK_ACCEL_MODULE_REGISTER(name, module) \
static void __attribute__((constructor)) _spdk_accel_module_register_##name(void) \
{ \
spdk_accel_module_list_add(module); \
}
/**
* Called by an accel module when cleanup initiated during .module_fini has completed
*/
void spdk_accel_module_finish(void);
#endif