Thomas Bogendoerfer f3d286
From: Gioh Kim <gi-oh.kim@cloud.ionos.com>
Thomas Bogendoerfer f3d286
Date: Fri, 28 May 2021 13:30:15 +0200
Thomas Bogendoerfer f3d286
Subject: RDMA/rtrs-srv: Fix memory leak of unfreed rtrs_srv_stats object
Thomas Bogendoerfer f3d286
Patch-mainline: v5.14-rc1
Thomas Bogendoerfer f3d286
Git-commit: 2371c40354509746e4a4dad09a752e027a30f148
Thomas Bogendoerfer f3d286
References: jsc#SLE-15176
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
When closing a session, currently the rtrs_srv_stats object in the
Thomas Bogendoerfer f3d286
closing session is freed by kobject release. But if it failed
Thomas Bogendoerfer f3d286
to create a session by various reasons, it must free the rtrs_srv_stats
Thomas Bogendoerfer f3d286
object directly because kobject is not created yet.
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
This problem is found by kmemleak as below:
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
1. One client machine maps /dev/nullb0 with session name 'bla':
Thomas Bogendoerfer f3d286
root@test1:~# echo "sessname=bla path=ip:192.168.122.190 \
Thomas Bogendoerfer f3d286
device_path=/dev/nullb0" > /sys/devices/virtual/rnbd-client/ctl/map_device
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
2. Another machine failed to create a session with the same name 'bla':
Thomas Bogendoerfer f3d286
root@test2:~# echo "sessname=bla path=ip:192.168.122.190 \
Thomas Bogendoerfer f3d286
device_path=/dev/nullb1" > /sys/devices/virtual/rnbd-client/ctl/map_device
Thomas Bogendoerfer f3d286
-bash: echo: write error: Connection reset by peer
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
3. The kmemleak on server machine reported an error:
Thomas Bogendoerfer f3d286
unreferenced object 0xffff888033cdc800 (size 128):
Thomas Bogendoerfer f3d286
  comm "kworker/2:1", pid 83, jiffies 4295086585 (age 2508.680s)
Thomas Bogendoerfer f3d286
  hex dump (first 32 bytes):
Thomas Bogendoerfer f3d286
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
Thomas Bogendoerfer f3d286
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
Thomas Bogendoerfer f3d286
  backtrace:
Thomas Bogendoerfer f3d286
    [<00000000a72903b2>] __alloc_sess+0x1d4/0x1250 [rtrs_server]
Thomas Bogendoerfer f3d286
    [<00000000d1e5321e>] rtrs_srv_rdma_cm_handler+0xc31/0xde0 [rtrs_server]
Thomas Bogendoerfer f3d286
    [<00000000bb2f6e7e>] cma_ib_req_handler+0xdc5/0x2b50 [rdma_cm]
Thomas Bogendoerfer f3d286
    [<00000000e896235d>] cm_process_work+0x2d/0x100 [ib_cm]
Thomas Bogendoerfer f3d286
    [<00000000b6866c5f>] cm_req_handler+0x11bc/0x1c40 [ib_cm]
Thomas Bogendoerfer f3d286
    [<000000005f5dd9aa>] cm_work_handler+0xe65/0x3cf2 [ib_cm]
Thomas Bogendoerfer f3d286
    [<00000000610151e7>] process_one_work+0x4bc/0x980
Thomas Bogendoerfer f3d286
    [<00000000541e0f77>] worker_thread+0x78/0x5c0
Thomas Bogendoerfer f3d286
    [<00000000423898ca>] kthread+0x191/0x1e0
Thomas Bogendoerfer f3d286
    [<000000005a24b239>] ret_from_fork+0x3a/0x50
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
Fixes: 39c2d639ca183 ("RDMA/rtrs-srv: Set .release function for rtrs srv device during device init")
Thomas Bogendoerfer f3d286
Link: https://lore.kernel.org/r/20210528113018.52290-18-jinpu.wang@ionos.com
Thomas Bogendoerfer f3d286
Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Thomas Bogendoerfer f3d286
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Thomas Bogendoerfer f3d286
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Thomas Bogendoerfer f3d286
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Thomas Bogendoerfer f3d286
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer f3d286
---
Thomas Bogendoerfer f3d286
 drivers/infiniband/ulp/rtrs/rtrs-srv.c |    1 +
Thomas Bogendoerfer f3d286
 1 file changed, 1 insertion(+)
Thomas Bogendoerfer f3d286
Thomas Bogendoerfer f3d286
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
Thomas Bogendoerfer f3d286
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
Thomas Bogendoerfer f3d286
@@ -1496,6 +1496,7 @@ static void free_sess(struct rtrs_srv_se
Thomas Bogendoerfer f3d286
 		kobject_del(&sess->kobj);
Thomas Bogendoerfer f3d286
 		kobject_put(&sess->kobj);
Thomas Bogendoerfer f3d286
 	} else {
Thomas Bogendoerfer f3d286
+		kfree(sess->stats);
Thomas Bogendoerfer f3d286
 		kfree(sess);
Thomas Bogendoerfer f3d286
 	}
Thomas Bogendoerfer f3d286
 }