diff options
Diffstat (limited to 'net/core')
-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); |