summaryrefslogtreecommitdiffstats
path: root/lib/route
diff options
context:
space:
mode:
authorAndrew Collins <bsderandrew@gmail.com>2012-05-26 00:08:06 (GMT)
committerThomas Graf <tgraf@redhat.com>2012-05-29 09:42:48 (GMT)
commit970f5d0221863b1473740455ca4d8cefcb34ff31 (patch)
tree4d5081a4f375c0949640da790fbdbf357431e7c0 /lib/route
parent9bb30a5e801fff2333d9b847be42294aa2e34e06 (diff)
downloadlibnl-970f5d0221863b1473740455ca4d8cefcb34ff31.zip
libnl-970f5d0221863b1473740455ca4d8cefcb34ff31.tar.gz
libnl-970f5d0221863b1473740455ca4d8cefcb34ff31.tar.bz2
correct HTB rtable/HZ calculations
The HTB implementation in libnl uses units of microseconds in a number of places where it seems TC is expecting time in units of ticks, which causes actual rates much higher than requested. Additionally, libnl uses USER_HZ for calculating buffer and cbuffer sizes, which can result in much larger buffers than necessary on systems with high resolution timers. Note that the TBF qdisc uses microseconds incorrectly in two spots as well, I fixed this but did not test.
Diffstat (limited to 'lib/route')
-rw-r--r--lib/route/qdisc/htb.c12
-rw-r--r--lib/route/qdisc/tbf.c4
-rw-r--r--lib/route/tc.c2
3 files changed, 9 insertions, 9 deletions
diff --git a/lib/route/qdisc/htb.c b/lib/route/qdisc/htb.c
index f1d0e75..4298580 100644
--- a/lib/route/qdisc/htb.c
+++ b/lib/route/qdisc/htb.c
@@ -86,9 +86,9 @@ static int htb_class_msg_parser(struct rtnl_tc *tc, void *data)
htb->ch_prio = opts.prio;
rtnl_copy_ratespec(&htb->ch_rate, &opts.rate);
rtnl_copy_ratespec(&htb->ch_ceil, &opts.ceil);
- htb->ch_rbuffer = rtnl_tc_calc_bufsize(opts.buffer,
+ htb->ch_rbuffer = rtnl_tc_calc_bufsize(nl_ticks2us(opts.buffer),
opts.rate.rate);
- htb->ch_cbuffer = rtnl_tc_calc_bufsize(opts.cbuffer,
+ htb->ch_cbuffer = rtnl_tc_calc_bufsize(nl_ticks2us(opts.cbuffer),
opts.ceil.rate);
htb->ch_quantum = opts.quantum;
htb->ch_level = opts.level;
@@ -242,16 +242,16 @@ static int htb_class_msg_fill(struct rtnl_tc *tc, void *data,
if (htb->ch_mask & SCH_HTB_HAS_RBUFFER)
buffer = htb->ch_rbuffer;
else
- buffer = opts.rate.rate / nl_get_user_hz() + mtu; /* XXX */
+ buffer = opts.rate.rate / nl_get_psched_hz() + mtu; /* XXX */
- opts.buffer = rtnl_tc_calc_txtime(buffer, opts.rate.rate);
+ opts.buffer = nl_us2ticks(rtnl_tc_calc_txtime(buffer, opts.rate.rate));
if (htb->ch_mask & SCH_HTB_HAS_CBUFFER)
cbuffer = htb->ch_cbuffer;
else
- cbuffer = opts.ceil.rate / nl_get_user_hz() + mtu; /* XXX */
+ cbuffer = opts.ceil.rate / nl_get_psched_hz() + mtu; /* XXX */
- opts.cbuffer = rtnl_tc_calc_txtime(cbuffer, opts.ceil.rate);
+ opts.cbuffer = nl_us2ticks(rtnl_tc_calc_txtime(cbuffer, opts.ceil.rate));
if (htb->ch_mask & SCH_HTB_HAS_QUANTUM)
opts.quantum = htb->ch_quantum;
diff --git a/lib/route/qdisc/tbf.c b/lib/route/qdisc/tbf.c
index 8a6c400..81bd84c 100644
--- a/lib/route/qdisc/tbf.c
+++ b/lib/route/qdisc/tbf.c
@@ -290,7 +290,7 @@ void rtnl_qdisc_tbf_set_rate(struct rtnl_qdisc *qdisc, int rate, int bucket,
tbf->qt_rate.rs_rate = rate;
tbf->qt_rate_bucket = bucket;
tbf->qt_rate.rs_cell_log = cell_log;
- tbf->qt_rate_txtime = rtnl_tc_calc_txtime(bucket, rate);
+ tbf->qt_rate_txtime = nl_us2ticks(rtnl_tc_calc_txtime(bucket, rate));
tbf->qt_mask |= TBF_ATTR_RATE;
}
@@ -372,7 +372,7 @@ int rtnl_qdisc_tbf_set_peakrate(struct rtnl_qdisc *qdisc, int rate, int bucket,
tbf->qt_peakrate.rs_rate = rate;
tbf->qt_peakrate_bucket = bucket;
tbf->qt_peakrate.rs_cell_log = cell_log;
- tbf->qt_peakrate_txtime = rtnl_tc_calc_txtime(bucket, rate);
+ tbf->qt_peakrate_txtime = nl_us2ticks(rtnl_tc_calc_txtime(bucket, rate));
tbf->qt_mask |= TBF_ATTR_PEAKRATE;
diff --git a/lib/route/tc.c b/lib/route/tc.c
index 6826a05..6c72c15 100644
--- a/lib/route/tc.c
+++ b/lib/route/tc.c
@@ -710,7 +710,7 @@ int rtnl_tc_build_rate_table(struct rtnl_tc *tc, struct rtnl_ratespec *spec,
for (i = 0; i < RTNL_TC_RTABLE_SIZE; i++) {
size = adjust_size((i + 1) << cell_log, spec->rs_mpu, linktype);
- dst[i] = rtnl_tc_calc_txtime(size, spec->rs_rate);
+ dst[i] = nl_us2ticks(rtnl_tc_calc_txtime(size, spec->rs_rate));
}
spec->rs_cell_align = -1;