Skip to content

Commit

Permalink
pktgen: remove ndelay() call
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Oct 20, 2011
1 parent e9266a0 commit 33136d1
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions net/core/pktgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -2145,9 +2145,12 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
}

start_time = ktime_now();
if (remaining < 100000)
ndelay(remaining); /* really small just spin */
else {
if (remaining < 100000) {
/* for small delays (<100us), just loop until limit is reached */
do {
end_time = ktime_now();
} while (ktime_lt(end_time, spin_until));
} else {
/* see do_nanosleep */
hrtimer_init_sleeper(&t, current);
do {
Expand All @@ -2162,8 +2165,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
hrtimer_cancel(&t.timer);
} while (t.task && pkt_dev->running && !signal_pending(current));
__set_current_state(TASK_RUNNING);
end_time = ktime_now();
}
end_time = ktime_now();

pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time));
pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay);
Expand Down

0 comments on commit 33136d1

Please sign in to comment.