To allow constant folding in msecs_to_jiffies() conditionally calls
the HZ dependent _msecs_to_jiffies() helpers or, when gcc can not
figure out constant folding, __msecs_to_jiffies which is the renamed 
original msecs_to_jiffies() function. 

Patch was build tested for:
  arm - imx_v6_v7_defconfig, vexpress_defconfig
  cris - etrax-100lx_v2_defconfig
  m68k - multi_defconfig
  mips32 - ar7_defconfig,
  mips64 - loongson3_defconfig
  powerpc - 44x/virtex5_defconfig
  powerpc64 - powerpc64_defconfig
  sh - se7780_defconfig,
  sparc32 - sparc32_defconfig
  sparc64 - sparc64_defconfig
  x86 64 - x86_64_defconfig,
boot and run testing:
  x86 64 - x86_64_defconfig i3

Patch is against 4.1-rc3 (localversion-next is -next-20150518)

Signed-off-by: Nicholas Mc Guire <[email protected]>
---

Thanks to Joe Perches <[email protected]> for suggesting this approach 
and for his review comments on the first attempts.

 include/linux/jiffies.h |   17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index b41e026e..e96996a 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -343,12 +343,24 @@ static inline unsigned long _msecs_to_jiffies(const 
unsigned int m)
  *   handling any 32-bit overflows.
  *   for the details see __msecs_to_jiffies()
  *
- * the HZ range specific helpers _msecs_to_jiffies() are called from
- * __msecs_to_jiffies().
+ * msecs_to_jiffies() checks for the passed in value being a constant
+ * via __builtin_constant_p() allowing gcc to eliminate most of the
+ * code, __msecs_to_jiffies() is called if the value passed does not
+ * allow constant folding and the actual conversion must be done at
+ * runtime.
+ * the HZ range specific helpers _msecs_to_jiffies() are called both
+ * directly here and from __msecs_to_jiffies() in the case where
+ * constant folding is not possible.
  */
 static inline unsigned long msecs_to_jiffies(const unsigned int m)
 {
-       return __msecs_to_jiffies(m);
+       if (__builtin_constant_p(m)) {
+               if ((int)m < 0)
+                       return MAX_JIFFY_OFFSET;
+               return _msecs_to_jiffies(m);
+       } else {
+               return __msecs_to_jiffies(m);
+       }
 }
 
 extern unsigned long usecs_to_jiffies(const unsigned int u);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to