/* time translations */
extern int nl_get_user_hz(void);
+extern int nl_get_psched_hz(void);
extern uint32_t nl_us2ticks(uint32_t);
extern uint32_t nl_ticks2us(uint32_t);
extern int nl_str2msec(const char *, uint64_t *);
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;
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;
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;
}
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;
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;
* @{
*/
-#ifdef USER_HZ
-static uint32_t user_hz = USER_HZ;
-#else
-static uint32_t user_hz = 100;
+#ifndef USER_HZ
+#define USER_HZ 100
#endif
+static uint32_t user_hz = USER_HZ;
+static uint32_t psched_hz = USER_HZ;
+
static double ticks_per_usec = 1.0f;
/* Retrieves the configured HZ and ticks/us value in the kernel.
if (!got_hz)
user_hz = sysconf(_SC_CLK_TCK);
+ psched_hz = user_hz;
+
if (getenv("TICKS_PER_USEC")) {
double t = strtod(getenv("TICKS_PER_USEC"), NULL);
ticks_per_usec = t;
strncpy(name, "/proc/net/psched", sizeof(name) - 1);
if ((fd = fopen(name, "r"))) {
- uint32_t ns_per_usec, ns_per_tick;
- /* the file contains 4 hexadecimals, but we just use
- the first two of them */
- fscanf(fd, "%08x %08x", &ns_per_usec, &ns_per_tick);
+ uint32_t ns_per_usec, ns_per_tick, nom, denom;
+
+ fscanf(fd, "%08x %08x %08x %08x",
+ &ns_per_usec, &ns_per_tick, &nom, &denom);
ticks_per_usec = (double) ns_per_usec /
(double) ns_per_tick;
+ if (nom == 1000000)
+ psched_hz = denom;
fclose(fd);
}
return user_hz;
}
+/**
+ * Return the value of packet scheduler HZ
+ */
+int nl_get_psched_hz(void)
+{
+ return psched_hz;
+}
/**
* Convert micro seconds to ticks