lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 083/849] nvmet-tcp: fix a memory leak when releasing a queue
    Date
    From: Maurizio Lombardi <mlombard@redhat.com>

    [ Upstream commit 926245c7d22271307606c88b1fbb2539a8550e94 ]

    page_frag_free() won't completely release the memory
    allocated for the commands, the cache page must be explicitly
    freed by calling __page_frag_cache_drain().

    This bug can be easily reproduced by repeatedly
    executing the following command on the initiator:

    $echo 1 > /sys/devices/virtual/nvme-fabrics/ctl/nvme0/reset_controller

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nvme/target/tcp.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
    index d641bfa07a801..586ca20837e7b 100644
    --- a/drivers/nvme/target/tcp.c
    +++ b/drivers/nvme/target/tcp.c
    @@ -1428,6 +1428,7 @@ static void nvmet_tcp_uninit_data_in_cmds(struct nvmet_tcp_queue *queue)

    static void nvmet_tcp_release_queue_work(struct work_struct *w)
    {
    + struct page *page;
    struct nvmet_tcp_queue *queue =
    container_of(w, struct nvmet_tcp_queue, release_work);

    @@ -1447,6 +1448,8 @@ static void nvmet_tcp_release_queue_work(struct work_struct *w)
    nvmet_tcp_free_crypto(queue);
    ida_simple_remove(&nvmet_tcp_queue_ida, queue->idx);

    + page = virt_to_head_page(queue->pf_cache.va);
    + __page_frag_cache_drain(page, queue->pf_cache.pagecnt_bias);
    kfree(queue);
    }

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 22:38    [W:4.046 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site