From f192c11bbfdf1d49c3ea7fc79af44d174c4dc297 Mon Sep 17 00:00:00 2001 From: Richael Zhuang Date: Fri, 11 Nov 2022 15:44:53 +0800 Subject: [PATCH] bdev: support to get histogram per channel Added new API 'spdk_bdev_histogram_get_channel' to get histogram of a specified channel for a bdev. A callback function is passed to it to process the histogram. Change-Id: If5d56cbb5fe6c39cda7882f887dcc9c6afa769ac Signed-off-by: Richael Zhuang Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15539 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- CHANGELOG.md | 3 +++ include/spdk/bdev.h | 13 +++++++++++++ lib/bdev/bdev.c | 15 +++++++++++++++ lib/bdev/spdk_bdev.map | 1 + test/unit/lib/bdev/bdev.c/bdev_ut.c | 20 ++++++++++++++++++++ 5 files changed, 52 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f11b54132..5233326d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,9 @@ running `bdev_nvme_set_options` RPC with `--generate-uuids` option. These identi are based on serial number and namespace ID and will always be the same for a given device. +A new API `spdk_bdev_channel_get_histogram` was added to get the histogram of a specified +channel for a bdev. + ### event Added core lock file mechanism to prevent the same CPU cores from being used by multiple diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index 002b4bb84..075df9c66 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -1938,6 +1938,19 @@ void spdk_bdev_histogram_get(struct spdk_bdev *bdev, struct spdk_histogram_data spdk_bdev_histogram_data_cb cb_fn, void *cb_arg); +/** + * Get histogram data of the specified channel for a bdev. The histogram passed to cb_fn + * is only valid during the execution of cb_fn. Referencing the histogram after cb_fn + * returns is not supported and yields undetermined behavior. + * + * \param bdev Block device. + * \param ch IO channel of bdev. + * \param cb_fn Callback function to process the histogram of the channel. + * \param cb_arg Argument to pass to cb_fn. + */ +void spdk_bdev_channel_get_histogram(struct spdk_bdev *bdev, struct spdk_io_channel *ch, + spdk_bdev_histogram_data_cb cb_fn, void *cb_arg); + /** * Retrieves media events. Can only be called from the context of * SPDK_BDEV_EVENT_MEDIA_MANAGEMENT event callback. These events are sent by diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index df760aa6b..6b3af2559 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -7634,6 +7634,21 @@ spdk_bdev_histogram_get(struct spdk_bdev *bdev, struct spdk_histogram_data *hist bdev_histogram_get_channel_cb); } +void +spdk_bdev_channel_get_histogram(struct spdk_bdev *bdev, struct spdk_io_channel *ch, + spdk_bdev_histogram_data_cb cb_fn, void *cb_arg) +{ + struct spdk_bdev_channel *bdev_ch = __io_ch_to_bdev_ch(ch); + int status = 0; + + assert(cb_fn != NULL); + + if (bdev_ch->histogram == NULL) { + status = -EFAULT; + } + cb_fn(cb_arg, status, bdev_ch->histogram); +} + size_t spdk_bdev_get_media_events(struct spdk_bdev_desc *desc, struct spdk_bdev_media_event *events, size_t max_events) diff --git a/lib/bdev/spdk_bdev.map b/lib/bdev/spdk_bdev.map index 26ae9aa96..45f2a49d2 100644 --- a/lib/bdev/spdk_bdev.map +++ b/lib/bdev/spdk_bdev.map @@ -99,6 +99,7 @@ spdk_bdev_io_get_seek_offset; spdk_bdev_histogram_enable; spdk_bdev_histogram_get; + spdk_bdev_channel_get_histogram; spdk_bdev_get_media_events; spdk_bdev_get_memory_domains; spdk_bdev_readv_blocks_ext; diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index f1b67b205..02b305e0a 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -3423,6 +3423,18 @@ histogram_io_count(void *ctx, uint64_t start, uint64_t end, uint64_t count, g_count += count; } +static void +histogram_channel_data_cb(void *cb_arg, int status, struct spdk_histogram_data *histogram) +{ + spdk_histogram_data_fn cb_fn = cb_arg; + + g_status = status; + + if (status == 0) { + spdk_histogram_data_iterate(histogram, cb_fn, NULL); + } +} + static void bdev_histograms(void) { @@ -3493,6 +3505,11 @@ bdev_histograms(void) spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL); CU_ASSERT(g_count == 2); + g_count = 0; + spdk_bdev_channel_get_histogram(bdev, ch, histogram_channel_data_cb, histogram_io_count); + CU_ASSERT(g_status == 0); + CU_ASSERT(g_count == 2); + /* Disable histogram */ spdk_bdev_histogram_enable(bdev, histogram_status_cb, NULL, false); poll_threads(); @@ -3504,6 +3521,9 @@ bdev_histograms(void) poll_threads(); CU_ASSERT(g_status == -EFAULT); + spdk_bdev_channel_get_histogram(bdev, ch, histogram_channel_data_cb, NULL); + CU_ASSERT(g_status == -EFAULT); + spdk_histogram_data_free(histogram); spdk_put_io_channel(ch); spdk_bdev_close(desc);