|
@@ -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();
|
|
|
}
|
|
|
- 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);
|