]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: on device removal, ref count taken so that socket won't be destructed
authorEldad Zinger <eldadz@mellanox.co.il>
Mon, 26 Apr 2010 07:48:48 +0000 (10:48 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:55 +0000 (05:04 -0700)
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 <eldadz@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_dbg.h
drivers/infiniband/ulp/sdp/sdp_main.c

index 9b1a67e5f29d5f5192a6b40523e59ed08db37fa4..f25e86dc5e5cb4178d47e30e32053cc5b34fe9b2 100644 (file)
@@ -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 */
index f9d81652f8819962ddfee0d511a0fe179df49c8f..de17a566149ccbf3d228b21b40da4f06b29b3c76 100644 (file)
@@ -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 |