bonding: set correct tx_queue_len for bond_dev
Subsystems (3)
PATCH 1/1 bonding: set correct tx_queue_len for bond_dev
When we set bandwidth on bond_dev with htb, it's not precise. Because the length of skb_buff queue is bigger than sch->limit whose value is 0, some packets are dropped.
This leads to bond device can't make full use of the bandwidth and influence the accuracy.
With htb, sch->limit is set from bond_dev->tx_queue_len which is initialized to 0 in bond_setup.
To fix this issue, set the bond_dev's tx_queue_len to slave_dev's.
Example:
tc qdisc add dev bond0 root handle 1: htb default 1
tc class add dev bond0 parent 1:0 classid 1:1 htb rate 1Gbit ceil 1Gbit iperf -c host -t 30 -i 10
With old bonding:
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 579 MBytes 486 Mbits/sec [ 3] 10.0-20.0 sec 604 MBytes 507 Mbits/sec [ 3] 20.0-30.0 sec 551 MBytes 462 Mbits/sec [ 3] 0.0-30.0 sec 1.69 GBytes 485 Mbits/sec
With new bonding:
[ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 1.11 GBytes 955 Mbits/sec [ 3] 10.0-20.0 sec 1.11 GBytes 955 Mbits/sec [ 3] 20.0-30.0 sec 1.11 GBytes 955 Mbits/sec [ 3] 0.0-30.0 sec 3.33 GBytes 955 Mbits/sec
--- drivers/net/bonding/bond_main.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/bonding/bond_main.c +6 -0
@@ -1860,6 +1860,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) goto err_dest_symlinks; } +if (!bond_dev->tx_queue_len) + bond_dev->tx_queue_len = slave_dev->tx_queue_len; +else + bond_dev->tx_queue_len =min (slave_dev->tx_queue_len, + bond_dev->tx_queue_len); + pr_info("%s: enslaving %s as a%s interface with a%s link.\n", bond_dev->name, slave_dev->name, bond_is_active_slave(new_slave) ? "n active" : " backup",
Signature · 5 lines
1.7.12 .
David Miller
maintainerFrom: Yang Yingliang <[email protected]>
Date: Tue, 30 Jul 2013 15:20:42 +0800
Quoted 2 lines
With htb,
sch->limitis set frombond_dev->tx_queue_lenwhich is initialized to 0 inbond_setup.
This is intentional, software devices should not queue TX packets.
You can only use the packet scheduler with hardware devices.
Quoted 8 lines · David Miller
From: Yang Yingliang <[email protected]>
Date: Tue, 30 Jul 2013 15:20:42 +0800Quoted 2 lines
With htb,
sch->limitis set frombond_dev->tx_queue_lenwhich is initialized to 0 inbond_setup.This is intentional, software devices should not queue TX packets.
This makes software devices with htb qdisc can hold only one packet, others are dropped.
Maybe sch->limit's default value which is 1 is too small. Instead of this patch, I'll send another patch to fix this value for fixing this issue.
Quoted 4 lines
You can only use the packet scheduler with hardware devices.