diff options
author | Daniel Borkmann <dxchgb@gmail.com> | 2012-10-28 04:27:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-03 14:50:15 -0400 |
commit | 398f382c0a5bd62f0f31871e844700e1b9fd1ad3 (patch) | |
tree | c1456d193eb4089de48f9aed8459fbf806433563 /net/core | |
parent | e6c022a4fa2d2d9ca9d0a7ac3b05ad988f39fc30 (diff) |
pktgen: clean up ktime_t helpers
Some years ago, the ktime_t helper functions ktime_now() and ktime_lt()
have been introduced. Instead of defining them inside pktgen.c, they
should either use ktime_t library functions or, if not available, they
should be defined in ktime.h, so that also others can benefit from them.
ktime_compare() is introduced with a similar notion as in timespec_compare().
Signed-off-by: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Cc: Cong Wang <xiyou.wangcong@gmail.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/pktgen.c | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 1d1c216ffd9a..b29dacf900f9 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -419,20 +419,6 @@ struct pktgen_thread { | |||
419 | #define REMOVE 1 | 419 | #define REMOVE 1 |
420 | #define FIND 0 | 420 | #define FIND 0 |
421 | 421 | ||
422 | static inline ktime_t ktime_now(void) | ||
423 | { | ||
424 | struct timespec ts; | ||
425 | ktime_get_ts(&ts); | ||
426 | |||
427 | return timespec_to_ktime(ts); | ||
428 | } | ||
429 | |||
430 | /* This works even if 32 bit because of careful byte order choice */ | ||
431 | static inline int ktime_lt(const ktime_t cmp1, const ktime_t cmp2) | ||
432 | { | ||
433 | return cmp1.tv64 < cmp2.tv64; | ||
434 | } | ||
435 | |||
436 | static const char version[] = | 422 | static const char version[] = |
437 | "Packet Generator for packet performance testing. " | 423 | "Packet Generator for packet performance testing. " |
438 | "Version: " VERSION "\n"; | 424 | "Version: " VERSION "\n"; |
@@ -675,7 +661,7 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
675 | seq_puts(seq, "\n"); | 661 | seq_puts(seq, "\n"); |
676 | 662 | ||
677 | /* not really stopped, more like last-running-at */ | 663 | /* not really stopped, more like last-running-at */ |
678 | stopped = pkt_dev->running ? ktime_now() : pkt_dev->stopped_at; | 664 | stopped = pkt_dev->running ? ktime_get() : pkt_dev->stopped_at; |
679 | idle = pkt_dev->idle_acc; | 665 | idle = pkt_dev->idle_acc; |
680 | do_div(idle, NSEC_PER_USEC); | 666 | do_div(idle, NSEC_PER_USEC); |
681 | 667 | ||
@@ -2141,12 +2127,12 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2141 | return; | 2127 | return; |
2142 | } | 2128 | } |
2143 | 2129 | ||
2144 | start_time = ktime_now(); | 2130 | start_time = ktime_get(); |
2145 | if (remaining < 100000) { | 2131 | if (remaining < 100000) { |
2146 | /* for small delays (<100us), just loop until limit is reached */ | 2132 | /* for small delays (<100us), just loop until limit is reached */ |
2147 | do { | 2133 | do { |
2148 | end_time = ktime_now(); | 2134 | end_time = ktime_get(); |
2149 | } while (ktime_lt(end_time, spin_until)); | 2135 | } while (ktime_compare(end_time, spin_until) < 0); |
2150 | } else { | 2136 | } else { |
2151 | /* see do_nanosleep */ | 2137 | /* see do_nanosleep */ |
2152 | hrtimer_init_sleeper(&t, current); | 2138 | hrtimer_init_sleeper(&t, current); |
@@ -2162,7 +2148,7 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) | |||
2162 | hrtimer_cancel(&t.timer); | 2148 | hrtimer_cancel(&t.timer); |
2163 | } while (t.task && pkt_dev->running && !signal_pending(current)); | 2149 | } while (t.task && pkt_dev->running && !signal_pending(current)); |
2164 | __set_current_state(TASK_RUNNING); | 2150 | __set_current_state(TASK_RUNNING); |
2165 | end_time = ktime_now(); | 2151 | end_time = ktime_get(); |
2166 | } | 2152 | } |
2167 | 2153 | ||
2168 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); | 2154 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); |
@@ -2912,8 +2898,7 @@ static void pktgen_run(struct pktgen_thread *t) | |||
2912 | pktgen_clear_counters(pkt_dev); | 2898 | pktgen_clear_counters(pkt_dev); |
2913 | pkt_dev->running = 1; /* Cranke yeself! */ | 2899 | pkt_dev->running = 1; /* Cranke yeself! */ |
2914 | pkt_dev->skb = NULL; | 2900 | pkt_dev->skb = NULL; |
2915 | pkt_dev->started_at = | 2901 | pkt_dev->started_at = pkt_dev->next_tx = ktime_get(); |
2916 | pkt_dev->next_tx = ktime_now(); | ||
2917 | 2902 | ||
2918 | set_pkt_overhead(pkt_dev); | 2903 | set_pkt_overhead(pkt_dev); |
2919 | 2904 | ||
@@ -3072,7 +3057,7 @@ static int pktgen_stop_device(struct pktgen_dev *pkt_dev) | |||
3072 | 3057 | ||
3073 | kfree_skb(pkt_dev->skb); | 3058 | kfree_skb(pkt_dev->skb); |
3074 | pkt_dev->skb = NULL; | 3059 | pkt_dev->skb = NULL; |
3075 | pkt_dev->stopped_at = ktime_now(); | 3060 | pkt_dev->stopped_at = ktime_get(); |
3076 | pkt_dev->running = 0; | 3061 | pkt_dev->running = 0; |
3077 | 3062 | ||
3078 | show_results(pkt_dev, nr_frags); | 3063 | show_results(pkt_dev, nr_frags); |
@@ -3091,7 +3076,7 @@ static struct pktgen_dev *next_to_run(struct pktgen_thread *t) | |||
3091 | continue; | 3076 | continue; |
3092 | if (best == NULL) | 3077 | if (best == NULL) |
3093 | best = pkt_dev; | 3078 | best = pkt_dev; |
3094 | else if (ktime_lt(pkt_dev->next_tx, best->next_tx)) | 3079 | else if (ktime_compare(pkt_dev->next_tx, best->next_tx) < 0) |
3095 | best = pkt_dev; | 3080 | best = pkt_dev; |
3096 | } | 3081 | } |
3097 | if_unlock(t); | 3082 | if_unlock(t); |
@@ -3176,14 +3161,14 @@ static void pktgen_rem_thread(struct pktgen_thread *t) | |||
3176 | 3161 | ||
3177 | static void pktgen_resched(struct pktgen_dev *pkt_dev) | 3162 | static void pktgen_resched(struct pktgen_dev *pkt_dev) |
3178 | { | 3163 | { |
3179 | ktime_t idle_start = ktime_now(); | 3164 | ktime_t idle_start = ktime_get(); |
3180 | schedule(); | 3165 | schedule(); |
3181 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_now(), idle_start)); | 3166 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); |
3182 | } | 3167 | } |
3183 | 3168 | ||
3184 | static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev) | 3169 | static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev) |
3185 | { | 3170 | { |
3186 | ktime_t idle_start = ktime_now(); | 3171 | ktime_t idle_start = ktime_get(); |
3187 | 3172 | ||
3188 | while (atomic_read(&(pkt_dev->skb->users)) != 1) { | 3173 | while (atomic_read(&(pkt_dev->skb->users)) != 1) { |
3189 | if (signal_pending(current)) | 3174 | if (signal_pending(current)) |
@@ -3194,7 +3179,7 @@ static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev) | |||
3194 | else | 3179 | else |
3195 | cpu_relax(); | 3180 | cpu_relax(); |
3196 | } | 3181 | } |
3197 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_now(), idle_start)); | 3182 | pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); |
3198 | } | 3183 | } |
3199 | 3184 | ||
3200 | static void pktgen_xmit(struct pktgen_dev *pkt_dev) | 3185 | static void pktgen_xmit(struct pktgen_dev *pkt_dev) |
@@ -3216,7 +3201,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3216 | * "never transmit" | 3201 | * "never transmit" |
3217 | */ | 3202 | */ |
3218 | if (unlikely(pkt_dev->delay == ULLONG_MAX)) { | 3203 | if (unlikely(pkt_dev->delay == ULLONG_MAX)) { |
3219 | pkt_dev->next_tx = ktime_add_ns(ktime_now(), ULONG_MAX); | 3204 | pkt_dev->next_tx = ktime_add_ns(ktime_get(), ULONG_MAX); |
3220 | return; | 3205 | return; |
3221 | } | 3206 | } |
3222 | 3207 | ||