Commit 24eab325 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

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: default avatarShuhei 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: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 571638b9
Loading
Loading
Loading
Loading
+28 −10
Original line number Diff line number Diff line
@@ -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) {
+3 −0
Original line number Diff line number Diff line
@@ -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 */
+4 −2
Original line number Diff line number Diff line
@@ -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);
}