From a09dbc4ce8cb25605cb0b6bd08c6777538038abd Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Tue, 22 Jun 2010 10:40:54 +0300 Subject: [PATCH] sdp: Fix for hangs/crashes in rare cases Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp_main.c | 3 +++ drivers/infiniband/ulp/sdp/sdp_rx.c | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 61b05f5cd0c9..ec2428de45f0 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 7a763264b03d..e31ce2eed243 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); -- 2.50.1