mirror of
https://git.openafs.org/openafs.git
synced 2025-01-22 17:00:15 +00:00
rx: Don't clear the receive queue when out of packets
We can end up discarding a receive queue that's been soft acked, effectively taking back soft acks we sent. Whilst the RX documentation says that a client can drop soft acked packets at will, our RX implementation assumes that if the final packet in a call has been soft acked, we won't clear the queue. If a client clears the queue in this situation, the call will hang. What *should* happen is that we should take necessary locks, confirm that we have not soft-acked all of the packets in a flow, and then discard, or, if we're just going to discard, error the call. Change-Id: Ic8e358b8648c1a6f0154009093468531a9e3cf74 Reviewed-on: http://gerrit.openafs.org/5603 Reviewed-by: Derrick Brashear <shadow@dementix.org> Tested-by: Derrick Brashear <shadow@dementix.org>
This commit is contained in:
parent
735873d515
commit
f722a75fe2
@ -3803,8 +3803,9 @@ rxi_ReceiveDataPacket(struct rx_call *call,
|
||||
call->rprev = np->header.serial;
|
||||
rxi_calltrace(RX_TRACE_DROP, call);
|
||||
dpf(("packet %"AFS_PTR_FMT" dropped on receipt - quota problems\n", np));
|
||||
if (rxi_doreclaim)
|
||||
rxi_ClearReceiveQueue(call);
|
||||
/* We used to clear the receive queue here, in an attempt to free
|
||||
* packets. However this is unsafe if the queue has received a
|
||||
* soft ACK for the final packet */
|
||||
clock_GetTime(&now);
|
||||
when = now;
|
||||
clock_Add(&when, &rx_softAckDelay);
|
||||
|
@ -481,7 +481,6 @@ EXT osi_socket rx_minSocketNumber GLOBALSINIT(0x7fffffff);
|
||||
#define RX_MAX_QUOTA 15 /* part of min packet computation */
|
||||
EXT int rx_packetQuota[RX_N_PACKET_CLASSES] GLOBALSINIT(RX_PACKET_QUOTAS);
|
||||
EXT int meltdown_1pkt GLOBALSINIT(1); /* prefer to schedule single-packet calls */
|
||||
EXT int rxi_doreclaim GLOBALSINIT(1); /* if discard one packet, discard all */
|
||||
EXT int rxi_md2cnt GLOBALSINIT(0); /* counter of skipped calls */
|
||||
EXT int rxi_2dchoice GLOBALSINIT(1); /* keep track of another call to schedule */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user