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); |
