* [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
2023-09-20 12:54 [PATCH net-next 0/4] net_sched: sch_fq: round of improvements Eric Dumazet
@ 2023-09-20 12:54 ` Eric Dumazet
2023-09-20 14:09 ` kernel test robot
2023-09-25 2:25 ` kernel test robot
0 siblings, 2 replies; 4+ messages in thread
From: Eric Dumazet @ 2023-09-20 12:54 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: Willem de Bruijn, Jamal Hadi Salim, Cong Wang, Jiri Pirko, netdev,
eric.dumazet, Eric Dumazet
TCQ_F_CAN_BYPASS can be used by few qdiscs.
Idea is that if we queue a packet to an empty qdisc,
following dequeue() would pick it immediately.
FQ can not use the generic TCQ_F_CAN_BYPASS code,
because some additional checks need to be performed.
This patch adds a similar fast path to FQ.
Most of the time, qdisc is not throttled,
and many packets can avoid bringing/touching
at least four cache lines, and consuming 128bytes
of memory to store the state of a flow.
After this patch, netperf can send UDP packets about 13 % faster,
and pktgen goes 30 % faster (when FQ is in the way), on a fast NIC.
TCP traffic is also improved, thanks to a reduction of cache line misses.
tc -s -d qd sh dev eth1
...
qdisc fq 8004: parent 1:2 limit 10000p flow_limit 100p buckets 1024
orphan_mask 1023 quantum 3028b initial_quantum 15140b low_rate_threshold 550Kbit
refill_delay 40ms timer_slack 10us horizon 10s horizon_drop
Sent 5646784384 bytes 1985161 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
flows 122 (inactive 122 throttled 0)
gc 0 highprio 0 fastpath 659990 throttled 27762 latency 8.57us
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
include/uapi/linux/pkt_sched.h | 1 +
net/sched/sch_fq.c | 107 +++++++++++++++++++++++++--------
2 files changed, 82 insertions(+), 26 deletions(-)
diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
index 3f85ae5780563cdfb42fdb3a107ca2489d0830a4..579f641846b87da05e5d4b09c1072c90220ca601 100644
--- a/include/uapi/linux/pkt_sched.h
+++ b/include/uapi/linux/pkt_sched.h
@@ -962,6 +962,7 @@ struct tc_fq_qd_stats {
__u64 ce_mark; /* packets above ce_threshold */
__u64 horizon_drops;
__u64 horizon_caps;
+ __u64 fastpath_packets;
};
/* Heavy-Hitter Filter */
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c
index 4af43a401dbb4111d5cfaddb4b83fc5c7b63b83d..ea510003bc385148397a690c5afd9387fba9796c 100644
--- a/net/sched/sch_fq.c
+++ b/net/sched/sch_fq.c
@@ -2,7 +2,7 @@
/*
* net/sched/sch_fq.c Fair Queue Packet Scheduler (per flow pacing)
*
- * Copyright (C) 2013-2015 Eric Dumazet <edumazet@google.com>
+ * Copyright (C) 2013-2023 Eric Dumazet <edumazet@google.com>
*
* Meant to be mostly used for locally generated traffic :
* Fast classification depends on skb->sk being set before reaching us.
@@ -73,7 +73,13 @@ struct fq_flow {
struct sk_buff *tail; /* last skb in the list */
unsigned long age; /* (jiffies | 1UL) when flow was emptied, for gc */
};
- struct rb_node fq_node; /* anchor in fq_root[] trees */
+ union {
+ struct rb_node fq_node; /* anchor in fq_root[] trees */
+ /* Following field is only used for q->internal,
+ * because q->internal is not hashed in fq_root[]
+ */
+ u64 stat_fastpath_packets;
+ };
struct sock *sk;
u32 socket_hash; /* sk_hash */
int qlen; /* number of packets in flow queue */
@@ -266,8 +272,56 @@ static void fq_gc(struct fq_sched_data *q,
kmem_cache_free_bulk(fq_flow_cachep, fcnt, tofree);
}
-static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q)
+/* Fast path can be used if :
+ * 1) Packet tstamp is in the past.
+ * 2) FQ qlen == 0 OR
+ * (no flow is currently elligible for transmit,
+ * AND fast path queue has less than 8 packets)
+ * 3) No SO_MAX_PACING_RATE on the socket (if any).
+ * 4) No @maxrate attribute on this qdisc,
+ *
+ * FQ can not use generic TCQ_F_CAN_BYPASS infrastructure.
+ */
+static bool fq_fastpath_check(struct Qdisc *sch, struct sk_buff *skb)
{
+ struct fq_sched_data *q = qdisc_priv(sch);
+ const struct sock *sk;
+
+ if (fq_skb_cb(skb)->time_to_send > q->ktime_cache)
+ return false;
+
+ if (sch->q.qlen != 0) {
+ /* Even if some packets are stored in this qdisc,
+ * we can still enable fast path if all of them are
+ * scheduled in the future (ie no flows are elligible)
+ * or in the fast path queue.
+ */
+ if (q->flows != q->inactive_flows + q->throttled_flows)
+ return false;
+
+ /* Do not allow fast path queue to explode, we want Fair Queue mode
+ * under pressure.
+ */
+ if (q->internal.qlen >= 8)
+ return false;
+ }
+
+ sk = skb->sk;
+ if (sk && sk_fullsock(sk) && !sk_is_tcp(sk) &&
+ sk->sk_max_pacing_rate != ~0UL)
+ return false;
+
+ if (q->flow_max_rate != ~0UL)
+ return false;
+
+ q->internal.stat_fastpath_packets++;
+
+ return true;
+}
+
+static struct fq_flow *fq_classify(struct Qdisc *sch, struct sk_buff *skb)
+{
+ struct fq_sched_data *q = qdisc_priv(sch);
struct rb_node **p, *parent;
struct sock *sk = skb->sk;
struct rb_root *root;
@@ -307,6 +361,9 @@ static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q)
sk = (struct sock *)((hash << 1) | 1UL);
}
+ if (fq_fastpath_check(sch, skb))
+ return &q->internal;
+
root = &q->fq_root[hash_ptr(sk, q->fq_trees_log)];
if (q->flows >= (2U << q->fq_trees_log) &&
@@ -402,12 +459,8 @@ static void fq_erase_head(struct Qdisc *sch, struct fq_flow *flow,
static void fq_dequeue_skb(struct Qdisc *sch, struct fq_flow *flow,
struct sk_buff *skb)
{
- struct fq_sched_data *q = qdisc_priv(sch);
-
fq_erase_head(sch, flow, skb);
skb_mark_not_on_list(skb);
- if (--flow->qlen == 0)
- q->inactive_flows++;
qdisc_qstats_backlog_dec(sch, skb);
sch->q.qlen--;
}
@@ -450,6 +503,7 @@ static bool fq_packet_beyond_horizon(const struct sk_buff *skb,
return unlikely((s64)skb->tstamp > (s64)(q->ktime_cache + q->horizon));
}
+
static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff **to_free)
{
@@ -459,49 +513,46 @@ static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
if (unlikely(sch->q.qlen >= sch->limit))
return qdisc_drop(skb, sch, to_free);
+ q->ktime_cache = ktime_get_ns();
if (!skb->tstamp) {
- fq_skb_cb(skb)->time_to_send = q->ktime_cache = ktime_get_ns();
+ fq_skb_cb(skb)->time_to_send = q->ktime_cache;
} else {
- /* Check if packet timestamp is too far in the future.
- * Try first if our cached value, to avoid ktime_get_ns()
- * cost in most cases.
- */
+ /* Check if packet timestamp is too far in the future. */
if (fq_packet_beyond_horizon(skb, q)) {
- /* Refresh our cache and check another time */
- q->ktime_cache = ktime_get_ns();
- if (fq_packet_beyond_horizon(skb, q)) {
- if (q->horizon_drop) {
+ if (q->horizon_drop) {
q->stat_horizon_drops++;
return qdisc_drop(skb, sch, to_free);
- }
- q->stat_horizon_caps++;
- skb->tstamp = q->ktime_cache + q->horizon;
}
+ q->stat_horizon_caps++;
+ skb->tstamp = q->ktime_cache + q->horizon;
}
fq_skb_cb(skb)->time_to_send = skb->tstamp;
}
- f = fq_classify(skb, q);
+ f = fq_classify(sch, skb);
if (unlikely(f->qlen >= q->flow_plimit && f != &q->internal)) {
q->stat_flows_plimit++;
return qdisc_drop(skb, sch, to_free);
}
- if (f->qlen++ == 0)
- q->inactive_flows--;
- qdisc_qstats_backlog_inc(sch, skb);
if (fq_flow_is_detached(f)) {
fq_flow_add_tail(&q->new_flows, f);
if (time_after(jiffies, f->age + q->flow_refill_delay))
f->credit = max_t(u32, f->credit, q->quantum);
}
- /* Note: this overwrites f->age */
- flow_queue_add(f, skb);
-
if (unlikely(f == &q->internal)) {
q->stat_internal_packets++;
+ } else {
+ if (f->qlen == 0)
+ q->inactive_flows--;
}
+queue:
+ f->qlen++;
+ /* Note: this overwrites f->age */
+ flow_queue_add(f, skb);
+
+ qdisc_qstats_backlog_inc(sch, skb);
sch->q.qlen++;
return NET_XMIT_SUCCESS;
@@ -549,6 +600,7 @@ static struct sk_buff *fq_dequeue(struct Qdisc *sch)
skb = fq_peek(&q->internal);
if (unlikely(skb)) {
+ q->internal.qlen--;
fq_dequeue_skb(sch, &q->internal, skb);
goto out;
}
@@ -592,6 +644,8 @@ static struct sk_buff *fq_dequeue(struct Qdisc *sch)
INET_ECN_set_ce(skb);
q->stat_ce_mark++;
}
+ if (--f->qlen == 0)
+ q->inactive_flows++;
fq_dequeue_skb(sch, f, skb);
} else {
head->first = f->next;
@@ -1024,6 +1078,7 @@ static int fq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
st.gc_flows = q->stat_gc_flows;
st.highprio_packets = q->stat_internal_packets;
+ st.fastpath_packets = q->internal.stat_fastpath_packets;
st.tcp_retrans = 0;
st.throttled = q->stat_throttled;
st.flows_plimit = q->stat_flows_plimit;
--
2.42.0.459.ge4e396fd5e-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
2023-09-20 12:54 ` [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc Eric Dumazet
@ 2023-09-20 14:09 ` kernel test robot
2023-09-25 2:25 ` kernel test robot
1 sibling, 0 replies; 4+ messages in thread
From: kernel test robot @ 2023-09-20 14:09 UTC (permalink / raw)
To: Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: oe-kbuild-all, Willem de Bruijn, Jamal Hadi Salim, Cong Wang,
Jiri Pirko, netdev, eric.dumazet, Eric Dumazet
Hi Eric,
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/net_sched-sch_fq-struct-sched_data-reorg/20230920-205744
base: net-next/main
patch link: https://lore.kernel.org/r/20230920125418.3675569-4-edumazet%40google.com
patch subject: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230920/202309202157.1I3oSZoS-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230920/202309202157.1I3oSZoS-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309202157.1I3oSZoS-lkp@intel.com/
All warnings (new ones prefixed by >>):
net/sched/sch_fq.c: In function 'fq_enqueue':
>> net/sched/sch_fq.c:550:1: warning: label 'queue' defined but not used [-Wunused-label]
550 | queue:
| ^~~~~
vim +/queue +550 net/sched/sch_fq.c
505
506
507 static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
508 struct sk_buff **to_free)
509 {
510 struct fq_sched_data *q = qdisc_priv(sch);
511 struct fq_flow *f;
512
513 if (unlikely(sch->q.qlen >= sch->limit))
514 return qdisc_drop(skb, sch, to_free);
515
516 q->ktime_cache = ktime_get_ns();
517 if (!skb->tstamp) {
518 fq_skb_cb(skb)->time_to_send = q->ktime_cache;
519 } else {
520 /* Check if packet timestamp is too far in the future. */
521 if (fq_packet_beyond_horizon(skb, q)) {
522 if (q->horizon_drop) {
523 q->stat_horizon_drops++;
524 return qdisc_drop(skb, sch, to_free);
525 }
526 q->stat_horizon_caps++;
527 skb->tstamp = q->ktime_cache + q->horizon;
528 }
529 fq_skb_cb(skb)->time_to_send = skb->tstamp;
530 }
531
532 f = fq_classify(sch, skb);
533 if (unlikely(f->qlen >= q->flow_plimit && f != &q->internal)) {
534 q->stat_flows_plimit++;
535 return qdisc_drop(skb, sch, to_free);
536 }
537
538 if (fq_flow_is_detached(f)) {
539 fq_flow_add_tail(&q->new_flows, f);
540 if (time_after(jiffies, f->age + q->flow_refill_delay))
541 f->credit = max_t(u32, f->credit, q->quantum);
542 }
543
544 if (unlikely(f == &q->internal)) {
545 q->stat_internal_packets++;
546 } else {
547 if (f->qlen == 0)
548 q->inactive_flows--;
549 }
> 550 queue:
551 f->qlen++;
552 /* Note: this overwrites f->age */
553 flow_queue_add(f, skb);
554
555 qdisc_qstats_backlog_inc(sch, skb);
556 sch->q.qlen++;
557
558 return NET_XMIT_SUCCESS;
559 }
560
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
2023-09-20 12:54 ` [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc Eric Dumazet
2023-09-20 14:09 ` kernel test robot
@ 2023-09-25 2:25 ` kernel test robot
1 sibling, 0 replies; 4+ messages in thread
From: kernel test robot @ 2023-09-25 2:25 UTC (permalink / raw)
To: Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: llvm, oe-kbuild-all, Willem de Bruijn, Jamal Hadi Salim,
Cong Wang, Jiri Pirko, netdev, eric.dumazet, Eric Dumazet
Hi Eric,
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/net_sched-sch_fq-struct-sched_data-reorg/20230920-205744
base: net-next/main
patch link: https://lore.kernel.org/r/20230920125418.3675569-4-edumazet%40google.com
patch subject: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20230925/202309251006.HEmH6uZd-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230925/202309251006.HEmH6uZd-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309251006.HEmH6uZd-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> net/sched/sch_fq.c:550:1: warning: unused label 'queue' [-Wunused-label]
queue:
^~~~~~
1 warning generated.
vim +/queue +550 net/sched/sch_fq.c
505
506
507 static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
508 struct sk_buff **to_free)
509 {
510 struct fq_sched_data *q = qdisc_priv(sch);
511 struct fq_flow *f;
512
513 if (unlikely(sch->q.qlen >= sch->limit))
514 return qdisc_drop(skb, sch, to_free);
515
516 q->ktime_cache = ktime_get_ns();
517 if (!skb->tstamp) {
518 fq_skb_cb(skb)->time_to_send = q->ktime_cache;
519 } else {
520 /* Check if packet timestamp is too far in the future. */
521 if (fq_packet_beyond_horizon(skb, q)) {
522 if (q->horizon_drop) {
523 q->stat_horizon_drops++;
524 return qdisc_drop(skb, sch, to_free);
525 }
526 q->stat_horizon_caps++;
527 skb->tstamp = q->ktime_cache + q->horizon;
528 }
529 fq_skb_cb(skb)->time_to_send = skb->tstamp;
530 }
531
532 f = fq_classify(sch, skb);
533 if (unlikely(f->qlen >= q->flow_plimit && f != &q->internal)) {
534 q->stat_flows_plimit++;
535 return qdisc_drop(skb, sch, to_free);
536 }
537
538 if (fq_flow_is_detached(f)) {
539 fq_flow_add_tail(&q->new_flows, f);
540 if (time_after(jiffies, f->age + q->flow_refill_delay))
541 f->credit = max_t(u32, f->credit, q->quantum);
542 }
543
544 if (unlikely(f == &q->internal)) {
545 q->stat_internal_packets++;
546 } else {
547 if (f->qlen == 0)
548 q->inactive_flows--;
549 }
> 550 queue:
551 f->qlen++;
552 /* Note: this overwrites f->age */
553 flow_queue_add(f, skb);
554
555 qdisc_qstats_backlog_inc(sch, skb);
556 sch->q.qlen++;
557
558 return NET_XMIT_SUCCESS;
559 }
560
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
@ 2023-09-25 12:27 kernel test robot
0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2023-09-25 12:27 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp
::::::
:::::: Manual check reason: "low confidence static check warning: net/sched/sch_fq.c:550:1: sparse: sparse: unused label 'queue'"
::::::
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20230920125418.3675569-4-edumazet@google.com>
References: <20230920125418.3675569-4-edumazet@google.com>
TO: Eric Dumazet <edumazet@google.com>
TO: "David S . Miller" <davem@davemloft.net>
TO: Jakub Kicinski <kuba@kernel.org>
TO: Paolo Abeni <pabeni@redhat.com>
CC: Willem de Bruijn <willemb@google.com>
CC: Jamal Hadi Salim <jhs@mojatatu.com>
CC: Cong Wang <xiyou.wangcong@gmail.com>
CC: Jiri Pirko <jiri@resnulli.us>
CC: netdev@vger.kernel.org
CC: eric.dumazet@gmail.com
CC: Eric Dumazet <edumazet@google.com>
Hi Eric,
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Dumazet/net_sched-sch_fq-struct-sched_data-reorg/20230920-205744
base: net-next/main
patch link: https://lore.kernel.org/r/20230920125418.3675569-4-edumazet%40google.com
patch subject: [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc
:::::: branch date: 5 days ago
:::::: commit date: 5 days ago
config: x86_64-randconfig-123-20230925 (https://download.01.org/0day-ci/archive/20230925/202309252000.LAvn3XwF-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230925/202309252000.LAvn3XwF-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/r/202309252000.LAvn3XwF-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> net/sched/sch_fq.c:550:1: sparse: sparse: unused label 'queue'
vim +/queue +550 net/sched/sch_fq.c
39d010504e6b44 Eric Dumazet 2020-05-01 505
b2377bef637585 Eric Dumazet 2023-09-20 506
520ac30f45519b Eric Dumazet 2016-06-21 507 static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
520ac30f45519b Eric Dumazet 2016-06-21 508 struct sk_buff **to_free)
afe4fd062416b1 Eric Dumazet 2013-08-29 509 {
afe4fd062416b1 Eric Dumazet 2013-08-29 510 struct fq_sched_data *q = qdisc_priv(sch);
afe4fd062416b1 Eric Dumazet 2013-08-29 511 struct fq_flow *f;
afe4fd062416b1 Eric Dumazet 2013-08-29 512
afe4fd062416b1 Eric Dumazet 2013-08-29 513 if (unlikely(sch->q.qlen >= sch->limit))
520ac30f45519b Eric Dumazet 2016-06-21 514 return qdisc_drop(skb, sch, to_free);
afe4fd062416b1 Eric Dumazet 2013-08-29 515
b2377bef637585 Eric Dumazet 2023-09-20 516 q->ktime_cache = ktime_get_ns();
39d010504e6b44 Eric Dumazet 2020-05-01 517 if (!skb->tstamp) {
b2377bef637585 Eric Dumazet 2023-09-20 518 fq_skb_cb(skb)->time_to_send = q->ktime_cache;
39d010504e6b44 Eric Dumazet 2020-05-01 519 } else {
b2377bef637585 Eric Dumazet 2023-09-20 520 /* Check if packet timestamp is too far in the future. */
39d010504e6b44 Eric Dumazet 2020-05-01 521 if (fq_packet_beyond_horizon(skb, q)) {
39d010504e6b44 Eric Dumazet 2020-05-01 522 if (q->horizon_drop) {
39d010504e6b44 Eric Dumazet 2020-05-01 523 q->stat_horizon_drops++;
39d010504e6b44 Eric Dumazet 2020-05-01 524 return qdisc_drop(skb, sch, to_free);
39d010504e6b44 Eric Dumazet 2020-05-01 525 }
39d010504e6b44 Eric Dumazet 2020-05-01 526 q->stat_horizon_caps++;
39d010504e6b44 Eric Dumazet 2020-05-01 527 skb->tstamp = q->ktime_cache + q->horizon;
39d010504e6b44 Eric Dumazet 2020-05-01 528 }
39d010504e6b44 Eric Dumazet 2020-05-01 529 fq_skb_cb(skb)->time_to_send = skb->tstamp;
39d010504e6b44 Eric Dumazet 2020-05-01 530 }
39d010504e6b44 Eric Dumazet 2020-05-01 531
b2377bef637585 Eric Dumazet 2023-09-20 532 f = fq_classify(sch, skb);
afe4fd062416b1 Eric Dumazet 2013-08-29 533 if (unlikely(f->qlen >= q->flow_plimit && f != &q->internal)) {
afe4fd062416b1 Eric Dumazet 2013-08-29 534 q->stat_flows_plimit++;
520ac30f45519b Eric Dumazet 2016-06-21 535 return qdisc_drop(skb, sch, to_free);
afe4fd062416b1 Eric Dumazet 2013-08-29 536 }
afe4fd062416b1 Eric Dumazet 2013-08-29 537
afe4fd062416b1 Eric Dumazet 2013-08-29 538 if (fq_flow_is_detached(f)) {
afe4fd062416b1 Eric Dumazet 2013-08-29 539 fq_flow_add_tail(&q->new_flows, f);
f52ed89971adbe Eric Dumazet 2013-11-15 540 if (time_after(jiffies, f->age + q->flow_refill_delay))
f52ed89971adbe Eric Dumazet 2013-11-15 541 f->credit = max_t(u32, f->credit, q->quantum);
afe4fd062416b1 Eric Dumazet 2013-08-29 542 }
f52ed89971adbe Eric Dumazet 2013-11-15 543
afe4fd062416b1 Eric Dumazet 2013-08-29 544 if (unlikely(f == &q->internal)) {
afe4fd062416b1 Eric Dumazet 2013-08-29 545 q->stat_internal_packets++;
b2377bef637585 Eric Dumazet 2023-09-20 546 } else {
b2377bef637585 Eric Dumazet 2023-09-20 547 if (f->qlen == 0)
b2377bef637585 Eric Dumazet 2023-09-20 548 q->inactive_flows--;
afe4fd062416b1 Eric Dumazet 2013-08-29 549 }
b2377bef637585 Eric Dumazet 2023-09-20 @550 queue:
b2377bef637585 Eric Dumazet 2023-09-20 551 f->qlen++;
b2377bef637585 Eric Dumazet 2023-09-20 552 /* Note: this overwrites f->age */
b2377bef637585 Eric Dumazet 2023-09-20 553 flow_queue_add(f, skb);
b2377bef637585 Eric Dumazet 2023-09-20 554
b2377bef637585 Eric Dumazet 2023-09-20 555 qdisc_qstats_backlog_inc(sch, skb);
afe4fd062416b1 Eric Dumazet 2013-08-29 556 sch->q.qlen++;
afe4fd062416b1 Eric Dumazet 2013-08-29 557
afe4fd062416b1 Eric Dumazet 2013-08-29 558 return NET_XMIT_SUCCESS;
afe4fd062416b1 Eric Dumazet 2013-08-29 559 }
afe4fd062416b1 Eric Dumazet 2013-08-29 560
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-09-25 12:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-25 12:27 [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2023-09-20 12:54 [PATCH net-next 0/4] net_sched: sch_fq: round of improvements Eric Dumazet
2023-09-20 12:54 ` [PATCH net-next 3/4] net_sched: sch_fq: add fast path for mostly idle qdisc Eric Dumazet
2023-09-20 14:09 ` kernel test robot
2023-09-25 2:25 ` kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.