Commit f135f5ff authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Jim Harris
Browse files

accel: collect statistics



This patch adds support for collecting statistics in accel framework.
Currently, it counts the following events:
 1. The number and the type of executed/failed operations.
 2. The number of executed/failed accel sequences.

For now, these statistics are only collected and there's no way of
retrieving (or resetting) them - that will be added in the following
patches.

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


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent f61e421b
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ struct accel_io_channel {
	TAILQ_HEAD(, spdk_accel_sequence)	seq_pool;
	TAILQ_HEAD(, accel_buffer)		buf_pool;
	struct spdk_iobuf_channel		iobuf;
	struct accel_stats			stats;
};

TAILQ_HEAD(accel_sequence_tasks, spdk_accel_task);
@@ -155,6 +156,10 @@ struct spdk_accel_sequence {
	TAILQ_ENTRY(spdk_accel_sequence)	link;
};

#define accel_update_stats(ch, event) (ch)->stats.event++
#define accel_update_task_stats(ch, task, event) \
	accel_update_stats(ch, operations[(task)->op_code].event)

static inline void
accel_sequence_set_state(struct spdk_accel_sequence *seq, enum accel_sequence_state state)
{
@@ -257,6 +262,11 @@ spdk_accel_task_complete(struct spdk_accel_task *accel_task, int status)
	 */
	TAILQ_INSERT_HEAD(&accel_ch->task_pool, accel_task, link);

	accel_update_task_stats(accel_ch, accel_task, executed);
	if (spdk_unlikely(status != 0)) {
		accel_update_task_stats(accel_ch, accel_task, failed);
	}

	cb_fn(cb_arg, status);
}

@@ -288,8 +298,14 @@ accel_submit_task(struct accel_io_channel *accel_ch, struct spdk_accel_task *tas
{
	struct spdk_io_channel *module_ch = accel_ch->module_ch[task->op_code];
	struct spdk_accel_module_if *module = g_modules_opc[task->op_code].module;
	int rc;

	rc = module->submit_tasks(module_ch, task);
	if (spdk_unlikely(rc != 0)) {
		accel_update_task_stats(accel_ch, task, failed);
	}

	return module->submit_tasks(module_ch, task);
	return rc;
}

/* Accel framework public API for copy function */
@@ -1133,6 +1149,11 @@ accel_sequence_complete(struct spdk_accel_sequence *seq)
{
	SPDK_DEBUGLOG(accel, "Completed sequence: %p with status: %d\n", seq, seq->status);

	accel_update_stats(seq->ch, sequence_executed);
	if (spdk_unlikely(seq->status != 0)) {
		accel_update_stats(seq->ch, sequence_failed);
	}

	/* First notify all users that appended operations to this sequence */
	accel_sequence_complete_tasks(seq);

@@ -2134,6 +2155,7 @@ err:
	free(accel_ch->task_pool_base);
	free(accel_ch->seq_pool_base);
	free(accel_ch->buf_pool_base);

	return -ENOMEM;
}

+11 −0
Original line number Diff line number Diff line
@@ -20,6 +20,17 @@ struct module_info {
	uint32_t num_ops;
};

struct accel_operation_stats {
	uint64_t executed;
	uint64_t failed;
};

struct accel_stats {
	struct accel_operation_stats	operations[ACCEL_OPC_LAST];
	uint64_t			sequence_executed;
	uint64_t			sequence_failed;
};

typedef void (*_accel_for_each_module_fn)(struct module_info *info);
void _accel_for_each_module(struct module_info *info, _accel_for_each_module_fn fn);
int _accel_get_opc_name(enum accel_opcode opcode, const char **opcode_name);
+2 −2

File changed.

Contains only whitespace changes.