Re: [PATCH] sched: QFQ - quick fair queue scheduler (v4)
From: Eric Dumazet <hidden>
Date: 2011-03-04 06:50:33
Le jeudi 03 mars 2011 à 16:30 -0800, Stephen Hemminger a écrit :
This is an implementation of the Quick Fair Queue scheduler developed by Fabio Checconi. The same algorithm is already implemented in ipfw in FreeBSD. Fabio had an earlier version developed on Linux, I just cleaned it up. Thanks to Eric Dumazet for doing the testing and finding bugs. Signed-off-by: Stephen Hemminger <redacted> --- v4 - change slots[] to hlist from simple linked list include/linux/pkt_sched.h | 15 net/sched/Kconfig | 11 net/sched/Makefile | 1 net/sched/sch_qfq.c | 1133 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1160 insertions(+)
Thanks
Still crashing hard here in qfq_reset_qdisc(), when packets are present
in queues.
Probably hlist_for_each_entry_safe() is needed, since
qfq_deactivate_class() is called ...
Also rename cl->next to cl->hnode so that following is clearer ?
- hlist_for_each_entry(cl, n, &grp->slots[j], next) {
+ hlist_for_each_entry_safe(cl, n, next, &grp->slots[j], hnode) {
Fabio, any idea why everything is blocked after a few packets for me ?
Here is script to reproduce the problem :
# cat qfq_setup.sh
modprobe dummy
ifconfig dummy0 10.2.2.254 netmask 255.255.255.0 up
for i in `seq 1 16`
do
arp -H ether -i dummy0 -s 10.2.2.$i 00:00:0c:07:ac:$(printf %02x $i)
done
DEV=dummy0
RATE="rate 40Mbit"
TNETS="10.2.2.0/25"
ALLOT="allot 20000"
tc qdisc del dev dummy0 root 2>/dev/null
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 rate 1000Mbit \
bandwidth 1000Mbit
tc class add dev $DEV parent 1: classid 1:1 \
est 1sec 8sec cbq allot 10000 mpu 64 \
rate 1000Mbit prio 1 avpkt 1500 bounded
# output to test nets : 40 Mbit limit
tc class add dev $DEV parent 1:1 classid 1:11 \
est 1sec 8sec cbq $ALLOT mpu 64 \
$RATE prio 2 avpkt 1400 bounded
tc qdisc add dev $DEV parent 1:11 handle 11: \
est 1sec 8sec qfq
tc filter add dev $DEV protocol ip parent 11: handle 3 \
flow hash keys rxhash divisor 8
for i in `seq 1 8`
do
classid=11:$(printf %x $i)
tc class add dev $DEV classid $classid qfq
tc qdisc add dev $DEV parent $classid pfifo limit 30
done
for privnet in $TNETS
do
tc filter add dev $DEV parent 1: protocol ip prio 100 u32 \
match ip dst $privnet flowid 1:11
done
tc filter add dev $DEV parent 1: protocol ip prio 100 u32 \
match ip protocol 0 0x00 flowid 1:1
iperf -u -c 10.2.2.1 -P 32 -l 50
------------------------------------------------------------------------------
After a run I get only 5 packets sent, 240 queued in backlog, and all
other packets dropped.
# tc -s -d qdisc show dev dummy0
qdisc cbq 1: root refcnt 2 rate 1000Mbit cell 8b (bounded,isolated) prio
no-transmit/8 weight 1000Mbit allot 1514b
level 2 ewma 5 avpkt 1000b maxidle 0us
Sent 460 bytes 5 pkt (dropped 198800, overlimits 199043 requeues 0)
backlog 0b 240p requeues 0
borrowed 0 overactions 0 avgidle 125 undertime 0
qdisc qfq 11: parent 1:11
Sent 460 bytes 5 pkt (dropped 198800, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 240p requeues 0
qdisc pfifo 8011: parent 11:1 limit 30p
Sent 0 bytes 0 pkt (dropped 6178, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8012: parent 11:2 limit 30p
Sent 92 bytes 1 pkt (dropped 37048, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8013: parent 11:3 limit 30p
Sent 0 bytes 0 pkt (dropped 24856, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8014: parent 11:4 limit 30p
Sent 276 bytes 3 pkt (dropped 37358, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8015: parent 11:5 limit 30p
Sent 0 bytes 0 pkt (dropped 24934, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8016: parent 11:6 limit 30p
Sent 0 bytes 0 pkt (dropped 24882, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8017: parent 11:7 limit 30p
Sent 0 bytes 0 pkt (dropped 12328, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
qdisc pfifo 8018: parent 11:8 limit 30p
Sent 92 bytes 1 pkt (dropped 31216, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
and :
# tc -s -d class show dev dummy0
class cbq 1:11 parent 1:1 leaf 11: rate 40000Kbit cell 128b mpu 64b
(bounded) prio 2/2 weight 40000Kbit allot 20000b
level 0 ewma 5 avpkt 1400b maxidle 0us
Sent 460 bytes 5 pkt (dropped 198800, overlimits 15 requeues 0)
rate 0bit 0pps backlog 0b 240p requeues 0
borrowed 0 overactions 3 avgidle -225 undertime -6.46702e+07
class cbq 1: root rate 1000Mbit cell 8b (bounded,isolated) prio
no-transmit/8 weight 1000Mbit allot 1514b
level 2 ewma 5 avpkt 1000b maxidle 0us
Sent 460 bytes 5 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
borrowed 0 overactions 0 avgidle 125 undertime 0
class cbq 1:1 parent 1: rate 1000Mbit cell 64b mpu 64b (bounded) prio
1/1 weight 1000Mbit allot 10000b
level 1 ewma 5 avpkt 1500b maxidle 0us
Sent 460 bytes 5 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
borrowed 0 overactions 0 avgidle 125 undertime 0
class qfq 11:1 root leaf 8011: weight 1 maxpkt 2048
Sent 2760 bytes 30 pkt (dropped 6178, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:2 root leaf 8012: weight 1 maxpkt 2048
Sent 2852 bytes 31 pkt (dropped 37048, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:3 root leaf 8013: weight 1 maxpkt 2048
Sent 2760 bytes 30 pkt (dropped 24856, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:4 root leaf 8014: weight 1 maxpkt 2048
Sent 3036 bytes 33 pkt (dropped 37358, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:5 root leaf 8015: weight 1 maxpkt 2048
Sent 2760 bytes 30 pkt (dropped 24934, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:6 root leaf 8016: weight 1 maxpkt 2048
Sent 2760 bytes 30 pkt (dropped 24882, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:7 root leaf 8017: weight 1 maxpkt 2048
Sent 2760 bytes 30 pkt (dropped 12328, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
class qfq 11:8 root leaf 8018: weight 1 maxpkt 2048
Sent 2852 bytes 31 pkt (dropped 31216, overlimits 0 requeues 0)
backlog 2760b 30p requeues 0
Then this crashes :
# tc qdisc del dev dummy0 root