bdev: track io_stats from deleted channels

Currently, the bdev layer iterates over all of the
existing channels of a bdev to collect I/O
statistics.  But this ignores statistics for
channels that are deleted.

Fix that by keeping an io_stat structure in the
bdev which accumulates statistics for deleted
channels.  Use the bdev mutex to protect these
accumulations.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I3103c0b8b55973c827d977765f47e5b9e7f58e5f

Reviewed-on: https://review.gerrithub.io/421029
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jim Harris 2018-08-01 11:50:38 -07:00
parent d18d51b047
commit 27635c770f
2 changed files with 13 additions and 0 deletions

View File

@ -324,6 +324,8 @@ struct spdk_bdev {
/** weighted time performing I/O. Equal to measured_queue_depth * period */
uint64_t weighted_io_time;
/** accumulated I/O statistics for previously deleted channels of this bdev */
struct spdk_bdev_io_stat stat;
} internal;
};

View File

@ -1499,6 +1499,11 @@ spdk_bdev_channel_destroy(void *io_device, void *ctx_buf)
SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Destroying channel %p for bdev %s on thread %p\n", ch, ch->bdev->name,
spdk_get_thread());
/* This channel is going away, so add its statistics into the bdev so that they don't get lost. */
pthread_mutex_lock(&ch->bdev->internal.mutex);
_spdk_bdev_io_stat_add(&ch->bdev->internal.stat, &ch->stat);
pthread_mutex_unlock(&ch->bdev->internal.mutex);
mgmt_ch = shared_resource->mgmt_ch;
_spdk_bdev_abort_queued_io(&ch->queued_resets, ch);
@ -2305,6 +2310,12 @@ spdk_bdev_get_device_stat(struct spdk_bdev *bdev, struct spdk_bdev_io_stat *stat
bdev_iostat_ctx->cb = cb;
bdev_iostat_ctx->cb_arg = cb_arg;
/* Start with the statistics from previously deleted channels. */
pthread_mutex_lock(&bdev->internal.mutex);
_spdk_bdev_io_stat_add(bdev_iostat_ctx->stat, &bdev->internal.stat);
pthread_mutex_unlock(&bdev->internal.mutex);
/* Then iterate and add the statistics from each existing channel. */
spdk_for_each_channel(__bdev_to_io_dev(bdev),
_spdk_bdev_get_each_channel_stat,
bdev_iostat_ctx,