LCOV - code coverage report
Current view: top level - include/linux - jiffies.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsx @ Mon Jul 31 20:08:34 PDT 2023 Lines: 2 5 40.0 %
Date: 2023-07-31 20:08:34 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _LINUX_JIFFIES_H
       3             : #define _LINUX_JIFFIES_H
       4             : 
       5             : #include <linux/cache.h>
       6             : #include <linux/limits.h>
       7             : #include <linux/math64.h>
       8             : #include <linux/minmax.h>
       9             : #include <linux/types.h>
      10             : #include <linux/time.h>
      11             : #include <linux/timex.h>
      12             : #include <vdso/jiffies.h>
      13             : #include <asm/param.h>                    /* for HZ */
      14             : #include <generated/timeconst.h>
      15             : 
      16             : /*
      17             :  * The following defines establish the engineering parameters of the PLL
      18             :  * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
      19             :  * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
      20             :  * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
      21             :  * nearest power of two in order to avoid hardware multiply operations.
      22             :  */
      23             : #if HZ >= 12 && HZ < 24
      24             : # define SHIFT_HZ       4
      25             : #elif HZ >= 24 && HZ < 48
      26             : # define SHIFT_HZ       5
      27             : #elif HZ >= 48 && HZ < 96
      28             : # define SHIFT_HZ       6
      29             : #elif HZ >= 96 && HZ < 192
      30             : # define SHIFT_HZ       7
      31             : #elif HZ >= 192 && HZ < 384
      32             : # define SHIFT_HZ       8
      33             : #elif HZ >= 384 && HZ < 768
      34             : # define SHIFT_HZ       9
      35             : #elif HZ >= 768 && HZ < 1536
      36             : # define SHIFT_HZ       10
      37             : #elif HZ >= 1536 && HZ < 3072
      38             : # define SHIFT_HZ       11
      39             : #elif HZ >= 3072 && HZ < 6144
      40             : # define SHIFT_HZ       12
      41             : #elif HZ >= 6144 && HZ < 12288
      42             : # define SHIFT_HZ       13
      43             : #else
      44             : # error Invalid value of HZ.
      45             : #endif
      46             : 
      47             : /* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can
      48             :  * improve accuracy by shifting LSH bits, hence calculating:
      49             :  *     (NOM << LSH) / DEN
      50             :  * This however means trouble for large NOM, because (NOM << LSH) may no
      51             :  * longer fit in 32 bits. The following way of calculating this gives us
      52             :  * some slack, under the following conditions:
      53             :  *   - (NOM / DEN) fits in (32 - LSH) bits.
      54             :  *   - (NOM % DEN) fits in (32 - LSH) bits.
      55             :  */
      56             : #define SH_DIV(NOM,DEN,LSH) (   (((NOM) / (DEN)) << (LSH))              \
      57             :                              + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
      58             : 
      59             : /* LATCH is used in the interval timer and ftape setup. */
      60             : #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)   /* For divider */
      61             : 
      62             : extern int register_refined_jiffies(long clock_tick_rate);
      63             : 
      64             : /* TICK_USEC is the time between ticks in usec assuming SHIFTED_HZ */
      65             : #define TICK_USEC ((USEC_PER_SEC + HZ/2) / HZ)
      66             : 
      67             : /* USER_TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
      68             : #define USER_TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
      69             : 
      70             : #ifndef __jiffy_arch_data
      71             : #define __jiffy_arch_data
      72             : #endif
      73             : 
      74             : /*
      75             :  * The 64-bit value is not atomic - you MUST NOT read it
      76             :  * without sampling the sequence number in jiffies_lock.
      77             :  * get_jiffies_64() will do this for you as appropriate.
      78             :  */
      79             : extern u64 __cacheline_aligned_in_smp jiffies_64;
      80             : extern unsigned long volatile __cacheline_aligned_in_smp __jiffy_arch_data jiffies;
      81             : 
      82             : #if (BITS_PER_LONG < 64)
      83             : u64 get_jiffies_64(void);
      84             : #else
      85             : static inline u64 get_jiffies_64(void)
      86             : {
      87             :         return (u64)jiffies;
      88             : }
      89             : #endif
      90             : 
      91             : /*
      92             :  *      These inlines deal with timer wrapping correctly. You are 
      93             :  *      strongly encouraged to use them
      94             :  *      1. Because people otherwise forget
      95             :  *      2. Because if the timer wrap changes in future you won't have to
      96             :  *         alter your driver code.
      97             :  *
      98             :  * time_after(a,b) returns true if the time a is after time b.
      99             :  *
     100             :  * Do this with "<0" and ">=0" to only test the sign of the result. A
     101             :  * good compiler would generate better code (and a really good compiler
     102             :  * wouldn't care). Gcc is currently neither.
     103             :  */
     104             : #define time_after(a,b)         \
     105             :         (typecheck(unsigned long, a) && \
     106             :          typecheck(unsigned long, b) && \
     107             :          ((long)((b) - (a)) < 0))
     108             : #define time_before(a,b)        time_after(b,a)
     109             : 
     110             : #define time_after_eq(a,b)      \
     111             :         (typecheck(unsigned long, a) && \
     112             :          typecheck(unsigned long, b) && \
     113             :          ((long)((a) - (b)) >= 0))
     114             : #define time_before_eq(a,b)     time_after_eq(b,a)
     115             : 
     116             : /*
     117             :  * Calculate whether a is in the range of [b, c].
     118             :  */
     119             : #define time_in_range(a,b,c) \
     120             :         (time_after_eq(a,b) && \
     121             :          time_before_eq(a,c))
     122             : 
     123             : /*
     124             :  * Calculate whether a is in the range of [b, c).
     125             :  */
     126             : #define time_in_range_open(a,b,c) \
     127             :         (time_after_eq(a,b) && \
     128             :          time_before(a,c))
     129             : 
     130             : /* Same as above, but does so with platform independent 64bit types.
     131             :  * These must be used when utilizing jiffies_64 (i.e. return value of
     132             :  * get_jiffies_64() */
     133             : #define time_after64(a,b)       \
     134             :         (typecheck(__u64, a) && \
     135             :          typecheck(__u64, b) && \
     136             :          ((__s64)((b) - (a)) < 0))
     137             : #define time_before64(a,b)      time_after64(b,a)
     138             : 
     139             : #define time_after_eq64(a,b)    \
     140             :         (typecheck(__u64, a) && \
     141             :          typecheck(__u64, b) && \
     142             :          ((__s64)((a) - (b)) >= 0))
     143             : #define time_before_eq64(a,b)   time_after_eq64(b,a)
     144             : 
     145             : #define time_in_range64(a, b, c) \
     146             :         (time_after_eq64(a, b) && \
     147             :          time_before_eq64(a, c))
     148             : 
     149             : /*
     150             :  * These four macros compare jiffies and 'a' for convenience.
     151             :  */
     152             : 
     153             : /* time_is_before_jiffies(a) return true if a is before jiffies */
     154             : #define time_is_before_jiffies(a) time_after(jiffies, a)
     155             : #define time_is_before_jiffies64(a) time_after64(get_jiffies_64(), a)
     156             : 
     157             : /* time_is_after_jiffies(a) return true if a is after jiffies */
     158             : #define time_is_after_jiffies(a) time_before(jiffies, a)
     159             : #define time_is_after_jiffies64(a) time_before64(get_jiffies_64(), a)
     160             : 
     161             : /* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
     162             : #define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
     163             : #define time_is_before_eq_jiffies64(a) time_after_eq64(get_jiffies_64(), a)
     164             : 
     165             : /* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
     166             : #define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
     167             : #define time_is_after_eq_jiffies64(a) time_before_eq64(get_jiffies_64(), a)
     168             : 
     169             : /*
     170             :  * Have the 32 bit jiffies value wrap 5 minutes after boot
     171             :  * so jiffies wrap bugs show up earlier.
     172             :  */
     173             : #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
     174             : 
     175             : /*
     176             :  * Change timeval to jiffies, trying to avoid the
     177             :  * most obvious overflows..
     178             :  *
     179             :  * And some not so obvious.
     180             :  *
     181             :  * Note that we don't want to return LONG_MAX, because
     182             :  * for various timeout reasons we often end up having
     183             :  * to wait "jiffies+1" in order to guarantee that we wait
     184             :  * at _least_ "jiffies" - so "jiffies+1" had better still
     185             :  * be positive.
     186             :  */
     187             : #define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
     188             : 
     189             : extern unsigned long preset_lpj;
     190             : 
     191             : /*
     192             :  * We want to do realistic conversions of time so we need to use the same
     193             :  * values the update wall clock code uses as the jiffies size.  This value
     194             :  * is: TICK_NSEC (which is defined in timex.h).  This
     195             :  * is a constant and is in nanoseconds.  We will use scaled math
     196             :  * with a set of scales defined here as SEC_JIFFIE_SC,  USEC_JIFFIE_SC and
     197             :  * NSEC_JIFFIE_SC.  Note that these defines contain nothing but
     198             :  * constants and so are computed at compile time.  SHIFT_HZ (computed in
     199             :  * timex.h) adjusts the scaling for different HZ values.
     200             : 
     201             :  * Scaled math???  What is that?
     202             :  *
     203             :  * Scaled math is a way to do integer math on values that would,
     204             :  * otherwise, either overflow, underflow, or cause undesired div
     205             :  * instructions to appear in the execution path.  In short, we "scale"
     206             :  * up the operands so they take more bits (more precision, less
     207             :  * underflow), do the desired operation and then "scale" the result back
     208             :  * by the same amount.  If we do the scaling by shifting we avoid the
     209             :  * costly mpy and the dastardly div instructions.
     210             : 
     211             :  * Suppose, for example, we want to convert from seconds to jiffies
     212             :  * where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE.  The
     213             :  * simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
     214             :  * observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
     215             :  * might calculate at compile time, however, the result will only have
     216             :  * about 3-4 bits of precision (less for smaller values of HZ).
     217             :  *
     218             :  * So, we scale as follows:
     219             :  * jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
     220             :  * jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
     221             :  * Then we make SCALE a power of two so:
     222             :  * jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
     223             :  * Now we define:
     224             :  * #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
     225             :  * jiff = (sec * SEC_CONV) >> SCALE;
     226             :  *
     227             :  * Often the math we use will expand beyond 32-bits so we tell C how to
     228             :  * do this and pass the 64-bit result of the mpy through the ">> SCALE"
     229             :  * which should take the result back to 32-bits.  We want this expansion
     230             :  * to capture as much precision as possible.  At the same time we don't
     231             :  * want to overflow so we pick the SCALE to avoid this.  In this file,
     232             :  * that means using a different scale for each range of HZ values (as
     233             :  * defined in timex.h).
     234             :  *
     235             :  * For those who want to know, gcc will give a 64-bit result from a "*"
     236             :  * operator if the result is a long long AND at least one of the
     237             :  * operands is cast to long long (usually just prior to the "*" so as
     238             :  * not to confuse it into thinking it really has a 64-bit operand,
     239             :  * which, buy the way, it can do, but it takes more code and at least 2
     240             :  * mpys).
     241             : 
     242             :  * We also need to be aware that one second in nanoseconds is only a
     243             :  * couple of bits away from overflowing a 32-bit word, so we MUST use
     244             :  * 64-bits to get the full range time in nanoseconds.
     245             : 
     246             :  */
     247             : 
     248             : /*
     249             :  * Here are the scales we will use.  One for seconds, nanoseconds and
     250             :  * microseconds.
     251             :  *
     252             :  * Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
     253             :  * check if the sign bit is set.  If not, we bump the shift count by 1.
     254             :  * (Gets an extra bit of precision where we can use it.)
     255             :  * We know it is set for HZ = 1024 and HZ = 100 not for 1000.
     256             :  * Haven't tested others.
     257             : 
     258             :  * Limits of cpp (for #if expressions) only long (no long long), but
     259             :  * then we only need the most signicant bit.
     260             :  */
     261             : 
     262             : #define SEC_JIFFIE_SC (31 - SHIFT_HZ)
     263             : #if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
     264             : #undef SEC_JIFFIE_SC
     265             : #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
     266             : #endif
     267             : #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
     268             : #define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
     269             :                                 TICK_NSEC -1) / (u64)TICK_NSEC))
     270             : 
     271             : #define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
     272             :                                         TICK_NSEC -1) / (u64)TICK_NSEC))
     273             : /*
     274             :  * The maximum jiffie value is (MAX_INT >> 1).  Here we translate that
     275             :  * into seconds.  The 64-bit case will overflow if we are not careful,
     276             :  * so use the messy SH_DIV macro to do it.  Still all constants.
     277             :  */
     278             : #if BITS_PER_LONG < 64
     279             : # define MAX_SEC_IN_JIFFIES \
     280             :         (long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_SEC)
     281             : #else   /* take care of overflow on 64 bits machines */
     282             : # define MAX_SEC_IN_JIFFIES \
     283             :         (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1)
     284             : 
     285             : #endif
     286             : 
     287             : /*
     288             :  * Convert various time units to each other:
     289             :  */
     290             : extern unsigned int jiffies_to_msecs(const unsigned long j);
     291             : extern unsigned int jiffies_to_usecs(const unsigned long j);
     292             : 
     293             : static inline u64 jiffies_to_nsecs(const unsigned long j)
     294             : {
     295             :         return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
     296             : }
     297             : 
     298             : extern u64 jiffies64_to_nsecs(u64 j);
     299             : extern u64 jiffies64_to_msecs(u64 j);
     300             : 
     301             : extern unsigned long __msecs_to_jiffies(const unsigned int m);
     302             : #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
     303             : /*
     304             :  * HZ is equal to or smaller than 1000, and 1000 is a nice round
     305             :  * multiple of HZ, divide with the factor between them, but round
     306             :  * upwards:
     307             :  */
     308             : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
     309             : {
     310           0 :         return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
     311             : }
     312             : #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
     313             : /*
     314             :  * HZ is larger than 1000, and HZ is a nice round multiple of 1000 -
     315             :  * simply multiply with the factor between them.
     316             :  *
     317             :  * But first make sure the multiplication result cannot overflow:
     318             :  */
     319             : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
     320             : {
     321             :         if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
     322             :                 return MAX_JIFFY_OFFSET;
     323             :         return m * (HZ / MSEC_PER_SEC);
     324             : }
     325             : #else
     326             : /*
     327             :  * Generic case - multiply, round and divide. But first check that if
     328             :  * we are doing a net multiplication, that we wouldn't overflow:
     329             :  */
     330             : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
     331             : {
     332             :         if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
     333             :                 return MAX_JIFFY_OFFSET;
     334             : 
     335             :         return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) >> MSEC_TO_HZ_SHR32;
     336             : }
     337             : #endif
     338             : /**
     339             :  * msecs_to_jiffies: - convert milliseconds to jiffies
     340             :  * @m:  time in milliseconds
     341             :  *
     342             :  * conversion is done as follows:
     343             :  *
     344             :  * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
     345             :  *
     346             :  * - 'too large' values [that would result in larger than
     347             :  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
     348             :  *
     349             :  * - all other values are converted to jiffies by either multiplying
     350             :  *   the input value by a factor or dividing it with a factor and
     351             :  *   handling any 32-bit overflows.
     352             :  *   for the details see __msecs_to_jiffies()
     353             :  *
     354             :  * msecs_to_jiffies() checks for the passed in value being a constant
     355             :  * via __builtin_constant_p() allowing gcc to eliminate most of the
     356             :  * code, __msecs_to_jiffies() is called if the value passed does not
     357             :  * allow constant folding and the actual conversion must be done at
     358             :  * runtime.
     359             :  * the HZ range specific helpers _msecs_to_jiffies() are called both
     360             :  * directly here and from __msecs_to_jiffies() in the case where
     361             :  * constant folding is not possible.
     362             :  */
     363             : static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
     364             : {
     365  1058246702 :         if (__builtin_constant_p(m)) {
     366           0 :                 if ((int)m < 0)
     367             :                         return MAX_JIFFY_OFFSET;
     368           0 :                 return _msecs_to_jiffies(m);
     369             :         } else {
     370  1058246702 :                 return __msecs_to_jiffies(m);
     371             :         }
     372             : }
     373             : 
     374             : extern unsigned long __usecs_to_jiffies(const unsigned int u);
     375             : #if !(USEC_PER_SEC % HZ)
     376             : static inline unsigned long _usecs_to_jiffies(const unsigned int u)
     377             : {
     378             :         return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
     379             : }
     380             : #else
     381             : static inline unsigned long _usecs_to_jiffies(const unsigned int u)
     382             : {
     383             :         return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
     384             :                 >> USEC_TO_HZ_SHR32;
     385             : }
     386             : #endif
     387             : 
     388             : /**
     389             :  * usecs_to_jiffies: - convert microseconds to jiffies
     390             :  * @u:  time in microseconds
     391             :  *
     392             :  * conversion is done as follows:
     393             :  *
     394             :  * - 'too large' values [that would result in larger than
     395             :  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
     396             :  *
     397             :  * - all other values are converted to jiffies by either multiplying
     398             :  *   the input value by a factor or dividing it with a factor and
     399             :  *   handling any 32-bit overflows as for msecs_to_jiffies.
     400             :  *
     401             :  * usecs_to_jiffies() checks for the passed in value being a constant
     402             :  * via __builtin_constant_p() allowing gcc to eliminate most of the
     403             :  * code, __usecs_to_jiffies() is called if the value passed does not
     404             :  * allow constant folding and the actual conversion must be done at
     405             :  * runtime.
     406             :  * the HZ range specific helpers _usecs_to_jiffies() are called both
     407             :  * directly here and from __msecs_to_jiffies() in the case where
     408             :  * constant folding is not possible.
     409             :  */
     410             : static __always_inline unsigned long usecs_to_jiffies(const unsigned int u)
     411             : {
     412             :         if (__builtin_constant_p(u)) {
     413             :                 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
     414             :                         return MAX_JIFFY_OFFSET;
     415             :                 return _usecs_to_jiffies(u);
     416             :         } else {
     417             :                 return __usecs_to_jiffies(u);
     418             :         }
     419             : }
     420             : 
     421             : extern unsigned long timespec64_to_jiffies(const struct timespec64 *value);
     422             : extern void jiffies_to_timespec64(const unsigned long jiffies,
     423             :                                   struct timespec64 *value);
     424             : extern clock_t jiffies_to_clock_t(unsigned long x);
     425             : static inline clock_t jiffies_delta_to_clock_t(long delta)
     426             : {
     427             :         return jiffies_to_clock_t(max(0L, delta));
     428             : }
     429             : 
     430             : static inline unsigned int jiffies_delta_to_msecs(long delta)
     431             : {
     432             :         return jiffies_to_msecs(max(0L, delta));
     433             : }
     434             : 
     435             : extern unsigned long clock_t_to_jiffies(unsigned long x);
     436             : extern u64 jiffies_64_to_clock_t(u64 x);
     437             : extern u64 nsec_to_clock_t(u64 x);
     438             : extern u64 nsecs_to_jiffies64(u64 n);
     439             : extern unsigned long nsecs_to_jiffies(u64 n);
     440             : 
     441             : #define TIMESTAMP_SIZE  30
     442             : 
     443             : #endif

Generated by: LCOV version 1.14