diff options
author | David S. Miller <davem@davemloft.net> | 2019-04-17 14:26:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-04-17 14:26:25 -0400 |
commit | 6b0a7f84ea1fe248df96ccc4dd86e817e32ef65b (patch) | |
tree | 0a7976054052e793da782c2b7ec34eccfbf66449 /net/rxrpc/input.c | |
parent | cea0aa9cbd5ad4efe267e9487ed5d48d16756253 (diff) | |
parent | fe5cdef29e41c8bda8cd1a11545e7c6bfe25570e (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflict resolution of af_smc.c from Stephen Rothwell.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rxrpc/input.c')
-rw-r--r-- | net/rxrpc/input.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index 9128aa0e40aa..4c6f9d0a00e7 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -837,7 +837,7 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | |||
837 | u8 acks[RXRPC_MAXACKS]; | 837 | u8 acks[RXRPC_MAXACKS]; |
838 | } buf; | 838 | } buf; |
839 | rxrpc_serial_t acked_serial; | 839 | rxrpc_serial_t acked_serial; |
840 | rxrpc_seq_t first_soft_ack, hard_ack; | 840 | rxrpc_seq_t first_soft_ack, hard_ack, prev_pkt; |
841 | int nr_acks, offset, ioffset; | 841 | int nr_acks, offset, ioffset; |
842 | 842 | ||
843 | _enter(""); | 843 | _enter(""); |
@@ -851,13 +851,14 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | |||
851 | 851 | ||
852 | acked_serial = ntohl(buf.ack.serial); | 852 | acked_serial = ntohl(buf.ack.serial); |
853 | first_soft_ack = ntohl(buf.ack.firstPacket); | 853 | first_soft_ack = ntohl(buf.ack.firstPacket); |
854 | prev_pkt = ntohl(buf.ack.previousPacket); | ||
854 | hard_ack = first_soft_ack - 1; | 855 | hard_ack = first_soft_ack - 1; |
855 | nr_acks = buf.ack.nAcks; | 856 | nr_acks = buf.ack.nAcks; |
856 | summary.ack_reason = (buf.ack.reason < RXRPC_ACK__INVALID ? | 857 | summary.ack_reason = (buf.ack.reason < RXRPC_ACK__INVALID ? |
857 | buf.ack.reason : RXRPC_ACK__INVALID); | 858 | buf.ack.reason : RXRPC_ACK__INVALID); |
858 | 859 | ||
859 | trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial, | 860 | trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial, |
860 | first_soft_ack, ntohl(buf.ack.previousPacket), | 861 | first_soft_ack, prev_pkt, |
861 | summary.ack_reason, nr_acks); | 862 | summary.ack_reason, nr_acks); |
862 | 863 | ||
863 | if (buf.ack.reason == RXRPC_ACK_PING_RESPONSE) | 864 | if (buf.ack.reason == RXRPC_ACK_PING_RESPONSE) |
@@ -878,8 +879,9 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | |||
878 | rxrpc_propose_ack_respond_to_ack); | 879 | rxrpc_propose_ack_respond_to_ack); |
879 | } | 880 | } |
880 | 881 | ||
881 | /* Discard any out-of-order or duplicate ACKs. */ | 882 | /* Discard any out-of-order or duplicate ACKs (outside lock). */ |
882 | if (before_eq(sp->hdr.serial, call->acks_latest)) | 883 | if (before(first_soft_ack, call->ackr_first_seq) || |
884 | before(prev_pkt, call->ackr_prev_seq)) | ||
883 | return; | 885 | return; |
884 | 886 | ||
885 | buf.info.rxMTU = 0; | 887 | buf.info.rxMTU = 0; |
@@ -890,12 +892,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | |||
890 | 892 | ||
891 | spin_lock(&call->input_lock); | 893 | spin_lock(&call->input_lock); |
892 | 894 | ||
893 | /* Discard any out-of-order or duplicate ACKs. */ | 895 | /* Discard any out-of-order or duplicate ACKs (inside lock). */ |
894 | if (before_eq(sp->hdr.serial, call->acks_latest)) | 896 | if (before(first_soft_ack, call->ackr_first_seq) || |
897 | before(prev_pkt, call->ackr_prev_seq)) | ||
895 | goto out; | 898 | goto out; |
896 | call->acks_latest_ts = skb->tstamp; | 899 | call->acks_latest_ts = skb->tstamp; |
897 | call->acks_latest = sp->hdr.serial; | 900 | call->acks_latest = sp->hdr.serial; |
898 | 901 | ||
902 | call->ackr_first_seq = first_soft_ack; | ||
903 | call->ackr_prev_seq = prev_pkt; | ||
904 | |||
899 | /* Parse rwind and mtu sizes if provided. */ | 905 | /* Parse rwind and mtu sizes if provided. */ |
900 | if (buf.info.rxMTU) | 906 | if (buf.info.rxMTU) |
901 | rxrpc_input_ackinfo(call, skb, &buf.info); | 907 | rxrpc_input_ackinfo(call, skb, &buf.info); |