linux/include/asm-generic/getorder.h
<<
>>
Prefs
   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 */
  12static inline __attribute_const__
  13int __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