diff options
author | Nicholas Mc Guire <hofrat@osadl.org> | 2015-05-28 13:09:56 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2015-06-10 05:31:14 -0400 |
commit | c569a23d65ac2900d9998d3fe04044fe95be6b2f (patch) | |
tree | ecc4e449ec0918189cc6b78855980636069417f7 | |
parent | ae60d6a0e3a9197d37f8c8c4584a8ecd18518cd6 (diff) |
time: Allow gcc to fold usecs_to_jiffies(constant)
To allow constant folding in usecs_to_jiffies() conditionally calls
the HZ dependent _usecs_to_jiffies() helpers or, when gcc can not
figure out constant folding, __usecs_to_jiffies, which is the renamed
original usecs_to_jiffies() function.
Signed-off-by: Nicholas Mc Guire <hofrat@osadl.org>
Cc: Masahiro Yamada <yamada.m@jp.panasonic.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Joe Perches <joe@perches.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Andrew Hunter <ahh@google.com>
Cc: Paul Turner <pjt@google.com>
Cc: Michal Marek <mmarek@suse.cz>
Link: http://lkml.kernel.org/r/1432832996-12129-2-git-send-email-hofrat@osadl.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/linux/jiffies.h | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index a316ebea0a89..535fd3bb1ba8 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h | |||
@@ -383,9 +383,37 @@ static inline unsigned long _usecs_to_jiffies(const unsigned int u) | |||
383 | } | 383 | } |
384 | #endif | 384 | #endif |
385 | 385 | ||
386 | /** | ||
387 | * usecs_to_jiffies: - convert microseconds to jiffies | ||
388 | * @u: time in microseconds | ||
389 | * | ||
390 | * conversion is done as follows: | ||
391 | * | ||
392 | * - 'too large' values [that would result in larger than | ||
393 | * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too. | ||
394 | * | ||
395 | * - all other values are converted to jiffies by either multiplying | ||
396 | * the input value by a factor or dividing it with a factor and | ||
397 | * handling any 32-bit overflows as for msecs_to_jiffies. | ||
398 | * | ||
399 | * usecs_to_jiffies() checks for the passed in value being a constant | ||
400 | * via __builtin_constant_p() allowing gcc to eliminate most of the | ||
401 | * code, __usecs_to_jiffies() is called if the value passed does not | ||
402 | * allow constant folding and the actual conversion must be done at | ||
403 | * runtime. | ||
404 | * the HZ range specific helpers _usecs_to_jiffies() are called both | ||
405 | * directly here and from __msecs_to_jiffies() in the case where | ||
406 | * constant folding is not possible. | ||
407 | */ | ||
386 | static inline unsigned long usecs_to_jiffies(const unsigned int u) | 408 | static inline unsigned long usecs_to_jiffies(const unsigned int u) |
387 | { | 409 | { |
388 | return __usecs_to_jiffies(u); | 410 | if (__builtin_constant_p(u)) { |
411 | if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET)) | ||
412 | return MAX_JIFFY_OFFSET; | ||
413 | return _usecs_to_jiffies(u); | ||
414 | } else { | ||
415 | return __usecs_to_jiffies(u); | ||
416 | } | ||
389 | } | 417 | } |
390 | 418 | ||
391 | extern unsigned long timespec_to_jiffies(const struct timespec *value); | 419 | extern unsigned long timespec_to_jiffies(const struct timespec *value); |