]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: Fix for hangs/crashes in rare cases
authorAmir Vadai <amirv@mellanox.co.il>
Tue, 22 Jun 2010 07:40:54 +0000 (10:40 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:05 +0000 (05:05 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_main.c
drivers/infiniband/ulp/sdp/sdp_rx.c

index 61b05f5cd0c949d04af4e041e8c75ced4df11a72..ec2428de45f0e27e9f30e518f4174735e3564894 100644 (file)
@@ -1359,6 +1359,9 @@ static inline int poll_recv_cq(struct sock *sk)
 
        sdp_prf(sk, NULL, "polling recv");
 
+       if (unlikely(!sdp_sk(sk)->rx_ring.cq))
+               return 0;
+
        while (jiffies <= jiffies_end) {
                if (sdp_process_rx(sdp_sk(sk))) {
                        SDPSTATS_COUNTER_INC(rx_poll_hit);
index 7a763264b03d9aadf0b3df76393006cfd9f5a49d..e31ce2eed243fbbbe8c6af950715c0d6b55a0de4 100644 (file)
@@ -784,7 +784,8 @@ void sdp_do_posts(struct sdp_sock *ssk)
                return;
        }
 
-       sdp_process_rx(sdp_sk(sk));
+       if (likely(ssk->rx_ring.cq))
+               sdp_process_rx(sdp_sk(sk));
 
        while ((skb = skb_dequeue(&ssk->rx_ctl_q)))
                sdp_process_rx_ctl_skb(ssk, skb);
@@ -834,6 +835,13 @@ static void sdp_rx_irq(struct ib_cq *cq, void *cq_context)
        tasklet_hi_schedule(&ssk->rx_ring.tasklet);
 }
 
+static inline int sdp_should_rearm(struct sock *sk)
+{
+       return sk->sk_state != TCP_ESTABLISHED ||
+               sdp_sk(sk)->tx_sa ||
+               (sk->sk_socket && test_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags));
+}
+
 int sdp_process_rx(struct sdp_sock *ssk)
 {
        struct sock *sk = &ssk->isk.sk;
@@ -870,7 +878,7 @@ int sdp_process_rx(struct sdp_sock *ssk)
                }
        }
 
-       if (unlikely(sk->sk_state != TCP_ESTABLISHED || ssk->tx_sa))
+       if (unlikely(sdp_should_rearm(sk)))
                sdp_arm_rx_cq(sk);
 
        rx_ring_unlock(&ssk->rx_ring);