| 3380 | } |
| 3381 | |
| 3382 | static int32_t |
| 3383 | rack_make_timely_judgement(struct tcp_rack *rack, uint32_t rtt, int32_t rtt_diff, uint32_t prev_rtt) |
| 3384 | { |
| 3385 | int32_t timely_says; |
| 3386 | uint64_t log_mult, log_rtt_a_diff; |
| 3387 | |
| 3388 | log_rtt_a_diff = rtt; |
| 3389 | log_rtt_a_diff <<= 32; |
| 3390 | log_rtt_a_diff |= (uint32_t)rtt_diff; |
| 3391 | if (rtt >= (get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) * |
| 3392 | rack_gp_rtt_maxmul)) { |
| 3393 | /* Reduce the b/w multipler */ |
| 3394 | timely_says = 2; |
| 3395 | log_mult = get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) * rack_gp_rtt_maxmul; |
| 3396 | log_mult <<= 32; |
| 3397 | log_mult |= prev_rtt; |
| 3398 | rack_log_timely(rack, timely_says, log_mult, |
| 3399 | get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt), |
| 3400 | log_rtt_a_diff, __LINE__, 4); |
| 3401 | } else if (rtt <= (get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) + |
| 3402 | ((get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) * rack_gp_rtt_minmul) / |
| 3403 | max(rack_gp_rtt_mindiv , 1)))) { |
| 3404 | /* Increase the b/w multipler */ |
| 3405 | log_mult = get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) + |
| 3406 | ((get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt) * rack_gp_rtt_minmul) / |
| 3407 | max(rack_gp_rtt_mindiv , 1)); |
| 3408 | log_mult <<= 32; |
| 3409 | log_mult |= prev_rtt; |
| 3410 | timely_says = 0; |
| 3411 | rack_log_timely(rack, timely_says, log_mult , |
| 3412 | get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt), |
| 3413 | log_rtt_a_diff, __LINE__, 5); |
| 3414 | } else { |
| 3415 | /* |
| 3416 | * Use a gradient to find it the timely gradient |
| 3417 | * is: |
| 3418 | * grad = rc_rtt_diff / min_rtt; |
| 3419 | * |
| 3420 | * anything below or equal to 0 will be |
| 3421 | * a increase indication. Anything above |
| 3422 | * zero is a decrease. Note we take care |
| 3423 | * of the actual gradient calculation |
| 3424 | * in the reduction (its not needed for |
| 3425 | * increase). |
| 3426 | */ |
| 3427 | log_mult = prev_rtt; |
| 3428 | if (rtt_diff <= 0) { |
| 3429 | /* |
| 3430 | * Rttdiff is less than zero, increase the |
| 3431 | * b/w multipler (its 0 or negative) |
| 3432 | */ |
| 3433 | timely_says = 0; |
| 3434 | rack_log_timely(rack, timely_says, log_mult, |
| 3435 | get_filter_value_small(&rack->r_ctl.rc_gp_min_rtt), log_rtt_a_diff, __LINE__, 6); |
| 3436 | } else { |
| 3437 | /* Reduce the b/w multipler */ |
| 3438 | timely_says = 1; |
| 3439 | rack_log_timely(rack, timely_says, log_mult, |
no test coverage detected