| 4640 | } |
| 4641 | |
| 4642 | static void |
| 4643 | rack_exit_persist(struct tcpcb *tp, struct tcp_rack *rack, uint32_t cts) |
| 4644 | { |
| 4645 | if (rack->rc_inp->inp_in_hpts) { |
| 4646 | tcp_hpts_remove(rack->rc_inp, HPTS_REMOVE_OUTPUT); |
| 4647 | rack->r_ctl.rc_hpts_flags = 0; |
| 4648 | } |
| 4649 | #ifdef NETFLIX_SHARED_CWND |
| 4650 | if (rack->r_ctl.rc_scw) { |
| 4651 | tcp_shared_cwnd_active(rack->r_ctl.rc_scw, rack->r_ctl.rc_scw_index); |
| 4652 | rack->rack_scwnd_is_idle = 0; |
| 4653 | } |
| 4654 | #endif |
| 4655 | if (rack->rc_gp_dyn_mul && |
| 4656 | (rack->use_fixed_rate == 0) && |
| 4657 | (rack->rc_always_pace)) { |
| 4658 | /* |
| 4659 | * Do we count this as if a probe-rtt just |
| 4660 | * finished? |
| 4661 | */ |
| 4662 | uint32_t time_idle, idle_min; |
| 4663 | |
| 4664 | time_idle = tcp_get_usecs(NULL) - rack->r_ctl.rc_went_idle_time; |
| 4665 | idle_min = rack_min_probertt_hold; |
| 4666 | if (rack_probertt_gpsrtt_cnt_div) { |
| 4667 | uint64_t extra; |
| 4668 | extra = (uint64_t)rack->r_ctl.rc_gp_srtt * |
| 4669 | (uint64_t)rack_probertt_gpsrtt_cnt_mul; |
| 4670 | extra /= (uint64_t)rack_probertt_gpsrtt_cnt_div; |
| 4671 | idle_min += (uint32_t)extra; |
| 4672 | } |
| 4673 | if (time_idle >= idle_min) { |
| 4674 | /* Yes, we count it as a probe-rtt. */ |
| 4675 | uint32_t us_cts; |
| 4676 | |
| 4677 | us_cts = tcp_get_usecs(NULL); |
| 4678 | if (rack->in_probe_rtt == 0) { |
| 4679 | rack->r_ctl.rc_lower_rtt_us_cts = us_cts; |
| 4680 | rack->r_ctl.rc_time_probertt_entered = rack->r_ctl.rc_lower_rtt_us_cts; |
| 4681 | rack->r_ctl.rc_time_probertt_starts = rack->r_ctl.rc_lower_rtt_us_cts; |
| 4682 | rack->r_ctl.rc_time_of_last_probertt = rack->r_ctl.rc_lower_rtt_us_cts; |
| 4683 | } else { |
| 4684 | rack_exit_probertt(rack, us_cts); |
| 4685 | } |
| 4686 | } |
| 4687 | } |
| 4688 | rack->rc_in_persist = 0; |
| 4689 | rack->r_ctl.rc_went_idle_time = 0; |
| 4690 | tp->t_rxtshift = 0; |
| 4691 | rack->r_ctl.rc_agg_delayed = 0; |
| 4692 | rack->r_early = 0; |
| 4693 | rack->r_late = 0; |
| 4694 | rack->r_ctl.rc_agg_early = 0; |
| 4695 | } |
| 4696 | |
| 4697 | static void |
| 4698 | rack_log_hpts_diag(struct tcp_rack *rack, uint32_t cts, |
no test coverage detected