Re: [PATCH 03/11] drbd_transport_rdma: put kref for cm in dtr_path_established in error path
Dongsheng Yang <[email protected]> Mon, 1 Jul 2024 10:48:22 +0800
| Newsgroups | dev.linux.lists.drbd-dev |
|---|---|
| Message-ID | <[email protected]> |
在 2024/7/1 星期一 上午 10:07, Dongsheng Yang 写道: > > > 在 2024/6/28 星期五 下午 5:40, Philipp Reisner 写道: >> Hello Dongsheng, >> >> Please add more information why you think this change fixes a bug. >> Have you experienced a leak of cm structs? >> We got a RDMA_CM_EVENT_ESTABLISHED event. Even if DRBD does not do >> anything with this cm, we sill expect a RDMA_CM_EVENT_DISCONNECTED in >> the future. Is a problem in the handling of the disconnect? > > If dtr_path_established() go into this branch, it will not > schedule_work(&cm->establish_work); > > That means path->cm->state = DSM_CONNECTED; will not be done in > dtr_path_established_work_fn(), so __dtr_disconnect_path() will not call > rdma_disconnect(). That means this reference will never be put. let me consider this example: a) rdma_connect() called and RDMA_CM_EVENT_ESTABLISHED received. b) network failure and dtr_path_established() go into error path. c) establish_work will not be scheduled. d) drbdadm down test will hang because cm ref is not put. >> >> best regards, >> Philipp >> >> On Mon, Jun 24, 2024 at 9:28 AM zhengbing.huang >> <[email protected]> wrote: >>> >>> From: Dongsheng Yang <[email protected]> >>> >>> Signed-off-by: Dongsheng Yang <[email protected]> >>> --- >>> drbd/drbd_transport_rdma.c | 1 + >>> 1 file changed, 1 insertion(+) >>> >>> diff --git a/drbd/drbd_transport_rdma.c b/drbd/drbd_transport_rdma.c >>> index cfbae0e78..eccd0c6ce 100644 >>> --- a/drbd/drbd_transport_rdma.c >>> +++ b/drbd/drbd_transport_rdma.c >>> @@ -922,6 +922,7 @@ static void dtr_path_established(struct dtr_cm *cm) >>> atomic_set(&cs->active_state, PCS_INACTIVE); >>> wake_up(&cs->wq); >>> } >>> + kref_put(&cm->kref, dtr_destroy_cm); >>> return; >>> } >>> >>> -- >>> 2.27.0 >>>