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);
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);
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;
}
}
- 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);