diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index d4da408b2..af094002a 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -115,6 +115,9 @@ struct spdk_bdev_io_stat { uint64_t num_read_ops; uint64_t bytes_written; uint64_t num_write_ops; + uint64_t read_latency_ticks; + uint64_t write_latency_ticks; + uint64_t ticks_rate; }; typedef void (*spdk_bdev_init_cb)(void *cb_arg, int rc); diff --git a/include/spdk_internal/bdev.h b/include/spdk_internal/bdev.h index 6d4b5c692..d58e3f10c 100644 --- a/include/spdk_internal/bdev.h +++ b/include/spdk_internal/bdev.h @@ -385,6 +385,9 @@ struct spdk_bdev_io { /** It may be used by modules to put the bdev_io into its own list. */ TAILQ_ENTRY(spdk_bdev_io) module_link; + /** Current tsc at submit time. Used to calculate latency at completion. */ + uint64_t submit_tsc; + /** * Per I/O context for use by the bdev module. */ diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 7a2404bbf..25b4c082b 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -807,6 +807,7 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io) assert(bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING); + bdev_io->submit_tsc = spdk_get_ticks(); shared_ch->io_outstanding++; bdev_io->in_submit_request = true; if (spdk_likely(bdev_ch->flags == 0)) { @@ -1664,6 +1665,7 @@ spdk_bdev_get_io_stat(struct spdk_bdev *bdev, struct spdk_io_channel *ch, struct spdk_bdev_channel *channel = spdk_io_channel_get_ctx(ch); + channel->stat.ticks_rate = spdk_get_ticks_hz(); *stat = channel->stat; memset(&channel->stat, 0, sizeof(channel->stat)); } @@ -1916,10 +1918,12 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta case SPDK_BDEV_IO_TYPE_READ: bdev_ch->stat.bytes_read += bdev_io->u.bdev.num_blocks * bdev->blocklen; bdev_ch->stat.num_read_ops++; + bdev_ch->stat.read_latency_ticks += (spdk_get_ticks() - bdev_io->submit_tsc); break; case SPDK_BDEV_IO_TYPE_WRITE: bdev_ch->stat.bytes_written += bdev_io->u.bdev.num_blocks * bdev->blocklen; bdev_ch->stat.num_write_ops++; + bdev_ch->stat.write_latency_ticks += (spdk_get_ticks() - bdev_io->submit_tsc); break; default: break;