Skip to content

Commit f7452a7

Browse files
Gioh Kimjgunthorpe
Gioh Kim
authored andcommitted
RDMA/rtrs-srv: fix memory leak by missing kobject free
kmemleak reported an error as below: unreferenced object 0xffff8880674b7640 (size 64): comm "kworker/4:1H", pid 113, jiffies 4296403507 (age 507.840s) hex dump (first 32 bytes): 69 70 3a 31 39 32 2e 31 36 38 2e 31 32 32 2e 31 ip:192.168.122.1 31 30 40 69 70 3a 31 39 32 2e 31 36 38 2e 31 32 10@ip:192.168.12 backtrace: [<0000000054413611>] kstrdup+0x2e/0x60 [<0000000078e3120a>] kobject_set_name_vargs+0x2f/0xb0 [<00000000ca2be3ee>] kobject_init_and_add+0xb0/0x120 [<0000000062ba5e78>] rtrs_srv_create_sess_files+0x14c/0x314 [rtrs_server] [<00000000b45b7217>] rtrs_srv_info_req_done+0x5b1/0x800 [rtrs_server] [<000000008fc5aa8f>] __ib_process_cq+0x94/0x100 [ib_core] [<00000000a9599cb4>] ib_cq_poll_work+0x32/0xc0 [ib_core] [<00000000cfc376be>] process_one_work+0x4bc/0x980 [<0000000016e5c96a>] worker_thread+0x78/0x5c0 [<00000000c20b8be0>] kthread+0x191/0x1e0 [<000000006c9c0003>] ret_from_fork+0x3a/0x50 It is caused by the not-freed kobject of rtrs_srv_sess. The kobject embedded in rtrs_srv_sess has ref-counter 2 after calling process_info_req(). Therefore it must call kobject_put twice. Currently it calls kobject_put only once at rtrs_srv_destroy_sess_files because kobject_del removes the state_in_sysfs flag and then kobject_put in free_sess() is not called. This patch moves kobject_del() into free_sess() so that the kobject of rtrs_srv_sess can be freed. And also this patch adds the missing call of sysfs_remove_group() to clean-up the sysfs directory. Fixes: 9cb8374 ("RDMA/rtrs: server: main functionality") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Gioh Kim <[email protected]> Signed-off-by: Jack Wang <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 03e9b33 commit f7452a7

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ void rtrs_srv_destroy_sess_files(struct rtrs_srv_sess *sess)
305305
if (sess->kobj.state_in_sysfs) {
306306
kobject_del(&sess->stats->kobj_stats);
307307
kobject_put(&sess->stats->kobj_stats);
308-
kobject_del(&sess->kobj);
308+
sysfs_remove_group(&sess->kobj, &rtrs_srv_sess_attr_group);
309309
kobject_put(&sess->kobj);
310310

311311
rtrs_srv_destroy_once_sysfs_root_folders(sess);

drivers/infiniband/ulp/rtrs/rtrs-srv.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,10 +1475,12 @@ static bool __is_path_w_addr_exists(struct rtrs_srv *srv,
14751475

14761476
static void free_sess(struct rtrs_srv_sess *sess)
14771477
{
1478-
if (sess->kobj.state_in_sysfs)
1478+
if (sess->kobj.state_in_sysfs) {
1479+
kobject_del(&sess->kobj);
14791480
kobject_put(&sess->kobj);
1480-
else
1481+
} else {
14811482
kfree(sess);
1483+
}
14821484
}
14831485

14841486
static void rtrs_srv_close_work(struct work_struct *work)

0 commit comments

Comments
 (0)