From: Amir Vadai Date: Tue, 22 Jun 2010 07:40:54 +0000 (+0300) Subject: sdp: Fix for hangs/crashes in rare cases X-Git-Tag: v4.1.12-92~264^2~5^2~160 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=a09dbc4ce8cb25605cb0b6bd08c6777538038abd;p=users%2Fjedix%2Flinux-maple.git sdp: Fix for hangs/crashes in rare cases Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 61b05f5cd0c94..ec2428de45f0e 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index 7a763264b03d9..e31ce2eed243f 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -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);