From: Eldad Zinger Date: Mon, 26 Apr 2010 07:48:48 +0000 (+0300) Subject: sdp: on device removal, ref count taken so that socket won't be destructed X-Git-Tag: v4.1.12-92~264^2~5^2~191 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=ffa5a7a9de7023e151bbd5108d522335458c01ba;p=users%2Fjedix%2Flinux-maple.git sdp: on device removal, ref count taken so that socket won't be destructed On device removal, socket resources that are based on device are destroyed, but the socket itself will be destroyed later, upon user request. Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_dbg.h b/drivers/infiniband/ulp/sdp/sdp_dbg.h index 9b1a67e5f29d5..f25e86dc5e5cb 100644 --- a/drivers/infiniband/ulp/sdp/sdp_dbg.h +++ b/drivers/infiniband/ulp/sdp/sdp_dbg.h @@ -112,7 +112,7 @@ extern int sdp_debug_level; }) #define sk_common_release(sk) do { \ - sdp_dbg(sk, "%s:%d - sock_put(" SOCK_REF_BORN \ + sdp_dbg(sk, "%s:%d - sock_put(" SOCK_REF_ALIVE \ ") - refcount = %d from withing sk_common_release\n",\ __func__, __LINE__, atomic_read(&(sk)->sk_refcnt));\ sk_common_release(sk); \ @@ -143,7 +143,7 @@ extern int sdp_data_debug_level; #endif #define SOCK_REF_RESET "RESET" -#define SOCK_REF_BORN "BORN" /* sock_alloc -> destruct_sock */ +#define SOCK_REF_ALIVE "ALIVE" /* sock_alloc -> destruct_sock */ #define SOCK_REF_CLONE "CLONE" #define SOCK_REF_CM_TW "CM_TW" /* TIMEWAIT_ENTER -> TIMEWAIT_EXIT */ #define SOCK_REF_SEQ "SEQ" /* during proc read */ diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index f9d81652f8819..de17a566149cc 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -249,7 +249,7 @@ static void sdp_keepalive_timer(unsigned long data) out: bh_unlock_sock(sk); - sock_put(sk, SOCK_REF_BORN); + sock_put(sk, SOCK_REF_ALIVE); } static void sdp_init_keepalive_timer(struct sock *sk) @@ -2715,7 +2715,10 @@ kill_socks: sk->sk_shutdown |= RCV_SHUTDOWN; sdp_reset(sk); + sock_hold(sk, SOCK_REF_ALIVE); sdp_close(sk,0); + sdp_destroy_qp(ssk); + ssk->sdp_dev = NULL; if ((1 << sk->sk_state) & (TCPF_FIN_WAIT1 | TCPF_CLOSE_WAIT |