Skip to content
This repository was archived by the owner on Oct 2, 2025. It is now read-only.

Commit ff7b5e8

Browse files
committed
head cutting optimization
1 parent faea95c commit ff7b5e8

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

include/linux/tcp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,9 @@ struct tcp_sock {
528528
unsigned int ratio_rate_sample;
529529
bool run_started;
530530
bool init_search;
531+
/*Phuc: Ratio scheduler optimization*/
532+
u16 head_length;
533+
u32 num_acks_head[2];
531534
};
532535

533536
enum tsq_enum {

net/mptcp/mptcp_ratio.c

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,12 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
330330
u32 srtt[2]={0xffffffff,0xffffffff};
331331
u32 min_rtt[2]={0xffffffff,0xffffffff};
332332
u32 num_acks[2]={0,0};
333+
u32 num_acks_head[2]={0,0};
333334
int rate_diff, buffer_diff;
334335
int rate_diff_sub[2] = {0,0};
335336
int buffer_sub[2] = {0,0};
336337
u32 last_buffer_size[2] = {0, 0}, init_buffer_size[2] = {0, 0}, tput[2] = {0, 0};
338+
u16 head_length;
337339
u8 threshold_cnt;
338340
u8 buffer_threshold_cnt;
339341
unsigned int time_diff, loop_counter = 0;
@@ -516,8 +518,6 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
516518
mptcp_sched_probe_init(&sprobe);
517519
iter++;
518520

519-
/*These two are read for every function call, e.g, every segment
520-
* we log every 100ms or longer*/
521521
subflow_rate = READ_ONCE(tp_it->rate_delivered);
522522
subflow_intv = READ_ONCE(tp_it->rate_interval_us);
523523
if (subflow_rate && subflow_intv) {
@@ -555,6 +555,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
555555
meta_tp->rate_delivered += total_rate;//no use
556556
meta_tp->delivered++;
557557

558+
558559
iter = 0;
559560
mptcp_for_each_sub(mpcb, mptcp) {
560561
struct sock *sk_it = mptcp_to_sock(mptcp);
@@ -565,8 +566,26 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
565566
rsp_temp->delivered++;
566567
iter++;
567568
}
569+
568570

569571
time_diff = jiffies_to_msecs(jiffies - meta_tp->rate_interval_us);
572+
meta_tp->head_length = meta_tp->ratio_rate_sample/2;
573+
if(time_diff== meta_tp->head_length && meta_tp->lost){
574+
in_search = meta_tp->lost;
575+
//printk("Time elapsed since last change: %u", time_diff);
576+
iter = 0;
577+
mptcp_for_each_sub(mpcb, mptcp) {
578+
struct sock *sk_it = mptcp_to_sock(mptcp);
579+
struct tcp_sock *tp_it_temp = tcp_sk(sk_it);
580+
u32 subflow_rate;
581+
subflow_rate = tp_it_temp->delivered - tp_it_temp->prev_tx_bytes;
582+
meta_tp->num_acks_head[iter] = subflow_rate;
583+
iter++;
584+
}
585+
// printk("Number of ACKs collected: %u",
586+
// meta_tp->num_acks_head[0] + meta_tp->num_acks_head[1]);
587+
}
588+
570589
/*start dynamic ratio search*/
571590
if (time_diff >= meta_tp->ratio_rate_sample) {
572591
/*Load parameter from previous probe interval*/
@@ -578,14 +597,19 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
578597
last_trigger_tstamp = meta_tp->prior_ssthresh;
579598
count_set_init_rate = meta_tp->total_retrans;
580599
init_rate = meta_tp->prior_cwnd;
600+
601+
num_acks_head[0] = (in_search==0)? 0: meta_tp->num_acks_head[0];
602+
num_acks_head[1] = (in_search==0)? 0: meta_tp->num_acks_head[1];
603+
head_length = (num_acks_head[0]==0)? 0:meta_tp->head_length;
604+
//printk("head_length this period: %u", head_length);
581605
memcpy(init_buffer_size, meta_tp->init_buffer_size, 2*sizeof(u32));
582606
memcpy(last_buffer_size, meta_tp->last_buffer_size, 2*sizeof(u32));
583607
/*End loading*/
584608

585609
iter = 0;
586610
meta_tp->rate_delivered = 0; //reset this container so that we can use it to calculate rate
587611

588-
/*Value estimation per sampling interval*/
612+
/*Value estimation for each interface*/
589613
mptcp_for_each_sub(mpcb, mptcp) {
590614
struct sock *sk_it = mptcp_to_sock(mptcp);
591615
struct tcp_sock *tp_it_temp = tcp_sk(sk_it);
@@ -595,10 +619,14 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
595619
do_div(rsp_temp->buffer_size, meta_tp->delivered);
596620
do_div(buffer_sub[iter], 1000);//KB
597621
curr_tstamp = jiffies;
598-
subflow_rate = tp_it_temp->delivered - tp_it_temp->prev_tx_bytes;//number of ACKs came back
622+
//printk("Original ACKs %llu", tp_it_temp->delivered-
623+
// tp_it_temp->prev_tx_bytes);
624+
subflow_rate = tp_it_temp->delivered - tp_it_temp->prev_tx_bytes - num_acks_head[iter];//number of ACKs came back
625+
//printk("Deducted ACKs: %u", subflow_rate);
599626
num_acks[iter] = subflow_rate;
600627
tp_it_temp->prev_tx_bytes = tp_it_temp->delivered;
601-
subflow_intv = jiffies_to_msecs(curr_tstamp - tp_it_temp->prev_tstamp);
628+
subflow_intv = jiffies_to_msecs(curr_tstamp
629+
- tp_it_temp->prev_tstamp)-head_length;
602630
tp_it_temp->prev_tstamp = curr_tstamp;
603631
subflow_rate64 = (u64)subflow_rate * tp_it_temp->mss_cache * 8 * MSEC_PER_SEC;
604632
do_div(subflow_rate64, subflow_intv);
@@ -609,7 +637,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
609637
meta_tp->rate_delivered += tput[iter];//cummulate rate on both interface
610638
rsp_temp->snd_una_saved = tp_it_temp->snd_una;
611639
iter++;
612-
}
640+
}/*Value estimation for each interface*/
613641

614642
for (iter = 0; iter < 5; iter++) {
615643
if (iter == 4)
@@ -917,7 +945,7 @@ static struct sk_buff *mptcp_ratio_next_segment(struct sock *meta_sk,
917945
}
918946
meta_tp->rate_interval_us = jiffies;
919947

920-
}/*end dynamic ratio_search*/
948+
}/*end dynamic ratio search*/
921949
// AUTO-RATE search
922950

923951
mptcp_for_each_sub(mpcb, mptcp) {

0 commit comments

Comments
 (0)