linux/include/linux/pageblock-flags.h
<<
>>
Prefs
   1/*
   2 * Macros for manipulating and testing flags related to a
   3 * pageblock_nr_pages number of pages.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation version 2 of the License
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17 *
  18 * Copyright (C) IBM Corporation, 2006
  19 *
  20 * Original author, Mel Gorman
  21 * Major cleanups and reduction of bit operations, Andy Whitcroft
  22 */
  23#ifndef PAGEBLOCK_FLAGS_H
  24#define PAGEBLOCK_FLAGS_H
  25
  26#include <linux/types.h>
  27
  28/* Bit indices that affect a whole block of pages */
  29enum pageblock_bits {
  30        PB_migrate,
  31        PB_migrate_end = PB_migrate + 3 - 1,
  32                        /* 3 bits required for migrate types */
  33        PB_migrate_skip,/* If set the block is skipped by compaction */
  34
  35        /*
  36         * Assume the bits will always align on a word. If this assumption
  37         * changes then get/set pageblock needs updating.
  38         */
  39        NR_PAGEBLOCK_BITS
  40};
  41
  42#ifdef CONFIG_HUGETLB_PAGE
  43
  44#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
  45
  46/* Huge page sizes are variable */
  47extern unsigned int pageblock_order;
  48
  49#else /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
  50
  51/* Huge pages are a constant size */
  52#define pageblock_order         HUGETLB_PAGE_ORDER
  53
  54#endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
  55
  56#else /* CONFIG_HUGETLB_PAGE */
  57
  58/* If huge pages are not used, group by MAX_ORDER_NR_PAGES */
  59#define pageblock_order         (MAX_ORDER-1)
  60
  61#endif /* CONFIG_HUGETLB_PAGE */
  62
  63#define pageblock_nr_pages      (1UL << pageblock_order)
  64
  65/* Forward declaration */
  66struct page;
  67
  68unsigned long get_pfnblock_flags_mask(struct page *page,
  69                                unsigned long pfn,
  70                                unsigned long end_bitidx,
  71                                unsigned long mask);
  72
  73void set_pfnblock_flags_mask(struct page *page,
  74                                unsigned long flags,
  75                                unsigned long pfn,
  76                                unsigned long end_bitidx,
  77                                unsigned long mask);
  78
  79/* Declarations for getting and setting flags. See mm/page_alloc.c */
  80#define get_pageblock_flags_group(page, start_bitidx, end_bitidx) \
  81        get_pfnblock_flags_mask(page, page_to_pfn(page),                \
  82                        end_bitidx,                                     \
  83                        (1 << (end_bitidx - start_bitidx + 1)) - 1)
  84#define set_pageblock_flags_group(page, flags, start_bitidx, end_bitidx) \
  85        set_pfnblock_flags_mask(page, flags, page_to_pfn(page),         \
  86                        end_bitidx,                                     \
  87                        (1 << (end_bitidx - start_bitidx + 1)) - 1)
  88
  89#ifdef CONFIG_COMPACTION
  90#define get_pageblock_skip(page) \
  91                        get_pageblock_flags_group(page, PB_migrate_skip,     \
  92                                                        PB_migrate_skip)
  93#define clear_pageblock_skip(page) \
  94                        set_pageblock_flags_group(page, 0, PB_migrate_skip,  \
  95                                                        PB_migrate_skip)
  96#define set_pageblock_skip(page) \
  97                        set_pageblock_flags_group(page, 1, PB_migrate_skip,  \
  98                                                        PB_migrate_skip)
  99#endif /* CONFIG_COMPACTION */
 100
 101#endif  /* PAGEBLOCK_FLAGS_H */
 102