Commit 84276cce authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

accel: pass driver's IO channel to execute_sequence()



It allows drivers to have easy access to a per-thread structure when
executing a sequence, similarly to how module's submit_tasks() works.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I3d5c0e389858163043dd6481f8f997f0dc6b1d37
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18857


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent ec06abe1
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -224,11 +224,16 @@ struct spdk_accel_driver {
	 * to the driver.  `spdk_accel_sequence_continue()` should only be called if this function
	 * succeeds (i.e. returns 0).
	 *
	 * \param Sequence of tasks to execute.
	 * \param ch IO channel obtained by `get_io_channel()`.
	 * \param seq Sequence of tasks to execute.
	 *
	 * \return 0 on success, negative errno on failure.
	 */
	int (*execute_sequence)(struct spdk_accel_sequence *seq);
	int (*execute_sequence)(struct spdk_io_channel *ch, struct spdk_accel_sequence *seq);
	/**
	 * Returns IO channel that will be passed to `execute_sequence()`.
	 */
	struct spdk_io_channel *(*get_io_channel)(void);

	TAILQ_ENTRY(spdk_accel_driver)	tailq;
};
+17 −1
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ struct accel_buffer {

struct accel_io_channel {
	struct spdk_io_channel			*module_ch[ACCEL_OPC_LAST];
	struct spdk_io_channel			*driver_channel;
	void					*task_pool_base;
	struct spdk_accel_sequence		*seq_pool_base;
	struct accel_buffer			*buf_pool_base;
@@ -1672,7 +1673,7 @@ accel_process_sequence(struct spdk_accel_sequence *seq)
			assert(!TAILQ_EMPTY(&seq->tasks));

			accel_sequence_set_state(seq, ACCEL_SEQUENCE_STATE_DRIVER_AWAIT_TASK);
			rc = g_accel_driver->execute_sequence(seq);
			rc = g_accel_driver->execute_sequence(accel_ch->driver_channel, seq);
			if (spdk_unlikely(rc != 0)) {
				SPDK_ERRLOG("Failed to execute sequence: %p using driver: %s\n",
					    seq, g_accel_driver->name);
@@ -2362,6 +2363,14 @@ accel_create_channel(void *io_device, void *ctx_buf)
		}
	}

	if (g_accel_driver != NULL) {
		accel_ch->driver_channel = g_accel_driver->get_io_channel();
		if (accel_ch->driver_channel == NULL) {
			SPDK_ERRLOG("Failed to get driver's IO channel\n");
			goto err;
		}
	}

	rc = spdk_iobuf_channel_init(&accel_ch->iobuf, "accel", g_opts.small_cache_size,
				     g_opts.large_cache_size);
	if (rc != 0) {
@@ -2371,6 +2380,9 @@ accel_create_channel(void *io_device, void *ctx_buf)

	return 0;
err:
	if (accel_ch->driver_channel != NULL) {
		spdk_put_io_channel(accel_ch->driver_channel);
	}
	for (j = 0; j < i; j++) {
		spdk_put_io_channel(accel_ch->module_ch[j]);
	}
@@ -2404,6 +2416,10 @@ accel_destroy_channel(void *io_device, void *ctx_buf)

	spdk_iobuf_channel_fini(&accel_ch->iobuf);

	if (accel_ch->driver_channel != NULL) {
		spdk_put_io_channel(accel_ch->driver_channel);
	}

	for (i = 0; i < ACCEL_OPC_LAST; i++) {
		assert(accel_ch->module_ch[i] != NULL);
		spdk_put_io_channel(accel_ch->module_ch[i]);
+8 −1
Original line number Diff line number Diff line
@@ -3176,7 +3176,7 @@ struct ut_driver_operation {
static struct ut_driver_operation g_drv_operations[ACCEL_OPC_LAST];

static int
ut_driver_execute_sequence(struct spdk_accel_sequence *seq)
ut_driver_execute_sequence(struct spdk_io_channel *ch, struct spdk_accel_sequence *seq)
{
	struct spdk_accel_task *task;
	struct ut_driver_operation *drv_ops;
@@ -3218,9 +3218,16 @@ ut_driver_execute_sequence(struct spdk_accel_sequence *seq)
	return 0;
}

static struct spdk_io_channel *
ut_driver_get_io_channel(void)
{
	return (void *)0xdeadbeef;
}

static struct spdk_accel_driver g_ut_driver = {
	.name = "ut",
	.execute_sequence = ut_driver_execute_sequence,
	.get_io_channel = ut_driver_get_io_channel,
};

SPDK_ACCEL_DRIVER_REGISTER(ut, &g_ut_driver);