From 827a01135cd2c5676978e1669aa9290ddeee9b37 Mon Sep 17 00:00:00 2001 From: Liu Xiaodong Date: Wed, 25 Jan 2023 03:33:21 -0500 Subject: [PATCH] ublk: fix the memory release of ublk_io Add function named ublk_ios_fini() to release memories allocated in ublk_ios_init(). Fix the incorrect memory release for the failure inside ublk_ios_init() by ublk_ios_fini(). Also move the memory release of ublk_io into function ublk_delete_dev() instead of ublk_close_dev_done(). This will be used by next patch. Change-Id: I5c3fc31a4d7114e17fb86fc6facc8cccea27d6e7 Signed-off-by: Liu Xiaodong Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16442 Reviewed-by: Konrad Sztyber Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/ublk/ublk.c | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/lib/ublk/ublk.c b/lib/ublk/ublk.c index eefdc2a8d..c510a124e 100644 --- a/lib/ublk/ublk.c +++ b/lib/ublk/ublk.c @@ -47,6 +47,7 @@ static void ublk_submit_bdev_io(struct ublk_queue *q, uint16_t tag); static void ublk_dev_queue_fini(struct ublk_queue *q); static int ublk_poll(void *arg); static int ublk_ctrl_cmd(struct spdk_ublk_dev *ublk, uint32_t cmd_op); +static void ublk_ios_fini(struct spdk_ublk_dev *ublk); typedef void (*ublk_next_state_fn)(struct spdk_ublk_dev *ublk); static void ublk_set_params(struct spdk_ublk_dev *ublk); @@ -658,24 +659,14 @@ static void ublk_close_dev_done(void *arg) { struct spdk_ublk_dev *ublk = arg; - struct ublk_queue *q; int rc = 0; - uint32_t i, q_idx; + uint32_t q_idx; assert(spdk_get_thread() == ublk->app_thread); for (q_idx = 0; q_idx < ublk->num_queues; q_idx++) { - q = &ublk->queues[q_idx]; - ublk_dev_queue_fini(q); - for (i = 0; i < q->q_depth; i++) { - if (q->ios[i].payload) { - spdk_mempool_put(ublk->io_buf_pool, q->ios[i].payload); - q->ios[i].payload = NULL; - } - } - free(q->ios); + ublk_dev_queue_fini(&ublk->queues[q_idx]); } - spdk_mempool_free(ublk->io_buf_pool); if (ublk->cdev_fd >= 0) { close(ublk->cdev_fd); } @@ -694,6 +685,7 @@ ublk_delete_dev(struct spdk_ublk_dev *ublk) ublk->bdev_desc = NULL; } + ublk_ios_fini(ublk); ublk_dev_list_unregister(ublk); if (ublk->del_cb) { @@ -1241,6 +1233,32 @@ ublk_info_param_init(struct spdk_ublk_dev *ublk) ublk->dev_params = uparams; } +static void +ublk_ios_fini(struct spdk_ublk_dev *ublk) +{ + struct ublk_queue *q; + uint32_t i, q_idx; + + for (q_idx = 0; q_idx < ublk->num_queues; q_idx++) { + q = &ublk->queues[q_idx]; + + /* The ublk_io of this queue are not initialized. */ + if (q->ios == NULL) { + continue; + } + + for (i = 0; i < q->q_depth; i++) { + if (q->ios[i].payload) { + spdk_mempool_put(ublk->io_buf_pool, q->ios[i].payload); + q->ios[i].payload = NULL; + } + } + free(q->ios); + } + + spdk_mempool_free(ublk->io_buf_pool); +} + static int ublk_ios_init(struct spdk_ublk_dev *ublk) { @@ -1286,12 +1304,7 @@ ublk_ios_init(struct spdk_ublk_dev *ublk) return 0; err: - spdk_mempool_free(ublk->io_buf_pool); - for (i = 0; i < ublk->num_queues; i++) { - q = &ublk->queues[i]; - - free(q->ios); - } + ublk_ios_fini(ublk); return rc; }