bdev: Add helper functions to allocate/free/get spdk_bdev_io_stat

Add helper functions, bdev_io_stat_alloc(), bdev_io_stat_free(),
and bdev_io_stat_get() for struct spdk_bdev_io_stat.

Then replace a bdev_io_stat_add() call by bdev_io_stat_get() at
spdk_bdev_get_device_stat() because the saved data is queried first.

This is another preparation to extend I/O statistics to include error
counters and module specific counters to output these via the
bdev_get_iostat RPC.

Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I9547757421a1de1b8cb44e0f8ade4b5c2bcad4e6
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15443
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Shuhei Matsumoto 2022-12-07 16:21:03 +09:00 committed by Tomasz Zawadzki
parent 571638b9b9
commit 24eab32532
3 changed files with 35 additions and 12 deletions

View File

@ -3182,9 +3182,9 @@ bdev_channel_destroy_resource(struct spdk_bdev_channel *ch)
struct spdk_bdev_shared_resource *shared_resource;
struct lba_range *range;
free(ch->stat);
bdev_io_stat_free(ch->stat);
#ifdef SPDK_CONFIG_VTUNE
free(ch->prev_stat);
bdev_io_stat_free(ch->prev_stat);
#endif
while (!TAILQ_EMPTY(&ch->locked_ranges)) {
@ -3463,7 +3463,7 @@ bdev_channel_create(void *io_device, void *ctx_buf)
TAILQ_INIT(&ch->io_submitted);
TAILQ_INIT(&ch->io_locked);
ch->stat = calloc(1, sizeof(struct spdk_bdev_io_stat));
ch->stat = bdev_io_stat_alloc();
if (ch->stat == NULL) {
bdev_channel_destroy_resource(ch);
return -1;
@ -3484,7 +3484,7 @@ bdev_channel_create(void *io_device, void *ctx_buf)
free(name);
ch->start_tsc = spdk_get_ticks();
ch->interval_tsc = spdk_get_ticks_hz() / 100;
ch->prev_stat = calloc(1, sizeof(struct spdk_bdev_io_stat));
ch->prev_stat = bdev_io_stat_alloc();
if (ch->prev_stat == NULL) {
bdev_channel_destroy_resource(ch);
return -1;
@ -3687,6 +3687,24 @@ bdev_io_stat_add(struct spdk_bdev_io_stat *total, struct spdk_bdev_io_stat *add)
total->copy_latency_ticks += add->copy_latency_ticks;
}
static void
bdev_io_stat_get(struct spdk_bdev_io_stat *to_stat, struct spdk_bdev_io_stat *from_stat)
{
memcpy(to_stat, from_stat, sizeof(struct spdk_bdev_io_stat));
}
struct spdk_bdev_io_stat *
bdev_io_stat_alloc(void)
{
return calloc(1, sizeof(struct spdk_bdev_io_stat));
}
void
bdev_io_stat_free(struct spdk_bdev_io_stat *stat)
{
free(stat);
}
static void
bdev_channel_abort_queued_ios(struct spdk_bdev_channel *ch)
{
@ -5598,7 +5616,7 @@ spdk_bdev_get_io_stat(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
{
struct spdk_bdev_channel *channel = __io_ch_to_bdev_ch(ch);
memcpy(stat, channel->stat, sizeof(struct spdk_bdev_io_stat));
bdev_io_stat_get(stat, channel->stat);
}
static void
@ -5645,7 +5663,7 @@ spdk_bdev_get_device_stat(struct spdk_bdev *bdev, struct spdk_bdev_io_stat *stat
/* Start with the statistics from previously deleted channels. */
spdk_spin_lock(&bdev->internal.spinlock);
bdev_io_stat_add(bdev_iostat_ctx->stat, bdev->internal.stat);
bdev_io_stat_get(bdev_iostat_ctx->stat, bdev->internal.stat);
spdk_spin_unlock(&bdev->internal.spinlock);
/* Then iterate and add the statistics from each existing channel. */
@ -6430,7 +6448,7 @@ bdev_register(struct spdk_bdev *bdev)
return -ENOMEM;
}
bdev->internal.stat = calloc(1, sizeof(struct spdk_bdev_io_stat));
bdev->internal.stat = bdev_io_stat_alloc();
if (!bdev->internal.stat) {
SPDK_ERRLOG("Unable to allocate I/O statistics structure.\n");
free(bdev_name);
@ -6450,7 +6468,7 @@ bdev_register(struct spdk_bdev *bdev)
ret = bdev_name_add(&bdev->internal.bdev_name, bdev, bdev->name);
if (ret != 0) {
free(bdev->internal.stat);
bdev_io_stat_free(bdev->internal.stat);
free(bdev_name);
return ret;
}
@ -6466,7 +6484,7 @@ bdev_register(struct spdk_bdev *bdev)
if (ret != 0) {
SPDK_ERRLOG("Unable to add uuid:%s alias for bdev %s\n", uuid, bdev->name);
bdev_name_del(&bdev->internal.bdev_name);
free(bdev->internal.stat);
bdev_io_stat_free(bdev->internal.stat);
free(bdev_name);
return ret;
}
@ -6531,7 +6549,7 @@ bdev_destroy_cb(void *io_device)
spdk_spin_destroy(&bdev->internal.spinlock);
free(bdev->internal.qos);
free(bdev->internal.stat);
bdev_io_stat_free(bdev->internal.stat);
rc = bdev->fn_table->destruct(bdev->ctxt);
if (rc < 0) {

View File

@ -21,4 +21,7 @@ void bdev_io_init(struct spdk_bdev_io *bdev_io, struct spdk_bdev *bdev, void *cb
void bdev_io_submit(struct spdk_bdev_io *bdev_io);
struct spdk_bdev_io_stat *bdev_io_stat_alloc(void);
void bdev_io_stat_free(struct spdk_bdev_io_stat *stat);
#endif /* SPDK_BDEV_INTERNAL_H */

View File

@ -15,6 +15,8 @@
#include "spdk/log.h"
#include "bdev_internal.h"
static void
dummy_bdev_event_cb(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, void *ctx)
{
@ -224,7 +226,7 @@ bdev_iostat_ctx_alloc(void)
return NULL;
}
ctx->stat = calloc(1, sizeof(struct spdk_bdev_io_stat));
ctx->stat = bdev_io_stat_alloc();
if (ctx->stat == NULL) {
free(ctx);
return NULL;
@ -236,7 +238,7 @@ bdev_iostat_ctx_alloc(void)
static void
bdev_iostat_ctx_free(struct bdev_get_iostat_ctx *ctx)
{
free(ctx->stat);
bdev_io_stat_free(ctx->stat);
free(ctx);
}