From 04786a73c33de4e11e3de0433b7e95d7b270cf26 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 15 Nov 2022 11:14:41 +0900 Subject: [PATCH] bdev: Alloc spdk_bdev_io_stat dynamically for bdev_get_iostat_ctx The following patches will extend I/O statistics to include error counters and module specific counters to output these via the bdev_get_iostat RPC. In this case, the size of the struct spdk_bdev_iostat will be variable. As a preparation, allocate spdk_bdev_io_stat dynamically. For the per_channel mode, we can share the bdev_ctx->stat because spdk_bdev_get_io_stat() always overwrites stat. Signed-off-by: Shuhei Matsumoto Change-Id: I51cd550f52dc3b7d0f3f825fd48bcbeb3ecdcff2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14836 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Krzysztof Karas Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- lib/bdev/bdev_rpc.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/bdev/bdev_rpc.c b/lib/bdev/bdev_rpc.c index 5609b6638..bb7c25091 100644 --- a/lib/bdev/bdev_rpc.c +++ b/lib/bdev/bdev_rpc.c @@ -166,7 +166,7 @@ struct rpc_get_iostat_ctx { }; struct bdev_get_iostat_ctx { - struct spdk_bdev_io_stat stat; + struct spdk_bdev_io_stat *stat; struct rpc_get_iostat_ctx *rpc_ctx; struct spdk_bdev_desc *desc; }; @@ -217,12 +217,26 @@ rpc_get_iostat_done(struct rpc_get_iostat_ctx *rpc_ctx) static struct bdev_get_iostat_ctx * bdev_iostat_ctx_alloc(void) { - return calloc(1, sizeof(struct bdev_get_iostat_ctx)); + struct bdev_get_iostat_ctx *ctx; + + ctx = calloc(1, sizeof(struct bdev_get_iostat_ctx)); + if (ctx == NULL) { + return NULL; + } + + ctx->stat = calloc(1, sizeof(struct spdk_bdev_io_stat)); + if (ctx->stat == NULL) { + free(ctx); + return NULL; + } + + return ctx; } static void bdev_iostat_ctx_free(struct bdev_get_iostat_ctx *ctx) { + free(ctx->stat); free(ctx); } @@ -258,7 +272,7 @@ bdev_get_iostat_done(struct spdk_bdev *bdev, struct spdk_bdev_io_stat *stat, goto done; } - assert(stat == &bdev_ctx->stat); + assert(stat == bdev_ctx->stat); spdk_json_write_object_begin(w); @@ -310,7 +324,7 @@ bdev_get_iostat(void *ctx, struct spdk_bdev *bdev) rpc_ctx->bdev_count++; bdev_ctx->rpc_ctx = rpc_ctx; - spdk_bdev_get_device_stat(bdev, &bdev_ctx->stat, bdev_get_iostat_done, bdev_ctx); + spdk_bdev_get_device_stat(bdev, bdev_ctx->stat, bdev_get_iostat_done, bdev_ctx); return 0; } @@ -333,13 +347,12 @@ bdev_get_per_channel_stat(struct spdk_bdev_channel_iter *i, struct spdk_bdev *bd { struct bdev_get_iostat_ctx *bdev_ctx = ctx; struct spdk_json_write_ctx *w = bdev_ctx->rpc_ctx->w; - struct spdk_bdev_io_stat stat; - spdk_bdev_get_io_stat(bdev, ch, &stat); + spdk_bdev_get_io_stat(bdev, ch, bdev_ctx->stat); spdk_json_write_object_begin(w); spdk_json_write_named_uint64(w, "thread_id", spdk_thread_get_id(spdk_get_thread())); - bdev_get_iostat_dump(w, &stat); + bdev_get_iostat_dump(w, bdev_ctx->stat); spdk_json_write_object_end(w); spdk_bdev_for_each_channel_continue(i, 0); @@ -430,7 +443,7 @@ rpc_bdev_get_iostat(struct spdk_jsonrpc_request *request, rpc_ctx->bdev_count++; bdev_ctx->rpc_ctx = rpc_ctx; if (req.per_channel == false) { - spdk_bdev_get_device_stat(spdk_bdev_desc_get_bdev(desc), &bdev_ctx->stat, + spdk_bdev_get_device_stat(spdk_bdev_desc_get_bdev(desc), bdev_ctx->stat, bdev_get_iostat_done, bdev_ctx); } else { spdk_bdev_for_each_channel(spdk_bdev_desc_get_bdev(desc),