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