Commit 02e8b81b authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

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: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ia947cf553619828a170c5d0563b4c355d7b5ead5
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16377


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent efcae1bd
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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
+38 −0
Original line number Diff line number Diff line
@@ -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)
{
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@
	spdk_accel_sequence_continue;
	spdk_accel_driver_register;
	spdk_accel_get_memory_domain;
	spdk_accel_alloc_sequence_buf;

	local: *;
};