diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2008-09-04 01:30:19 -0400 |
---|---|---|
committer | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2008-09-04 01:45:40 -0400 |
commit | f76fd327a8b32d3ad5b51639faf6f54d18be0981 (patch) | |
tree | 86de66d77206ff624cce7402f73f97ea3575a6c9 /net/dccp/ccids | |
parent | 7d1af6a8d935678248d057564e75e1452409a53c (diff) |
dccp ccid-3: Runtime verification of timer resolution
The DCCP base time resolution is 10 microseconds (RFC 4340, 13.1 ... 13.3).
Using a timer with a lower resolution was found to trigger the following
bug warnings/problems on high-speed networks (e.g. local loopback):
* RTT samples are rounded down to 0 if below resolution;
* in some cases, negative RTT samples were observed;
* the CCID-3 feedback timer complains that the feedback interval is 0,
since the feedback interval is in the order of 1 RTT or less and RTT
measurement rounded this down to 0;
On an Intel computer this will for instance happen when using a
boot-time parameter of "clocksource=jiffies".
The following system log messages were observed:
11:24:00 kernel: BUG: delta (0) <= 0 at ccid3_hc_rx_send_feedback()
11:26:12 kernel: BUG: delta (0) <= 0 at ccid3_hc_rx_send_feedback()
11:26:30 kernel: dccp_sample_rtt: unusable RTT sample 0, using min
11:26:30 last message repeated 5 times
This patch defines a global constant for the time resolution, adds this in
timer.c, and checks the available clock resolution at CCID-3 module load time.
When the resolution is worse than 10 microseconds, module loading exits with
a message "socket type not supported".
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/ccids')
-rw-r--r-- | net/dccp/ccids/ccid3.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index 0d406f82e433..f566eb76aeb2 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -869,6 +869,19 @@ MODULE_PARM_DESC(ccid3_debug, "Enable debug messages"); | |||
869 | 869 | ||
870 | static __init int ccid3_module_init(void) | 870 | static __init int ccid3_module_init(void) |
871 | { | 871 | { |
872 | struct timespec tp; | ||
873 | |||
874 | /* | ||
875 | * Without a fine-grained clock resolution, RTTs/X_recv are not sampled | ||
876 | * correctly and feedback is sent either too early or too late. | ||
877 | */ | ||
878 | hrtimer_get_res(CLOCK_MONOTONIC, &tp); | ||
879 | if (tp.tv_sec || tp.tv_nsec > DCCP_TIME_RESOLUTION * NSEC_PER_USEC) { | ||
880 | printk(KERN_ERR "%s: Timer too coarse (%ld usec), need %u-usec" | ||
881 | " resolution - check your clocksource.\n", __func__, | ||
882 | tp.tv_nsec/NSEC_PER_USEC, DCCP_TIME_RESOLUTION); | ||
883 | return -ESOCKTNOSUPPORT; | ||
884 | } | ||
872 | return ccid_register(&ccid3); | 885 | return ccid_register(&ccid3); |
873 | } | 886 | } |
874 | module_init(ccid3_module_init); | 887 | module_init(ccid3_module_init); |