# This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/07/13 03:44:29+02:00 kaber@trash.net # [NET_SCHED]: Make clock source configurable # # Signed-off-by: Patrick McHardy # # net/sched/sch_htb.c # 2004/07/13 03:44:18+02:00 kaber@trash.net +10 -0 # [NET_SCHED]: Make clock source configurable # # net/sched/sch_hfsc.c # 2004/07/13 03:44:18+02:00 kaber@trash.net +5 -5 # [NET_SCHED]: Make clock source configurable # # net/sched/sch_api.c # 2004/07/13 03:44:18+02:00 kaber@trash.net +6 -6 # [NET_SCHED]: Make clock source configurable # # net/sched/Kconfig # 2004/07/13 03:44:18+02:00 kaber@trash.net +28 -0 # [NET_SCHED]: Make clock source configurable # # include/net/pkt_sched.h # 2004/07/13 03:44:18+02:00 kaber@trash.net +15 -20 # [NET_SCHED]: Make clock source configurable # diff -Nru a/include/net/pkt_sched.h b/include/net/pkt_sched.h --- a/include/net/pkt_sched.h 2004-07-13 03:46:55 +02:00 +++ b/include/net/pkt_sched.h 2004-07-13 03:46:55 +02:00 @@ -1,12 +1,6 @@ #ifndef __NET_PKT_SCHED_H #define __NET_PKT_SCHED_H -#define PSCHED_GETTIMEOFDAY 1 -#define PSCHED_JIFFIES 2 -#define PSCHED_CPU 3 - -#define PSCHED_CLOCK_SOURCE PSCHED_JIFFIES - #include #include #include @@ -185,24 +179,24 @@ gettimeofday, it returns invalid timestamp, which is not updated, when net_bh is active. - So, use PSCHED_CLOCK_SOURCE = PSCHED_CPU on alpha and pentiums - with rtdsc. And PSCHED_JIFFIES on all other architectures, including [34]86 + So, use CONFIG_NET_SCH_CLK_TSC on alpha and pentiums with rtdsc. + And CONFIG_NET_SCH_CLK_JIFFIES on all other architectures, including [34]86 and pentiums without rtdsc. - You can use PSCHED_GETTIMEOFDAY on another architectures, + You can use CONFIG_NET_SCH_CLK_GETTIMEOFDAY on another architectures, which have fast and precise clock source, but it is too expensive. */ /* General note about internal clock. Any clock source returns time intervals, measured in units - close to 1usec. With source PSCHED_GETTIMEOFDAY it is precisely + close to 1usec. With source CONFIG_NET_SCH_CLK_GETTIMEOFDAY it is precisely microseconds, otherwise something close but different chosen to minimize arithmetic cost. Ratio usec/internal untis in form nominator/denominator may be read from /proc/net/psched. */ -#if PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY +#ifdef CONFIG_NET_SCH_CLK_GETTIMEOFDAY typedef struct timeval psched_time_t; typedef long psched_tdiff_t; @@ -211,14 +205,14 @@ #define PSCHED_US2JIFFIE(usecs) (((usecs)+(1000000/HZ-1))/(1000000/HZ)) #define PSCHED_JIFFIE2US(delay) ((delay)*(1000000/HZ)) -#else /* PSCHED_CLOCK_SOURCE != PSCHED_GETTIMEOFDAY */ +#else /* !CONFIG_NET_SCH_CLK_GETTIMEOFDAY */ typedef u64 psched_time_t; typedef long psched_tdiff_t; extern psched_time_t psched_time_base; -#if PSCHED_CLOCK_SOURCE == PSCHED_JIFFIES +#ifdef CONFIG_NET_SCH_CLK_JIFFIES #if HZ < 96 #define PSCHED_JSCALE 14 @@ -236,7 +230,8 @@ #define PSCHED_US2JIFFIE(delay) (((delay)+(1<>PSCHED_JSCALE) #define PSCHED_JIFFIE2US(delay) ((delay)< 2000000) (t) = 2000000; }) -#else +#else /* !CONFIG_NET_SCH_CLK_GETTIMEOFDAY */ #define PSCHED_TDIFF(tv1, tv2) (long)((tv1) - (tv2)) #define PSCHED_TDIFF_SAFE(tv1, tv2, bound) \ @@ -354,7 +349,7 @@ #define PSCHED_IS_PASTPERFECT(t) ((t) == 0) #define PSCHED_AUDIT_TDIFF(t) -#endif +#endif /* !CONFIG_NET_SCH_CLK_GETTIMEOFDAY */ struct tcf_police { diff -Nru a/net/sched/Kconfig b/net/sched/Kconfig --- a/net/sched/Kconfig 2004-07-13 03:46:55 +02:00 +++ b/net/sched/Kconfig 2004-07-13 03:46:55 +02:00 @@ -1,6 +1,34 @@ # # Traffic control configuration. # +choice + prompt "Packet scheduler clock source" + depends on NET_SCHED + default NET_SCH_CLK_JIFFIES + +config NET_SCH_CLK_JIFFIES + bool "Timer interrupt" + help + Say Y here if you want to use the timer interrupt (jiffies) as clock + source. This is an inexpensive clock source, but its resolution is too + low for accurate shaping except at very low speed. + +config NET_SCH_CLK_GETTIMEOFDAY + bool "gettimeofday" + help + Say Y here if you want to use gettimeofday as clock source. This clock + source has high resolution, but is too expensive for slow CPUs. + +config NET_SCH_CLK_TSC + bool "Timestamp counter" + depends on X86_TSC || ALPHA + help + Say Y here if you want to use the CPU's timestamp counter (TSC) as + clock source. This is a cheap and high resolution clock source, choose + this if your TSC is working properly. + +endchoice + config NET_SCH_CBQ tristate "CBQ packet scheduler" depends on NET_SCHED diff -Nru a/net/sched/sch_api.c b/net/sched/sch_api.c --- a/net/sched/sch_api.c 2004-07-13 03:46:55 +02:00 +++ b/net/sched/sch_api.c 2004-07-13 03:46:55 +02:00 @@ -1088,7 +1088,7 @@ }; #endif -#if PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY +#ifdef CONFIG_NET_SCH_CLK_GETTIMEOFDAY int psched_tod_diff(int delta_sec, int bound) { int delta; @@ -1105,7 +1105,7 @@ psched_time_t psched_time_base; -#if PSCHED_CLOCK_SOURCE == PSCHED_CPU +#ifdef CONFIG_NET_SCH_CLK_TSC psched_tdiff_t psched_clock_per_hz; int psched_clock_scale; EXPORT_SYMBOL(psched_clock_per_hz); @@ -1123,7 +1123,7 @@ static void psched_tick(unsigned long dummy) { -#if PSCHED_CLOCK_SOURCE == PSCHED_CPU +#ifdef CONFIG_NET_SCH_CLK_TSC psched_time_t dummy_stamp; PSCHED_GET_TIME(dummy_stamp); /* It is OK up to 4GHz cpu */ @@ -1138,7 +1138,7 @@ } #endif -#if PSCHED_CLOCK_SOURCE == PSCHED_CPU +#ifdef CONFIG_NET_SCH_CLK_TSC int __init psched_calibrate_clock(void) { psched_time_t stamp, stamp1; @@ -1179,10 +1179,10 @@ { struct rtnetlink_link *link_p; -#if PSCHED_CLOCK_SOURCE == PSCHED_CPU +#ifdef CONFIG_NET_SCH_CLK_TSC if (psched_calibrate_clock() < 0) return -1; -#elif PSCHED_CLOCK_SOURCE == PSCHED_JIFFIES +#elif defined(CONFIG_NET_SCH_CLK_JIFFIES) psched_tick_per_us = HZ< #undef PSCHED_GET_TIME #define PSCHED_GET_TIME(stamp) \ @@ -429,10 +429,10 @@ * ism: (psched_us/byte) << ISM_SHIFT * dx: psched_us * - * Time source resolution - * PSCHED_JIFFIES: for 48<=HZ<=1534 resolution is between 0.63us and 1.27us. - * PSCHED_CPU: resolution is between 0.5us and 1us. - * PSCHED_GETTIMEOFDAY: resolution is exactly 1us. + * Clock source resolution (CONFIG_NET_SCH_CLK_*) + * JIFFIES: for 48<=HZ<=1534 resolution is between 0.63us and 1.27us. + * TSC: resolution is between 0.5us and 1us. + * GETTIMEOFDAY: resolution is exactly 1us. * * sm and ism are scaled in order to keep effective digits. * SM_SHIFT and ISM_SHIFT are selected to keep at least 4 effective diff -Nru a/net/sched/sch_htb.c b/net/sched/sch_htb.c --- a/net/sched/sch_htb.c 2004-07-13 03:46:55 +02:00 +++ b/net/sched/sch_htb.c 2004-07-13 03:46:55 +02:00 @@ -856,8 +856,13 @@ if (net_ratelimit()) printk(KERN_ERR "HTB: bad diff in charge, cl=%X diff=%lX now=%Lu then=%Lu j=%lu\n", cl->classid, diff, +#ifdef CONFIG_NET_SCH_CLK_GETTIMEOFDAY + q->now.tv_sec * 1000000ULL + q->now.tv_usec, + cl->t_c.tv_sec * 1000000ULL + cl->t_c.tv_usec, +#else (unsigned long long) q->now, (unsigned long long) cl->t_c, +#endif q->jiffies); diff = 1000; } @@ -927,8 +932,13 @@ if (net_ratelimit()) printk(KERN_ERR "HTB: bad diff in events, cl=%X diff=%lX now=%Lu then=%Lu j=%lu\n", cl->classid, diff, +#ifdef CONFIG_NET_SCH_CLK_GETTIMEOFDAY + q->now.tv_sec * 1000000ULL + q->now.tv_usec, + cl->t_c.tv_sec * 1000000ULL + cl->t_c.tv_usec, +#else (unsigned long long) q->now, (unsigned long long) cl->t_c, +#endif q->jiffies); diff = 1000; }