diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-20 17:00:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-20 17:00:21 -0400 |
commit | 33136d12be00596a8320d4fe88f95c44f67afbdb (patch) | |
tree | b12e136753a269684794308df59183329ed553a8 /net | |
parent | e9266a02b7e6542355431955075b4e688962fc0a (diff) |
pktgen: remove ndelay() call
Daniel Turull reported inaccuracies in pktgen when using low packet
rates, because we call ndelay(val) with values bigger than 20000.
Instead of calling ndelay() for delays < 100us, we can instead loop
calling ktime_now() only.
Reported-by: Daniel Turull <daniel.turull@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/pktgen.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 6bbf00801f61..0001c243b35c 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2145,9 +2145,12 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2145 | } | 2145 | } |
2146 | 2146 | ||
2147 | start_time = ktime_now(); | 2147 | start_time = ktime_now(); |
2148 | if (remaining < 100000) | 2148 | if (remaining < 100000) { |
2149 | ndelay(remaining); /* really small just spin */ | 2149 | /* for small delays (<100us), just loop until limit is reached */ |
2150 | else { | 2150 | do { |
2151 | end_time = ktime_now(); | ||
2152 | } while (ktime_lt(end_time, spin_until)); | ||
2153 | } else { | ||
2151 | /* see do_nanosleep */ | 2154 | /* see do_nanosleep */ |
2152 | hrtimer_init_sleeper(&t, current); | 2155 | hrtimer_init_sleeper(&t, current); |
2153 | do { | 2156 | do { |
@@ -2162,8 +2165,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2162 | hrtimer_cancel(&t.timer); | 2165 | hrtimer_cancel(&t.timer); |
2163 | } while (t.task && pkt_dev->running && !signal_pending(current)); | 2166 | } while (t.task && pkt_dev->running && !signal_pending(current)); |
2164 | __set_current_state(TASK_RUNNING); | 2167 | __set_current_state(TASK_RUNNING); |
2168 | end_time = ktime_now(); | ||
2165 | } | 2169 | } |
2166 | end_time = ktime_now(); | ||
2167 | 2170 | ||
2168 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); | 2171 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); |
2169 | pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); | 2172 | pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); |