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>
This commit is contained in:
parent
e9266a02b7
commit
33136d12be
|
@ -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 {
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue