nvme-tcp: fix memory leak when freeing a queue
authorMaurizio Lombardi <mlombard@redhat.com>
Wed, 3 Nov 2021 08:18:17 +0000 (09:18 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 23 Nov 2021 16:22:41 +0000 (17:22 +0100)
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>
drivers/nvme/host/tcp.c

index 5f8ad4d..4ceb286 100644 (file)
@@ -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);