accel: expose method for allocating accel buffers

This will allow a platform driver to allocate a buffer in case it cannot
execute the whole sequence and the destination buffer of the last
operation is a "virtual" accel buffer.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ia947cf553619828a170c5d0563b4c355d7b5ead5
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16377
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Konrad Sztyber 2023-01-04 13:59:15 +01:00 committed by Tomasz Zawadzki
parent efcae1bdee
commit 02e8b81bb6
3 changed files with 58 additions and 0 deletions

View File

@ -217,4 +217,23 @@ static void __attribute__((constructor)) _spdk_accel_driver_register_##name(void
*/
struct spdk_memory_domain *spdk_accel_get_memory_domain(void);
typedef void (*spdk_accel_sequence_get_buf_cb)(struct spdk_accel_sequence *seq, void *cb_arg);
/**
* Allocates memory for an accel buffer in a given sequence. The callback is only executed if the
* buffer couldn't be allocated immediately.
*
* \param seq Sequence object.
* \param buf Accel buffer to allocate.
* \param domain Accel memory domain.
* \param domain_ctx Memory domain context.
* \param cb_fn Callback to be executed once the buffer is allocated.
* \param cb_ctx Argument to be passed to `cb_fn`.
*
* \return true if the buffer was immediately allocated, false otherwise.
*/
bool spdk_accel_alloc_sequence_buf(struct spdk_accel_sequence *seq, void *buf,
struct spdk_memory_domain *domain, void *domain_ctx,
spdk_accel_sequence_get_buf_cb cb_fn, void *cb_ctx);
#endif

View File

@ -114,6 +114,8 @@ struct accel_buffer {
void *buf;
uint64_t len;
struct spdk_iobuf_entry iobuf;
spdk_accel_sequence_get_buf_cb cb_fn;
void *cb_ctx;
TAILQ_ENTRY(accel_buffer) link;
};
@ -706,6 +708,7 @@ accel_get_buf(struct accel_io_channel *ch, uint64_t len)
buf->len = len;
buf->buf = NULL;
buf->seq = NULL;
buf->cb_fn = NULL;
return buf;
}
@ -1215,6 +1218,41 @@ accel_sequence_check_virtbuf(struct spdk_accel_sequence *seq, struct spdk_accel_
return true;
}
static void
accel_sequence_get_buf_cb(struct spdk_iobuf_entry *entry, void *buf)
{
struct accel_buffer *accel_buf;
accel_buf = SPDK_CONTAINEROF(entry, struct accel_buffer, iobuf);
assert(accel_buf->seq != NULL);
assert(accel_buf->buf == NULL);
accel_buf->buf = buf;
accel_sequence_set_virtbuf(accel_buf->seq, accel_buf);
accel_buf->cb_fn(accel_buf->seq, accel_buf->cb_ctx);
}
bool
spdk_accel_alloc_sequence_buf(struct spdk_accel_sequence *seq, void *buf,
struct spdk_memory_domain *domain, void *domain_ctx,
spdk_accel_sequence_get_buf_cb cb_fn, void *cb_ctx)
{
struct accel_buffer *accel_buf = domain_ctx;
assert(domain == g_accel_domain);
accel_buf->cb_fn = cb_fn;
accel_buf->cb_ctx = cb_ctx;
if (!accel_sequence_alloc_buf(seq, accel_buf, accel_sequence_get_buf_cb)) {
return false;
}
accel_sequence_set_virtbuf(seq, accel_buf);
return true;
}
static inline uint64_t
accel_get_iovlen(struct iovec *iovs, uint32_t iovcnt)
{

View File

@ -42,6 +42,7 @@
spdk_accel_sequence_continue;
spdk_accel_driver_register;
spdk_accel_get_memory_domain;
spdk_accel_alloc_sequence_buf;
local: *;
};