Introduce TIME_UNITS_PER_SEC to represent internal clock resolution

[IPROUTE]: Introduce TIME_UNITS_PER_SEC to represent internal clock resolution

Introduce TIME_UNITS_PER_SEC and conversion functions between internal
resolution and resolution expected by the kernel (currently implemented as
NOPs, only needed by HFSC, which currently always uses microseconds).

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
This commit is contained in:
Patrick McHardy 2007-03-04 20:14:59 +01:00 committed by Stephen Hemminger
parent 76dc0aa28f
commit f0bda7e5a5
7 changed files with 36 additions and 22 deletions

View File

@ -226,7 +226,7 @@ hfsc_print_sc(FILE *f, char *name, struct tc_service_curve *sc)
fprintf(f, "%s ", name); fprintf(f, "%s ", name);
fprintf(f, "m1 %s ", sprint_rate(sc->m1, b1)); fprintf(f, "m1 %s ", sprint_rate(sc->m1, b1));
fprintf(f, "d %s ", sprint_usecs(sc->d, b1)); fprintf(f, "d %s ", sprint_usecs(tc_core_ktime2time(sc->d), b1));
fprintf(f, "m2 %s ", sprint_rate(sc->m2, b1)); fprintf(f, "m2 %s ", sprint_rate(sc->m2, b1));
} }
@ -320,7 +320,7 @@ hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
return -1; return -1;
sc->m1 = m1; sc->m1 = m1;
sc->d = d; sc->d = tc_core_time2ktime(d);
sc->m2 = m2; sc->m2 = m2;
*argvp = argv; *argvp = argv;
@ -367,13 +367,13 @@ hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
return -1; return -1;
} }
if (dmax != 0 && ceil(umax * 1000000.0 / dmax) > rate) { if (dmax != 0 && ceil(1.0 * umax * TIME_UNITS_PER_SEC / dmax) > rate) {
/* /*
* concave curve, slope of first segment is umax/dmax, * concave curve, slope of first segment is umax/dmax,
* intersection is at dmax * intersection is at dmax
*/ */
sc->m1 = ceil(umax * 1000000.0 / dmax); /* in bps */ sc->m1 = ceil(1.0 * umax * TIME_UNITS_PER_SEC / dmax); /* in bps */
sc->d = dmax; sc->d = tc_core_time2ktime(dmax);
sc->m2 = rate; sc->m2 = rate;
} else { } else {
/* /*
@ -381,7 +381,7 @@ hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
* is at dmax - umax / rate * is at dmax - umax / rate
*/ */
sc->m1 = 0; sc->m1 = 0;
sc->d = ceil(dmax - umax * 1000000.0 / rate); /* in usec */ sc->d = tc_core_time2ktime(ceil(dmax - umax * TIME_UNITS_PER_SEC / rate));
sc->m2 = rate; sc->m2 = rate;
} }

View File

@ -161,9 +161,9 @@ static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
} }
if (opt.limit == 0) { if (opt.limit == 0) {
double lim = opt.rate.rate*(double)latency/1000000 + buffer; double lim = opt.rate.rate*(double)latency/TIME_UNITS_PER_SEC + buffer;
if (opt.peakrate.rate) { if (opt.peakrate.rate) {
double lim2 = opt.peakrate.rate*(double)latency/1000000 + mtu; double lim2 = opt.peakrate.rate*(double)latency/TIME_UNITS_PER_SEC + mtu;
if (lim2 < lim) if (lim2 < lim)
lim = lim2; lim = lim2;
} }
@ -245,9 +245,9 @@ static int tbf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
if (show_raw) if (show_raw)
fprintf(f, "limit %s ", sprint_size(qopt->limit, b1)); fprintf(f, "limit %s ", sprint_size(qopt->limit, b1));
latency = 1000000*(qopt->limit/(double)qopt->rate.rate) - tc_core_tick2usec(qopt->buffer); latency = TIME_UNITS_PER_SEC*(qopt->limit/(double)qopt->rate.rate) - tc_core_tick2usec(qopt->buffer);
if (qopt->peakrate.rate) { if (qopt->peakrate.rate) {
double lat2 = 1000000*(qopt->limit/(double)qopt->peakrate.rate) - tc_core_tick2usec(qopt->mtu); double lat2 = TIME_UNITS_PER_SEC*(qopt->limit/(double)qopt->peakrate.rate) - tc_core_tick2usec(qopt->mtu);
if (lat2 > latency) if (lat2 > latency)
latency = lat2; latency = lat2;
} }

View File

@ -38,7 +38,7 @@ unsigned tc_cbq_calc_maxidle(unsigned bndw, unsigned rate, unsigned avpkt,
if (vxmt > maxidle) if (vxmt > maxidle)
maxidle = vxmt; maxidle = vxmt;
} }
return tc_core_usec2tick(maxidle*(1<<ewma_log)*1000000); return tc_core_usec2tick(maxidle*(1<<ewma_log)*TIME_UNITS_PER_SEC);
} }
unsigned tc_cbq_calc_offtime(unsigned bndw, unsigned rate, unsigned avpkt, unsigned tc_cbq_calc_offtime(unsigned bndw, unsigned rate, unsigned avpkt,
@ -53,5 +53,5 @@ unsigned tc_cbq_calc_offtime(unsigned bndw, unsigned rate, unsigned avpkt,
offtime *= pow(g, -(double)minburst) - 1; offtime *= pow(g, -(double)minburst) - 1;
else else
offtime *= 1 + (pow(g, -(double)(minburst-1)) - 1)/(1-g); offtime *= 1 + (pow(g, -(double)(minburst-1)) - 1)/(1-g);
return tc_core_usec2tick(offtime*1000000); return tc_core_usec2tick(offtime*TIME_UNITS_PER_SEC);
} }

View File

@ -46,14 +46,24 @@ long tc_core_tick2usec(long tick)
return tick/tick_in_usec; return tick/tick_in_usec;
} }
long tc_core_time2ktime(long time)
{
return time;
}
long tc_core_ktime2time(long ktime)
{
return ktime;
}
unsigned tc_calc_xmittime(unsigned rate, unsigned size) unsigned tc_calc_xmittime(unsigned rate, unsigned size)
{ {
return tc_core_usec2tick(1000000*((double)size/rate)); return tc_core_usec2tick(TIME_UNITS_PER_SEC*((double)size/rate));
} }
unsigned tc_calc_xmitsize(unsigned rate, unsigned ticks) unsigned tc_calc_xmitsize(unsigned rate, unsigned ticks)
{ {
return ((double)rate*tc_core_tick2usec(ticks))/1000000; return ((double)rate*tc_core_tick2usec(ticks))/TIME_UNITS_PER_SEC;
} }
/* /*

View File

@ -4,9 +4,13 @@
#include <asm/types.h> #include <asm/types.h>
#include <linux/pkt_sched.h> #include <linux/pkt_sched.h>
#define TIME_UNITS_PER_SEC 1000000
int tc_core_usec2big(long usec); int tc_core_usec2big(long usec);
long tc_core_usec2tick(long usec); long tc_core_usec2tick(long usec);
long tc_core_tick2usec(long tick); long tc_core_tick2usec(long tick);
long tc_core_time2ktime(long time);
long tc_core_ktime2time(long ktime);
unsigned tc_calc_xmittime(unsigned rate, unsigned size); unsigned tc_calc_xmittime(unsigned rate, unsigned size);
unsigned tc_calc_xmitsize(unsigned rate, unsigned ticks); unsigned tc_calc_xmitsize(unsigned rate, unsigned ticks);
int tc_calc_rtable(unsigned bps, __u32 *rtab, int cell_log, unsigned mtu, unsigned mpu); int tc_calc_rtable(unsigned bps, __u32 *rtab, int cell_log, unsigned mtu, unsigned mpu);

View File

@ -26,7 +26,7 @@
int tc_setup_estimator(unsigned A, unsigned time_const, struct tc_estimator *est) int tc_setup_estimator(unsigned A, unsigned time_const, struct tc_estimator *est)
{ {
for (est->interval=0; est->interval<=5; est->interval++) { for (est->interval=0; est->interval<=5; est->interval++) {
if (A <= (1<<est->interval)*(1000000/4)) if (A <= (1<<est->interval)*(TIME_UNITS_PER_SEC/4))
break; break;
} }
if (est->interval > 5) if (est->interval > 5)

View File

@ -221,13 +221,13 @@ int get_usecs(unsigned *usecs, const char *str)
if (*p) { if (*p) {
if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 || if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 ||
strcasecmp(p, "secs")==0) strcasecmp(p, "secs")==0)
t *= 1000000; t *= TIME_UNITS_PER_SEC;
else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 || else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 ||
strcasecmp(p, "msecs") == 0) strcasecmp(p, "msecs") == 0)
t *= 1000; t *= TIME_UNITS_PER_SEC/1000;
else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 || else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 ||
strcasecmp(p, "usecs") == 0) strcasecmp(p, "usecs") == 0)
t *= 1; t *= TIME_UNITS_PER_SEC/1000000;
else else
return -1; return -1;
} }
@ -241,10 +241,10 @@ void print_usecs(char *buf, int len, __u32 usec)
{ {
double tmp = usec; double tmp = usec;
if (tmp >= 1000000) if (tmp >= TIME_UNITS_PER_SEC)
snprintf(buf, len, "%.1fs", tmp/1000000); snprintf(buf, len, "%.1fs", tmp/TIME_UNITS_PER_SEC);
else if (tmp >= 1000) else if (tmp >= TIME_UNITS_PER_SEC/1000)
snprintf(buf, len, "%.1fms", tmp/1000); snprintf(buf, len, "%.1fms", tmp/(TIME_UNITS_PER_SEC/1000));
else else
snprintf(buf, len, "%uus", usec); snprintf(buf, len, "%uus", usec);
} }