accel: keep track of destroyed channels' statistics

To make sure we don't lose statistics of destroyed channels, they're now
added to a global stats structure when a channel is destroyed.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ic3b4d285b83267ac06fad1e83721c1b15cc8ec8a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17567
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
Konrad Sztyber 2023-04-13 12:29:10 +02:00 committed by David Ko
parent 0f81ba102b
commit c72148f1a2

View File

@ -66,6 +66,8 @@ static struct spdk_accel_opts g_opts = {
.small_cache_size = ACCEL_SMALL_CACHE_SIZE,
.large_cache_size = ACCEL_LARGE_CACHE_SIZE,
};
static struct accel_stats g_stats;
static struct spdk_spinlock g_stats_lock;
static const char *g_opcode_strings[ACCEL_OPC_LAST] = {
"copy", "fill", "dualcast", "compare", "crc32c", "copy_crc32c",
@ -2159,6 +2161,19 @@ err:
return -ENOMEM;
}
static void
accel_add_stats(struct accel_stats *total, struct accel_stats *stats)
{
int i;
total->sequence_executed += stats->sequence_executed;
total->sequence_failed += stats->sequence_failed;
for (i = 0; i < ACCEL_OPC_LAST; ++i) {
total->operations[i].executed += stats->operations[i].executed;
total->operations[i].failed += stats->operations[i].failed;
}
}
/* Framework level channel destroy callback. */
static void
accel_destroy_channel(void *io_device, void *ctx_buf)
@ -2174,6 +2189,11 @@ accel_destroy_channel(void *io_device, void *ctx_buf)
accel_ch->module_ch[i] = NULL;
}
/* Update global stats to make sure channel's stats aren't lost after a channel is gone */
spdk_spin_lock(&g_stats_lock);
accel_add_stats(&g_stats, &accel_ch->stats);
spdk_spin_unlock(&g_stats_lock);
free(accel_ch->task_pool_base);
free(accel_ch->seq_pool_base);
free(accel_ch->buf_pool_base);
@ -2221,6 +2241,7 @@ spdk_accel_initialize(void)
}
spdk_spin_init(&g_keyring_spin);
spdk_spin_init(&g_stats_lock);
g_modules_started = true;
accel_module_initialize();
@ -2541,16 +2562,8 @@ accel_get_channel_stats(struct spdk_io_channel_iter *iter)
struct spdk_io_channel *ch = spdk_io_channel_iter_get_channel(iter);
struct accel_io_channel *accel_ch = spdk_io_channel_get_ctx(ch);
struct accel_get_stats_ctx *ctx = spdk_io_channel_iter_get_ctx(iter);
struct accel_stats *stats = &ctx->stats;
int i;
stats->sequence_executed += accel_ch->stats.sequence_executed;
stats->sequence_failed += accel_ch->stats.sequence_failed;
for (i = 0; i < ACCEL_OPC_LAST; ++i) {
stats->operations[i].executed += accel_ch->stats.operations[i].executed;
stats->operations[i].failed += accel_ch->stats.operations[i].failed;
}
accel_add_stats(&ctx->stats, &accel_ch->stats);
spdk_for_each_channel_continue(iter, 0);
}
@ -2564,6 +2577,10 @@ accel_get_stats(accel_get_stats_cb cb_fn, void *cb_arg)
return -ENOMEM;
}
spdk_spin_lock(&g_stats_lock);
accel_add_stats(&ctx->stats, &g_stats);
spdk_spin_unlock(&g_stats_lock);
ctx->cb_fn = cb_fn;
ctx->cb_arg = cb_arg;