From: Amir Vadai Date: Tue, 16 Nov 2010 11:32:14 +0000 (+0200) Subject: sdp: BUG2161 - hanging sockets are left X-Git-Tag: v4.1.12-92~264^2~5^2~62 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f86628b48ec028a68b54715a525c409f83e6e09f;p=users%2Fjedix%2Flinux-maple.git 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 --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index c76bd8b0f2ce2..2c967384adfd9 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 02e9c2a68dae7..5ab4c5cfd541a 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 38362426991b2..9729fad4a1a7c 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;