File: /Users/paulross/dev/linux/linux-3.13/include/asm-generic/getorder.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: #ifndef __ASM_GENERIC_GETORDER_H
       2: #define __ASM_GENERIC_GETORDER_H
       3: 
       4: #ifndef __ASSEMBLY__
       5: 
       6: #include <linux/compiler.h>
       7: #include <linux/log2.h>
       8: 
       9: /*
      10:  * Runtime evaluation of get_order()
      11:  */
      12: static inline __attribute_const__
      13: int __get_order(unsigned long size)
      14: {
      15:     int order;
      16: 
      17:     size--;
      18:     size >>= PAGE_SHIFT;
      19: #if BITS_PER_LONG == 32
      20:     order = fls(size);
      21: #else
      22:     order = fls64(size);
      23: #endif
      24:     return order;
      25: }
      26: 
      27: /**
      28:  * get_order - Determine the allocation order of a memory size
      29:  * @size: The size for which to get the order
      30:  *
      31:  * Determine the allocation order of a particular sized block of memory.  This
      32:  * is on a logarithmic scale, where:
      33:  *
      34:  *    0 -> 2^0 * PAGE_SIZE and below
      35:  *    1 -> 2^1 * PAGE_SIZE to 2^0 * PAGE_SIZE + 1
      36:  *    2 -> 2^2 * PAGE_SIZE to 2^1 * PAGE_SIZE + 1
      37:  *    3 -> 2^3 * PAGE_SIZE to 2^2 * PAGE_SIZE + 1
      38:  *    4 -> 2^4 * PAGE_SIZE to 2^3 * PAGE_SIZE + 1
      39:  *    ...
      40:  *
      41:  * The order returned is used to find the smallest allocation granule required
      42:  * to hold an object of the specified size.
      43:  *
      44:  * The result is undefined if the size is 0.
      45:  *
      46:  * This function may be used to initialise variables with compile time
      47:  * evaluations of constants.
      48:  */
      49: #define get_order(n)                        \
      50: (                                \
      51:     __builtin_constant_p(n) ? (                \
      52:         ((n) == 0UL) ? BITS_PER_LONG - PAGE_SHIFT :    \
      53:         (((n) < (1UL << PAGE_SHIFT)) ? 0 :        \
      54:          ilog2((n) - 1) - PAGE_SHIFT + 1)        \
      55:     ) :                            \
      56:     __get_order(n)                        \
      57: )
      58: 
      59: #endif    /* __ASSEMBLY__ */
      60: 
      61: #endif    /* __ASM_GENERIC_GETORDER_H */
      62: