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:
parent
571638b9b9
commit
24eab32532
@ -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) {
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user