Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Apr 2021 18:31:16 GMT
From:      Richard Scheffenegger <rscheff@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 21e596f343c0 - stable/13 - tcp: Refactor PRR code
Message-ID:  <202104221831.13MIVGZX084137@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by rscheff:

URL: https://cgit.FreeBSD.org/src/commit/?id=21e596f343c0e57ce07729a22db6636a9f65edb1

commit 21e596f343c0e57ce07729a22db6636a9f65edb1
Author:     Richard Scheffenegger <rscheff@FreeBSD.org>
AuthorDate: 2021-03-25 22:58:46 +0000
Commit:     Richard Scheffenegger <rscheff@FreeBSD.org>
CommitDate: 2021-04-22 18:28:54 +0000

    tcp: Refactor PRR code
    
    No functional change intended.
    
    MFC after: 2 weeks
    Reviewed By: #transport, rrs
    Sponsored by: NetApp, Inc.
    Differential Revision: https://reviews.freebsd.org/D29411
    
    (cherry picked from commit eb3a59a83112f5fcd60aab44ac0ac68331b6aedf)
---
 sys/netinet/tcp_input.c | 58 ++++++++-----------------------------------------
 sys/netinet/tcp_var.h   |  2 +-
 2 files changed, 10 insertions(+), 50 deletions(-)

diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index ea9b03ae4a4d..3f2df998fd9e 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -2576,47 +2576,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
 					if (V_tcp_do_prr &&
 					    IN_FASTRECOVERY(tp->t_flags) &&
 					    (tp->t_flags & TF_SACK_PERMIT)) {
-						int snd_cnt = 0, limit = 0;
-						int del_data = 0, pipe = 0;
-						/*
-						 * In a duplicate ACK del_data is only the
-						 * diff_in_sack. If no SACK is used del_data
-						 * will be 0. Pipe is the amount of data we
-						 * estimate to be in the network.
-						 */
-						del_data = tp->sackhint.delivered_data;
-						if (V_tcp_do_rfc6675_pipe)
-							pipe = tcp_compute_pipe(tp);
-						else
-							pipe = (tp->snd_nxt - tp->snd_fack) +
-								tp->sackhint.sack_bytes_rexmit;
-						tp->sackhint.prr_delivered += del_data;
-						if (pipe >= tp->snd_ssthresh) {
-							if (tp->sackhint.recover_fs == 0)
-								tp->sackhint.recover_fs =
-								    imax(1, tp->snd_nxt - tp->snd_una);
-							snd_cnt = howmany((long)tp->sackhint.prr_delivered *
-							    tp->snd_ssthresh, tp->sackhint.recover_fs) -
-							    tp->sackhint.prr_out;
-						} else {
-							if (V_tcp_do_prr_conservative)
-								limit = tp->sackhint.prr_delivered -
-									tp->sackhint.prr_out;
-							else
-								limit = imax(tp->sackhint.prr_delivered -
-									    tp->sackhint.prr_out,
-									    del_data) + maxseg;
-							snd_cnt = imin(tp->snd_ssthresh - pipe, limit);
-						}
-						snd_cnt = imax(snd_cnt, 0) / maxseg;
-						/*
-						 * Send snd_cnt new data into the network in
-						 * response to this ACK. If there is a going
-						 * to be a SACK retransmission, adjust snd_cwnd
-						 * accordingly.
-						 */
-						tp->snd_cwnd = imax(maxseg, tp->snd_nxt - tp->snd_recover +
-						    tp->sackhint.sack_bytes_rexmit + (snd_cnt * maxseg));
+						tcp_do_prr_ack(tp, th);
 					} else if ((tp->t_flags & TF_SACK_PERMIT) &&
 					    (to.to_flags & TOF_SACK) &&
 					    IN_FASTRECOVERY(tp->t_flags)) {
@@ -2814,9 +2774,13 @@ resume_partialack:
 		if (IN_FASTRECOVERY(tp->t_flags)) {
 			if (SEQ_LT(th->th_ack, tp->snd_recover)) {
 				if (tp->t_flags & TF_SACK_PERMIT)
-					if (V_tcp_do_prr && to.to_flags & TOF_SACK)
-						tcp_prr_partialack(tp, th);
-					else
+					if (V_tcp_do_prr && to.to_flags & TOF_SACK) {
+						tcp_timer_activate(tp, TT_REXMT, 0);
+						tp->t_rtttime = 0;
+						tcp_do_prr_ack(tp, th);
+						tp->t_flags |= TF_ACKNOW;
+						(void) tcp_output(tp);
+					} else
 						tcp_sack_partialack(tp, th);
 				else
 					tcp_newreno_partial_ack(tp, th);
@@ -3944,15 +3908,13 @@ tcp_mssopt(struct in_conninfo *inc)
 }
 
 void
-tcp_prr_partialack(struct tcpcb *tp, struct tcphdr *th)
+tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th)
 {
 	int snd_cnt = 0, limit = 0, del_data = 0, pipe = 0;
 	int maxseg = tcp_maxseg(tp);
 
 	INP_WLOCK_ASSERT(tp->t_inpcb);
 
-	tcp_timer_activate(tp, TT_REXMT, 0);
-	tp->t_rtttime = 0;
 	/*
 	 * Compute the amount of data that this ACK is indicating
 	 * (del_data) and an estimate of how many bytes are in the
@@ -3992,8 +3954,6 @@ tcp_prr_partialack(struct tcpcb *tp, struct tcphdr *th)
 	 */
 	tp->snd_cwnd = imax(maxseg, tp->snd_nxt - tp->snd_recover +
 		tp->sackhint.sack_bytes_rexmit + (snd_cnt * maxseg));
-	tp->t_flags |= TF_ACKNOW;
-	(void) tcp_output(tp);
 }
 
 /*
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 3b007fcfcc93..1e1fb2eeb678 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -1056,7 +1056,7 @@ void	 tcp_clean_dsack_blocks(struct tcpcb *tp);
 void	 tcp_clean_sackreport(struct tcpcb *tp);
 void	 tcp_sack_adjust(struct tcpcb *tp);
 struct sackhole *tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt);
-void	 tcp_prr_partialack(struct tcpcb *, struct tcphdr *);
+void	 tcp_do_prr_ack(struct tcpcb *, struct tcphdr *);
 void	 tcp_sack_partialack(struct tcpcb *, struct tcphdr *);
 void	 tcp_free_sackholes(struct tcpcb *tp);
 int	 tcp_newreno(struct tcpcb *, struct tcphdr *);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202104221831.13MIVGZX084137>