]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: more verbose debugging messages for sock_put and sock_head
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 19 Oct 2008 14:59:23 +0000 (16:59 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:18 +0000 (05:04 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_cma.c
drivers/infiniband/ulp/sdp/sdp_main.c

index 2f09073326f0aabfd8baa6d5fe2f9e96d3dd4b72..13cc42db074f846c62ffd960cd0b4319886b402b 100644 (file)
@@ -8,7 +8,8 @@
 #include <rdma/ib_verbs.h>
 
 #define sdp_printk(level, sk, format, arg...)                \
-       printk(level "sdp_sock(%d:%d): " format,             \
+       printk(level "%s:%d sdp_sock(%d:%d): " format,             \
+              __func__, __LINE__, \
               (sk) ? inet_sk(sk)->num : -1,                 \
               (sk) ? ntohs(inet_sk(sk)->dport) : -1, ## arg)
 #define sdp_warn(sk, format, arg...)                         \
@@ -22,9 +23,30 @@ extern int sdp_debug_level;
                if (sdp_debug_level > 0)                     \
                sdp_printk(KERN_DEBUG, sk, format , ## arg); \
        } while (0)
+
+#define sock_ref(sk, msg, sock_op) ({ \
+       if (!atomic_read(&(sk)->sk_refcnt)) {\
+               sdp_warn(sk, "%s:%d - %s (%s) ref = 0.\n", \
+                                __func__, __LINE__, #sock_op, msg); \
+               WARN_ON(1); \
+       } else { \
+               sdp_dbg(sk, "%s:%d - %s (%s) ref = %d.\n", __func__, __LINE__, \
+                       #sock_op, msg, atomic_read(&(sk)->sk_refcnt)); \
+               sock_op(sk); \
+       }\
+})
+
+#define sk_common_release(sk) do { \
+               sdp_dbg(sk, "%s:%d - sock_put(" SOCK_REF_BORN ") - refcount = %d " \
+                       "from withing sk_common_release\n",\
+                       __FUNCTION__, __LINE__, atomic_read(&(sk)->sk_refcnt)); \
+               sk_common_release(sk); \
+} while (0)
+
 #else /* CONFIG_INFINIBAND_SDP_DEBUG */
 #define sdp_dbg(priv, format, arg...)                        \
        do { (void) (priv); } while (0)
+#define sock_ref(sk, msg, sock_op) sock_op(sk)
 #endif /* CONFIG_INFINIBAND_SDP_DEBUG */
 
 #ifdef CONFIG_INFINIBAND_SDP_DEBUG_DATA
@@ -39,6 +61,16 @@ extern int sdp_data_debug_level;
        do { (void) (priv); } while (0)
 #endif
 
+#define SOCK_REF_RESET "RESET"
+#define SOCK_REF_BORN "BORN" /* 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 */
+
+#define sock_hold(sk, msg)  sock_ref(sk, msg, sock_hold)
+#define sock_put(sk, msg)  sock_ref(sk, msg, sock_put)
+#define __sock_put(sk, msg)  sock_ref(sk, msg, __sock_put)
+
 #define SDP_RESOLVE_TIMEOUT 1000
 #define SDP_ROUTE_TIMEOUT 1000
 #define SDP_RETRY_COUNT 5
@@ -254,7 +286,7 @@ static inline int _sdp_exch_state(const char *func, int line, struct sock *sk,
 
        spin_lock_irqsave(&sdp_sk(sk)->lock, flags);
        
-       sdp_dbg(sk, "%s:%d - set state: %s -> %s 0x%x\n", __func__, __LINE__,
+       sdp_dbg(sk, "%s:%d - set state: %s -> %s 0x%x\n", func, line,
                sdp_state_str(sk->sk_state), sdp_state_str(state), from_states);
 
        if ((1 << sk->sk_state) & ~from_states) {
index ba4609836b2bd5479b93f48b27e89b38ff0e842d..6659d28b6ee1adcf7b59d3d5bfbffbda795ca55c 100644 (file)
@@ -223,7 +223,7 @@ int sdp_connect_handler(struct sock *sk, struct rdma_cm_id *id,
        inet_sk(child)->daddr = dst_addr->sin_addr.s_addr;
 
        bh_unlock_sock(child);
-       __sock_put(child);
+       __sock_put(child, SOCK_REF_CLONE);
 
        rc = sdp_init_qp(child, id);
        if (rc) {
@@ -536,7 +536,7 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
                        /* sdp_close() will not be called therefore we need
                           to take a refernce till infiniband teardown is
                           finished */
-                       sock_hold(sk);
+                       sock_hold(sk, SOCK_REF_CM_TW);
                }
                child = sk;
                sdp_sk(sk)->id = NULL;
index e8fb8d37dc1e6dcf920ec2d987c19642584d6491..dfbe724f846ed6d3ee67f790265df11eacd757f2 100644 (file)
@@ -295,7 +295,7 @@ static void sdp_keepalive_timer(unsigned long data)
 
 out:
        bh_unlock_sock(sk);
-       sock_put(sk);
+       sock_put(sk, SOCK_REF_BORN);
 }
 
 static void sdp_init_timer(struct sock *sk)
@@ -345,7 +345,7 @@ void sdp_reset_sk(struct sock *sk, int rc)
        sk->sk_state_change(sk);
 
        /* Don't destroy socket before destroy work does its job */
-       sock_hold(sk);
+       sock_hold(sk, SOCK_REF_RESET);
        queue_work(sdp_workqueue, &ssk->destroy_work);
 
        read_unlock(&device_removal_lock);
@@ -498,7 +498,7 @@ static void sdp_close(struct sock *sk, long timeout)
                goto adjudge_to_death;
        }
 
-       sock_hold(sk);
+       sock_hold(sk, SOCK_REF_CM_TW);
 
        /*  We need to flush the recv. buffs.  We do this only on the
         *  descriptor close, not protocol-sourced closes, because the
@@ -851,13 +851,13 @@ void sdp_destroy_work(struct work_struct *work)
                sdp_cancel_dreq_wait_timeout(ssk);
 
        if (sk->sk_state == TCP_TIME_WAIT)
-               sock_put(sk);
+               sock_put(sk, SOCK_REF_CM_TW);
 
        /* In normal close current state is TCP_TIME_WAIT or TCP_CLOSE
           but if a CM connection is dropped below our legs state could
           be any state */
        sdp_exch_state(sk, ~0, TCP_CLOSE);
-       sock_put(sk);
+       sock_put(sk, SOCK_REF_RESET);
 }
 
 void sdp_dreq_wait_timeout_work(struct work_struct *work)
@@ -915,7 +915,7 @@ static void sdp_shutdown(struct sock *sk, int how)
        if (!sdp_close_state(sk))
            return;
 
-       sock_hold(sk);
+       sock_hold(sk, SOCK_REF_CM_TW);
 
        /*
         * Just turn off CORK here.
@@ -2239,7 +2239,7 @@ static void *sdp_seq_start(struct seq_file *seq, loff_t *pos)
        spin_lock_irq(&sock_list_lock);
        start = sdp_get_idx(seq, *pos - 1);
        if (start)
-               sock_hold((struct sock *)start);
+               sock_hold((struct sock *)start, SOCK_REF_SEQ);
        spin_unlock_irq(&sock_list_lock);
 
        return start;
@@ -2256,7 +2256,7 @@ static void *sdp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        else
                next = sdp_get_idx(seq, *pos);
        if (next)
-               sock_hold((struct sock *)next);
+               sock_hold((struct sock *)next, SOCK_REF_SEQ);
        spin_unlock_irq(&sock_list_lock);
 
        *pos += 1;
@@ -2308,7 +2308,7 @@ static int sdp_seq_show(struct seq_file *seq, void *v)
 
        seq_printf(seq, "%-*s\n", TMPSZ - 1, tmpbuf);
 
-       sock_put(sk);
+       sock_put(sk, SOCK_REF_SEQ);
 out:
        return 0;
 }