From 5817a1cf3f4a079aefdd384d395f1d1c73639534 Mon Sep 17 00:00:00 2001 From: Marcin Dziegielewski Date: Fri, 20 Sep 2019 14:36:51 +0200 Subject: [PATCH] lib/bdev/ocf: fix memory leak of vbdev_ocf_qcxt Realted to #957 Normally we are using vbdev_ocf_qcxt allocated by spdk device (ctx_buf), but after io_device_destroy_cb this context can be freed, so we allocate a local copy to use for issuing requests on ocf bdev stop. Unfortunately, in current code we are not freeing it, this patch fix that issue. Signed-off-by: Marcin Dziegielewski Change-Id: I2d5c0b529f4ff79960945b9e598f21602209f839 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468983 Reviewed-by: Vitaliy Mysak Reviewed-by: Jim Harris Reviewed-by: Paul Luse Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- module/bdev/ocf/vbdev_ocf.c | 4 ++++ module/bdev/ocf/vbdev_ocf.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 95a94fbe3..35396f102 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -730,6 +730,9 @@ vbdev_ocf_ctx_queue_stop(ocf_queue_t q) spdk_put_io_channel(qctx->cache_ch); spdk_put_io_channel(qctx->core_ch); spdk_poller_unregister(&qctx->poller); + if (qctx->allocated) { + free(qctx); + } } } @@ -779,6 +782,7 @@ io_device_destroy_cb(void *io_device, void *ctx_buf) memcpy(copy, qctx, sizeof(*copy)); spdk_poller_unregister(&qctx->poller); copy->poller = spdk_poller_register(queue_poll, copy, 0); + copy->allocated = true; } else { SPDK_ERRLOG("Unable to stop OCF queue properly: %s\n", spdk_strerror(ENOMEM)); diff --git a/module/bdev/ocf/vbdev_ocf.h b/module/bdev/ocf/vbdev_ocf.h index 0b952bd5a..a5e81970b 100644 --- a/module/bdev/ocf/vbdev_ocf.h +++ b/module/bdev/ocf/vbdev_ocf.h @@ -55,6 +55,8 @@ struct vbdev_ocf_qcxt { /* Base devices channels */ struct spdk_io_channel *cache_ch; struct spdk_io_channel *core_ch; + /* If true, we have to free this context on queue stop */ + bool allocated; /* Link to per-bdev list of queue contexts */ TAILQ_ENTRY(vbdev_ocf_qcxt) tailq; };