@@ -1591,7 +1591,6 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free)
15911591
15921592 qdisc_drop_reason (skb , sch , to_free , SKB_DROP_REASON_QDISC_OVERLIMIT );
15931593 sch -> q .qlen -- ;
1594- qdisc_tree_reduce_backlog (sch , 1 , len );
15951594
15961595 cake_heapify (q , 0 );
15971596
@@ -1737,14 +1736,14 @@ static void cake_reconfigure(struct Qdisc *sch);
17371736static s32 cake_enqueue (struct sk_buff * skb , struct Qdisc * sch ,
17381737 struct sk_buff * * to_free )
17391738{
1739+ u32 idx , tin , prev_qlen , prev_backlog , drop_id ;
17401740 struct cake_sched_data * q = qdisc_priv (sch );
1741- int len = qdisc_pkt_len (skb );
1742- int ret ;
1741+ int len = qdisc_pkt_len (skb ), ret ;
17431742 struct sk_buff * ack = NULL ;
17441743 ktime_t now = ktime_get ();
17451744 struct cake_tin_data * b ;
17461745 struct cake_flow * flow ;
1747- u32 idx , tin ;
1746+ bool same_flow = false ;
17481747
17491748 /* choose flow to insert into */
17501749 idx = cake_classify (sch , & b , skb , q -> flow_mode , & ret );
@@ -1818,6 +1817,8 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
18181817 consume_skb (skb );
18191818 } else {
18201819 /* not splitting */
1820+ int ack_pkt_len = 0 ;
1821+
18211822 cobalt_set_enqueue_time (skb , now );
18221823 get_cobalt_cb (skb )-> adjusted_len = cake_overhead (q , skb );
18231824 flow_queue_add (flow , skb );
@@ -1828,13 +1829,13 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
18281829 if (ack ) {
18291830 b -> ack_drops ++ ;
18301831 sch -> qstats .drops ++ ;
1831- b -> bytes + = qdisc_pkt_len (ack );
1832- len -= qdisc_pkt_len ( ack ) ;
1832+ ack_pkt_len = qdisc_pkt_len (ack );
1833+ b -> bytes += ack_pkt_len ;
18331834 q -> buffer_used += skb -> truesize - ack -> truesize ;
18341835 if (q -> rate_flags & CAKE_FLAG_INGRESS )
18351836 cake_advance_shaper (q , b , ack , now , true);
18361837
1837- qdisc_tree_reduce_backlog (sch , 1 , qdisc_pkt_len ( ack ) );
1838+ qdisc_tree_reduce_backlog (sch , 1 , ack_pkt_len );
18381839 consume_skb (ack );
18391840 } else {
18401841 sch -> q .qlen ++ ;
@@ -1843,11 +1844,11 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
18431844
18441845 /* stats */
18451846 b -> packets ++ ;
1846- b -> bytes += len ;
1847- b -> backlogs [idx ] += len ;
1848- b -> tin_backlog += len ;
1849- sch -> qstats .backlog += len ;
1850- q -> avg_window_bytes += len ;
1847+ b -> bytes += len - ack_pkt_len ;
1848+ b -> backlogs [idx ] += len - ack_pkt_len ;
1849+ b -> tin_backlog += len - ack_pkt_len ;
1850+ sch -> qstats .backlog += len - ack_pkt_len ;
1851+ q -> avg_window_bytes += len - ack_pkt_len ;
18511852 }
18521853
18531854 if (q -> overflow_timeout )
@@ -1922,24 +1923,29 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
19221923 if (q -> buffer_used > q -> buffer_max_used )
19231924 q -> buffer_max_used = q -> buffer_used ;
19241925
1925- if (q -> buffer_used > q -> buffer_limit ) {
1926- bool same_flow = false;
1927- u32 dropped = 0 ;
1928- u32 drop_id ;
1926+ if (q -> buffer_used <= q -> buffer_limit )
1927+ return NET_XMIT_SUCCESS ;
19291928
1930- while (q -> buffer_used > q -> buffer_limit ) {
1931- dropped ++ ;
1932- drop_id = cake_drop (sch , to_free );
1929+ prev_qlen = sch -> q .qlen ;
1930+ prev_backlog = sch -> qstats .backlog ;
19331931
1934- if ((drop_id >> 16 ) == tin &&
1935- (drop_id & 0xFFFF ) == idx )
1936- same_flow = true;
1937- }
1938- b -> drop_overlimit += dropped ;
1932+ while (q -> buffer_used > q -> buffer_limit ) {
1933+ drop_id = cake_drop (sch , to_free );
1934+ if ((drop_id >> 16 ) == tin &&
1935+ (drop_id & 0xFFFF ) == idx )
1936+ same_flow = true;
1937+ }
1938+
1939+ prev_qlen -= sch -> q .qlen ;
1940+ prev_backlog -= sch -> qstats .backlog ;
1941+ b -> drop_overlimit += prev_qlen ;
19391942
1940- if (same_flow )
1941- return NET_XMIT_CN ;
1943+ if (same_flow ) {
1944+ qdisc_tree_reduce_backlog (sch , prev_qlen - 1 ,
1945+ prev_backlog - len );
1946+ return NET_XMIT_CN ;
19421947 }
1948+ qdisc_tree_reduce_backlog (sch , prev_qlen , prev_backlog );
19431949 return NET_XMIT_SUCCESS ;
19441950}
19451951
0 commit comments