From f86628b48ec028a68b54715a525c409f83e6e09f Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Tue, 16 Nov 2010 13:32:14 +0200 Subject: [PATCH] sdp: BUG2161 - hanging sockets are left When getting DREQ at TCP_CLOSE_WAIT state, CMA ref count is taken and not returned. This happens because CMA timer is not started. Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp.h | 1 + drivers/infiniband/ulp/sdp/sdp_cma.c | 3 +++ drivers/infiniband/ulp/sdp/sdp_main.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index c76bd8b0f2ce..2c967384adfd 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -908,6 +908,7 @@ void sdp_reset_sk(struct sock *sk, int rc); void sdp_reset(struct sock *sk); int sdp_tx_wait_memory(struct sdp_sock *ssk, long *timeo_p, int *credits_needed); void sdp_skb_entail(struct sock *sk, struct sk_buff *skb); +void sdp_start_cma_timewait_timeout(struct sdp_sock *ssk, int timeo); extern struct rw_semaphore device_removal_lock; /* sdp_proc.c */ diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index 02e9c2a68dae..5ab4c5cfd541 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -476,6 +476,9 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) "TCP_CLOSE_WAIT taking reference to " "let close() finish the work\n"); sock_hold(sk, SOCK_REF_CMA); + sdp_start_cma_timewait_timeout(sdp_sk(sk), + SDP_CMA_TIMEWAIT_TIMEOUT); + } sdp_set_error(sk, -EPIPE); rc = sdp_disconnected_handler(sk); diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 38362426991b..9729fad4a1a7 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -659,7 +659,7 @@ static int sdp_cancel_cma_timewait_timeout(struct sdp_sock *ssk) */ } -static inline void sdp_start_cma_timewait_timeout(struct sdp_sock *ssk, int timeo) +void sdp_start_cma_timewait_timeout(struct sdp_sock *ssk, int timeo) { queue_delayed_work(sdp_wq, &ssk->cma_timewait_work, timeo); ssk->cma_timewait_timeout = 1; -- 2.50.1