• J
    RDMA/rtrs-srv: Fix memory leak when having multiple sessions · 6bb97a2c
    Jack Wang 提交于
    Gioh notice memory leak below
    unreferenced object 0xffff8880acda2000 (size 2048):
      comm "kworker/4:1", pid 77, jiffies 4295062871 (age 1270.730s)
      hex dump (first 32 bytes):
        00 20 da ac 80 88 ff ff 00 20 da ac 80 88 ff ff  . ....... ......
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<00000000e85d85b5>] rtrs_srv_rdma_cm_handler+0x8e5/0xa90 [rtrs_server]
        [<00000000e31a988a>] cma_ib_req_handler+0xdc5/0x2b50 [rdma_cm]
        [<000000000eb02c5b>] cm_process_work+0x2d/0x100 [ib_cm]
        [<00000000e1650ca9>] cm_req_handler+0x11bc/0x1c40 [ib_cm]
        [<000000009c28818b>] cm_work_handler+0xe65/0x3cf2 [ib_cm]
        [<000000002b53eaa1>] process_one_work+0x4bc/0x980
        [<00000000da3499fb>] worker_thread+0x78/0x5c0
        [<00000000167127a4>] kthread+0x191/0x1e0
        [<0000000060802104>] ret_from_fork+0x3a/0x50
    unreferenced object 0xffff88806d595d90 (size 8):
      comm "kworker/4:1H", pid 131, jiffies 4295062972 (age 1269.720s)
      hex dump (first 8 bytes):
        62 6c 61 00 6b 6b 6b a5                          bla.kkk.
      backtrace:
        [<000000004447d253>] kstrdup+0x2e/0x60
        [<0000000047259793>] kobject_set_name_vargs+0x2f/0xb0
        [<00000000c2ee3bc8>] dev_set_name+0xab/0xe0
        [<000000002b6bdfb1>] rtrs_srv_create_sess_files+0x260/0x290 [rtrs_server]
        [<0000000075d87bd7>] rtrs_srv_info_req_done+0x71b/0x960 [rtrs_server]
        [<00000000ccdf1bb5>] __ib_process_cq+0x94/0x100 [ib_core]
        [<00000000cbcb60cb>] ib_cq_poll_work+0x32/0xc0 [ib_core]
        [<000000002b53eaa1>] process_one_work+0x4bc/0x980
        [<00000000da3499fb>] worker_thread+0x78/0x5c0
        [<00000000167127a4>] kthread+0x191/0x1e0
        [<0000000060802104>] ret_from_fork+0x3a/0x50
    unreferenced object 0xffff88806d6bb100 (size 256):
      comm "kworker/4:1H", pid 131, jiffies 4295062972 (age 1269.720s)
      hex dump (first 32 bytes):
        00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00  .....N..........
        ff ff ff ff ff ff ff ff 00 59 4d 86 ff ff ff ff  .........YM.....
      backtrace:
        [<00000000a18a11e4>] device_add+0x74d/0xa00
        [<00000000a915b95f>] rtrs_srv_create_sess_files.cold+0x49/0x1fe [rtrs_server]
        [<0000000075d87bd7>] rtrs_srv_info_req_done+0x71b/0x960 [rtrs_server]
        [<00000000ccdf1bb5>] __ib_process_cq+0x94/0x100 [ib_core]
        [<00000000cbcb60cb>] ib_cq_poll_work+0x32/0xc0 [ib_core]
        [<000000002b53eaa1>] process_one_work+0x4bc/0x980
        [<00000000da3499fb>] worker_thread+0x78/0x5c0
        [<00000000167127a4>] kthread+0x191/0x1e0
        [<0000000060802104>] ret_from_fork+0x3a/0x50
    
    The problem is we increase device refcount by get_device in process_info_req
    for each path, but only does put_deice for last path, which lead to
    memory leak.
    
    To fix it, it also calls put_device when dev_ref is not 0.
    
    Fixes: e2853c49 ("RDMA/rtrs-srv-sysfs: fix missing put_device")
    Link: https://lore.kernel.org/r/20210528113018.52290-19-jinpu.wang@ionos.comSigned-off-by: NGioh Kim <gi-oh.kim@ionos.com>
    Signed-off-by: NJack Wang <jinpu.wang@ionos.com>
    Signed-off-by: NJason Gunthorpe <jgg@nvidia.com>
    6bb97a2c
rtrs-srv-sysfs.c 7.5 KB