RXRPC_CALL_RETRANS_TIMEOUT,     /* Retransmission due to timeout occurred */
        RXRPC_CALL_BEGAN_RX_TIMER,      /* We began the expect_rx_by timer */
        RXRPC_CALL_RX_HEARD,            /* The peer responded at least once to this call */
+       RXRPC_CALL_RX_UNDERRUN,         /* Got data underrun */
 };
 
 /*
 
        unsigned int rx_pkt_offset, rx_pkt_len;
        int ix, copy, ret = -EAGAIN, ret2;
 
+       if (test_and_clear_bit(RXRPC_CALL_RX_UNDERRUN, &call->flags) &&
+           call->ackr_reason)
+               rxrpc_send_ack_packet(call, false, NULL);
+
        rx_pkt_offset = call->rx_pkt_offset;
        rx_pkt_len = call->rx_pkt_len;
 
 done:
        trace_rxrpc_recvmsg(call, rxrpc_recvmsg_data_return, seq,
                            rx_pkt_offset, rx_pkt_len, ret);
+       if (ret == -EAGAIN)
+               set_bit(RXRPC_CALL_RX_UNDERRUN, &call->flags);
        return ret;
 }
 
 read_phase_complete:
        ret = 1;
 out:
+       switch (call->ackr_reason) {
+       case RXRPC_ACK_IDLE:
+               break;
+       case RXRPC_ACK_DELAY:
+               if (ret != -EAGAIN)
+                       break;
+               /* Fall through */
+       default:
+               rxrpc_send_ack_packet(call, false, NULL);
+       }
+
        if (_service)
                *_service = call->service_id;
        mutex_unlock(&call->user_mutex);