diff options
author | Maurizio Lombardi <mlombard@redhat.com> | 2021-11-03 09:18:17 +0100 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2021-11-23 17:22:41 +0100 |
commit | a5053c92b3db71c3f7f9f13934ca620632828d06 (patch) | |
tree | 656ab595432a6f9e0d7b3d7ad7dacf4e9bc4196c /drivers/nvme | |
parent | 1d3ef9c3a39e04be31155c27ebf80342350c3abf (diff) | |
download | linux-a5053c92b3db71c3f7f9f13934ca620632828d06.tar.bz2 |
nvme-tcp: fix memory leak when freeing a queue
Release the page frag cache when tearing down the io queues
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: John Meneghini <jmeneghi@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/nvme')
-rw-r--r-- | drivers/nvme/host/tcp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 5f8ad4d4ac8c..4ceb28675fdf 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1225,6 +1225,7 @@ static int nvme_tcp_alloc_async_req(struct nvme_tcp_ctrl *ctrl) static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid) { + struct page *page; struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl); struct nvme_tcp_queue *queue = &ctrl->queues[qid]; @@ -1234,6 +1235,11 @@ static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid) if (queue->hdr_digest || queue->data_digest) nvme_tcp_free_crypto(queue); + if (queue->pf_cache.va) { + page = virt_to_head_page(queue->pf_cache.va); + __page_frag_cache_drain(page, queue->pf_cache.pagecnt_bias); + queue->pf_cache.va = NULL; + } sock_release(queue->sock); kfree(queue->pdu); mutex_destroy(&queue->send_mutex); |