linux/include/linux/mm_inline.h
<<
>>
Prefs
   1#ifndef LINUX_MM_INLINE_H
   2#define LINUX_MM_INLINE_H
   3
   4/**
   5 * page_is_file_cache - should the page be on a file LRU or anon LRU?
   6 * @page: the page to test
   7 *
   8 * Returns 1 if @page is page cache page backed by a regular filesystem,
   9 * or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
  10 * Used by functions that manipulate the LRU lists, to sort a page
  11 * onto the right LRU list.
  12 *
  13 * We would like to get this info without a page flag, but the state
  14 * needs to survive until the page is last deleted from the LRU, which
  15 * could be as far down as __page_cache_release.
  16 */
  17static inline int page_is_file_cache(struct page *page)
  18{
  19        return !PageSwapBacked(page);
  20}
  21
  22static inline void
  23add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l)
  24{
  25        list_add(&page->lru, &zone->lru[l].list);
  26        __inc_zone_state(zone, NR_LRU_BASE + l);
  27        mem_cgroup_add_lru_list(page, l);
  28}
  29
  30static inline void
  31del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l)
  32{
  33        list_del(&page->lru);
  34        __dec_zone_state(zone, NR_LRU_BASE + l);
  35        mem_cgroup_del_lru_list(page, l);
  36}
  37
  38/**
  39 * page_lru_base_type - which LRU list type should a page be on?
  40 * @page: the page to test
  41 *
  42 * Used for LRU list index arithmetic.
  43 *
  44 * Returns the base LRU type - file or anon - @page should be on.
  45 */
  46static inline enum lru_list page_lru_base_type(struct page *page)
  47{
  48        if (page_is_file_cache(page))
  49                return LRU_INACTIVE_FILE;
  50        return LRU_INACTIVE_ANON;
  51}
  52
  53static inline void
  54del_page_from_lru(struct zone *zone, struct page *page)
  55{
  56        enum lru_list l;
  57
  58        list_del(&page->lru);
  59        if (PageUnevictable(page)) {
  60                __ClearPageUnevictable(page);
  61                l = LRU_UNEVICTABLE;
  62        } else {
  63                l = page_lru_base_type(page);
  64                if (PageActive(page)) {
  65                        __ClearPageActive(page);
  66                        l += LRU_ACTIVE;
  67                }
  68        }
  69        __dec_zone_state(zone, NR_LRU_BASE + l);
  70        mem_cgroup_del_lru_list(page, l);
  71}
  72
  73/**
  74 * page_lru - which LRU list should a page be on?
  75 * @page: the page to test
  76 *
  77 * Returns the LRU list a page should be on, as an index
  78 * into the array of LRU lists.
  79 */
  80static inline enum lru_list page_lru(struct page *page)
  81{
  82        enum lru_list lru;
  83
  84        if (PageUnevictable(page))
  85                lru = LRU_UNEVICTABLE;
  86        else {
  87                lru = page_lru_base_type(page);
  88                if (PageActive(page))
  89                        lru += LRU_ACTIVE;
  90        }
  91
  92        return lru;
  93}
  94
  95#endif
  96