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:
parent
efcae1bdee
commit
02e8b81bb6
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -42,6 +42,7 @@
|
||||
spdk_accel_sequence_continue;
|
||||
spdk_accel_driver_register;
|
||||
spdk_accel_get_memory_domain;
|
||||
spdk_accel_alloc_sequence_buf;
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user