The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/mm/internal.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* internal.h: mm/ internal definitions
    2  *
    3  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
    4  * Written by David Howells (dhowells@redhat.com)
    5  *
    6  * This program is free software; you can redistribute it and/or
    7  * modify it under the terms of the GNU General Public License
    8  * as published by the Free Software Foundation; either version
    9  * 2 of the License, or (at your option) any later version.
   10  */
   11 #ifndef __MM_INTERNAL_H
   12 #define __MM_INTERNAL_H
   13 
   14 #include <linux/mm.h>
   15 
   16 void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
   17                 unsigned long floor, unsigned long ceiling);
   18 
   19 static inline void set_page_count(struct page *page, int v)
   20 {
   21         atomic_set(&page->_count, v);
   22 }
   23 
   24 /*
   25  * Turn a non-refcounted page (->_count == 0) into refcounted with
   26  * a count of one.
   27  */
   28 static inline void set_page_refcounted(struct page *page)
   29 {
   30         VM_BUG_ON(PageTail(page));
   31         VM_BUG_ON(atomic_read(&page->_count));
   32         set_page_count(page, 1);
   33 }
   34 
   35 static inline void __put_page(struct page *page)
   36 {
   37         atomic_dec(&page->_count);
   38 }
   39 
   40 static inline void __get_page_tail_foll(struct page *page,
   41                                         bool get_page_head)
   42 {
   43         /*
   44          * If we're getting a tail page, the elevated page->_count is
   45          * required only in the head page and we will elevate the head
   46          * page->_count and tail page->_mapcount.
   47          *
   48          * We elevate page_tail->_mapcount for tail pages to force
   49          * page_tail->_count to be zero at all times to avoid getting
   50          * false positives from get_page_unless_zero() with
   51          * speculative page access (like in
   52          * page_cache_get_speculative()) on tail pages.
   53          */
   54         VM_BUG_ON(atomic_read(&page->first_page->_count) <= 0);
   55         VM_BUG_ON(atomic_read(&page->_count) != 0);
   56         VM_BUG_ON(page_mapcount(page) < 0);
   57         if (get_page_head)
   58                 atomic_inc(&page->first_page->_count);
   59         atomic_inc(&page->_mapcount);
   60 }
   61 
   62 /*
   63  * This is meant to be called as the FOLL_GET operation of
   64  * follow_page() and it must be called while holding the proper PT
   65  * lock while the pte (or pmd_trans_huge) is still mapping the page.
   66  */
   67 static inline void get_page_foll(struct page *page)
   68 {
   69         if (unlikely(PageTail(page)))
   70                 /*
   71                  * This is safe only because
   72                  * __split_huge_page_refcount() can't run under
   73                  * get_page_foll() because we hold the proper PT lock.
   74                  */
   75                 __get_page_tail_foll(page, true);
   76         else {
   77                 /*
   78                  * Getting a normal page or the head of a compound page
   79                  * requires to already have an elevated page->_count.
   80                  */
   81                 VM_BUG_ON(atomic_read(&page->_count) <= 0);
   82                 atomic_inc(&page->_count);
   83         }
   84 }
   85 
   86 extern unsigned long highest_memmap_pfn;
   87 
   88 /*
   89  * in mm/vmscan.c:
   90  */
   91 extern int isolate_lru_page(struct page *page);
   92 extern void putback_lru_page(struct page *page);
   93 
   94 /*
   95  * in mm/rmap.c:
   96  */
   97 extern pmd_t *mm_find_pmd(struct mm_struct *mm, unsigned long address);
   98 
   99 /*
  100  * in mm/page_alloc.c
  101  */
  102 extern void __free_pages_bootmem(struct page *page, unsigned int order);
  103 extern void prep_compound_page(struct page *page, unsigned long order);
  104 #ifdef CONFIG_MEMORY_FAILURE
  105 extern bool is_free_buddy_page(struct page *page);
  106 #endif
  107 
  108 #if defined CONFIG_COMPACTION || defined CONFIG_CMA
  109 
  110 /*
  111  * in mm/compaction.c
  112  */
  113 /*
  114  * compact_control is used to track pages being migrated and the free pages
  115  * they are being migrated to during memory compaction. The free_pfn starts
  116  * at the end of a zone and migrate_pfn begins at the start. Movable pages
  117  * are moved to the end of a zone during a compaction run and the run
  118  * completes when free_pfn <= migrate_pfn
  119  */
  120 struct compact_control {
  121         struct list_head freepages;     /* List of free pages to migrate to */
  122         struct list_head migratepages;  /* List of pages being migrated */
  123         unsigned long nr_freepages;     /* Number of isolated free pages */
  124         unsigned long nr_migratepages;  /* Number of pages to migrate */
  125         unsigned long free_pfn;         /* isolate_freepages search base */
  126         unsigned long migrate_pfn;      /* isolate_migratepages search base */
  127         bool sync;                      /* Synchronous migration */
  128         bool ignore_skip_hint;          /* Scan blocks even if marked skip */
  129         bool finished_update_free;      /* True when the zone cached pfns are
  130                                          * no longer being updated
  131                                          */
  132         bool finished_update_migrate;
  133 
  134         int order;                      /* order a direct compactor needs */
  135         int migratetype;                /* MOVABLE, RECLAIMABLE etc */
  136         struct zone *zone;
  137         bool contended;                 /* True if a lock was contended */
  138 };
  139 
  140 unsigned long
  141 isolate_freepages_range(struct compact_control *cc,
  142                         unsigned long start_pfn, unsigned long end_pfn);
  143 unsigned long
  144 isolate_migratepages_range(struct zone *zone, struct compact_control *cc,
  145         unsigned long low_pfn, unsigned long end_pfn, bool unevictable);
  146 
  147 #endif
  148 
  149 /*
  150  * function for dealing with page's order in buddy system.
  151  * zone->lock is already acquired when we use these.
  152  * So, we don't need atomic page->flags operations here.
  153  */
  154 static inline unsigned long page_order(struct page *page)
  155 {
  156         /* PageBuddy() must be checked by the caller */
  157         return page_private(page);
  158 }
  159 
  160 /* mm/util.c */
  161 void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
  162                 struct vm_area_struct *prev, struct rb_node *rb_parent);
  163 
  164 #ifdef CONFIG_MMU
  165 extern long mlock_vma_pages_range(struct vm_area_struct *vma,
  166                         unsigned long start, unsigned long end);
  167 extern void munlock_vma_pages_range(struct vm_area_struct *vma,
  168                         unsigned long start, unsigned long end);
  169 static inline void munlock_vma_pages_all(struct vm_area_struct *vma)
  170 {
  171         munlock_vma_pages_range(vma, vma->vm_start, vma->vm_end);
  172 }
  173 
  174 /*
  175  * Called only in fault path, to determine if a new page is being
  176  * mapped into a LOCKED vma.  If it is, mark page as mlocked.
  177  */
  178 static inline int mlocked_vma_newpage(struct vm_area_struct *vma,
  179                                     struct page *page)
  180 {
  181         VM_BUG_ON(PageLRU(page));
  182 
  183         if (likely((vma->vm_flags & (VM_LOCKED | VM_SPECIAL)) != VM_LOCKED))
  184                 return 0;
  185 
  186         if (!TestSetPageMlocked(page)) {
  187                 mod_zone_page_state(page_zone(page), NR_MLOCK,
  188                                     hpage_nr_pages(page));
  189                 count_vm_event(UNEVICTABLE_PGMLOCKED);
  190         }
  191         return 1;
  192 }
  193 
  194 /*
  195  * must be called with vma's mmap_sem held for read or write, and page locked.
  196  */
  197 extern void mlock_vma_page(struct page *page);
  198 extern void munlock_vma_page(struct page *page);
  199 
  200 /*
  201  * Clear the page's PageMlocked().  This can be useful in a situation where
  202  * we want to unconditionally remove a page from the pagecache -- e.g.,
  203  * on truncation or freeing.
  204  *
  205  * It is legal to call this function for any page, mlocked or not.
  206  * If called for a page that is still mapped by mlocked vmas, all we do
  207  * is revert to lazy LRU behaviour -- semantics are not broken.
  208  */
  209 extern void clear_page_mlock(struct page *page);
  210 
  211 /*
  212  * mlock_migrate_page - called only from migrate_page_copy() to
  213  * migrate the Mlocked page flag; update statistics.
  214  */
  215 static inline void mlock_migrate_page(struct page *newpage, struct page *page)
  216 {
  217         if (TestClearPageMlocked(page)) {
  218                 unsigned long flags;
  219                 int nr_pages = hpage_nr_pages(page);
  220 
  221                 local_irq_save(flags);
  222                 __mod_zone_page_state(page_zone(page), NR_MLOCK, -nr_pages);
  223                 SetPageMlocked(newpage);
  224                 __mod_zone_page_state(page_zone(newpage), NR_MLOCK, nr_pages);
  225                 local_irq_restore(flags);
  226         }
  227 }
  228 
  229 extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma);
  230 
  231 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  232 extern unsigned long vma_address(struct page *page,
  233                                  struct vm_area_struct *vma);
  234 #endif
  235 #else /* !CONFIG_MMU */
  236 static inline int mlocked_vma_newpage(struct vm_area_struct *v, struct page *p)
  237 {
  238         return 0;
  239 }
  240 static inline void clear_page_mlock(struct page *page) { }
  241 static inline void mlock_vma_page(struct page *page) { }
  242 static inline void mlock_migrate_page(struct page *new, struct page *old) { }
  243 
  244 #endif /* !CONFIG_MMU */
  245 
  246 /*
  247  * Return the mem_map entry representing the 'offset' subpage within
  248  * the maximally aligned gigantic page 'base'.  Handle any discontiguity
  249  * in the mem_map at MAX_ORDER_NR_PAGES boundaries.
  250  */
  251 static inline struct page *mem_map_offset(struct page *base, int offset)
  252 {
  253         if (unlikely(offset >= MAX_ORDER_NR_PAGES))
  254                 return pfn_to_page(page_to_pfn(base) + offset);
  255         return base + offset;
  256 }
  257 
  258 /*
  259  * Iterator over all subpages within the maximally aligned gigantic
  260  * page 'base'.  Handle any discontiguity in the mem_map.
  261  */
  262 static inline struct page *mem_map_next(struct page *iter,
  263                                                 struct page *base, int offset)
  264 {
  265         if (unlikely((offset & (MAX_ORDER_NR_PAGES - 1)) == 0)) {
  266                 unsigned long pfn = page_to_pfn(base) + offset;
  267                 if (!pfn_valid(pfn))
  268                         return NULL;
  269                 return pfn_to_page(pfn);
  270         }
  271         return iter + 1;
  272 }
  273 
  274 /*
  275  * FLATMEM and DISCONTIGMEM configurations use alloc_bootmem_node,
  276  * so all functions starting at paging_init should be marked __init
  277  * in those cases. SPARSEMEM, however, allows for memory hotplug,
  278  * and alloc_bootmem_node is not used.
  279  */
  280 #ifdef CONFIG_SPARSEMEM
  281 #define __paginginit __meminit
  282 #else
  283 #define __paginginit __init
  284 #endif
  285 
  286 /* Memory initialisation debug and verification */
  287 enum mminit_level {
  288         MMINIT_WARNING,
  289         MMINIT_VERIFY,
  290         MMINIT_TRACE
  291 };
  292 
  293 #ifdef CONFIG_DEBUG_MEMORY_INIT
  294 
  295 extern int mminit_loglevel;
  296 
  297 #define mminit_dprintk(level, prefix, fmt, arg...) \
  298 do { \
  299         if (level < mminit_loglevel) { \
  300                 printk(level <= MMINIT_WARNING ? KERN_WARNING : KERN_DEBUG); \
  301                 printk(KERN_CONT "mminit::" prefix " " fmt, ##arg); \
  302         } \
  303 } while (0)
  304 
  305 extern void mminit_verify_pageflags_layout(void);
  306 extern void mminit_verify_page_links(struct page *page,
  307                 enum zone_type zone, unsigned long nid, unsigned long pfn);
  308 extern void mminit_verify_zonelist(void);
  309 
  310 #else
  311 
  312 static inline void mminit_dprintk(enum mminit_level level,
  313                                 const char *prefix, const char *fmt, ...)
  314 {
  315 }
  316 
  317 static inline void mminit_verify_pageflags_layout(void)
  318 {
  319 }
  320 
  321 static inline void mminit_verify_page_links(struct page *page,
  322                 enum zone_type zone, unsigned long nid, unsigned long pfn)
  323 {
  324 }
  325 
  326 static inline void mminit_verify_zonelist(void)
  327 {
  328 }
  329 #endif /* CONFIG_DEBUG_MEMORY_INIT */
  330 
  331 /* mminit_validate_memmodel_limits is independent of CONFIG_DEBUG_MEMORY_INIT */
  332 #if defined(CONFIG_SPARSEMEM)
  333 extern void mminit_validate_memmodel_limits(unsigned long *start_pfn,
  334                                 unsigned long *end_pfn);
  335 #else
  336 static inline void mminit_validate_memmodel_limits(unsigned long *start_pfn,
  337                                 unsigned long *end_pfn)
  338 {
  339 }
  340 #endif /* CONFIG_SPARSEMEM */
  341 
  342 #define ZONE_RECLAIM_NOSCAN     -2
  343 #define ZONE_RECLAIM_FULL       -1
  344 #define ZONE_RECLAIM_SOME       0
  345 #define ZONE_RECLAIM_SUCCESS    1
  346 
  347 extern int hwpoison_filter(struct page *p);
  348 
  349 extern u32 hwpoison_filter_dev_major;
  350 extern u32 hwpoison_filter_dev_minor;
  351 extern u64 hwpoison_filter_flags_mask;
  352 extern u64 hwpoison_filter_flags_value;
  353 extern u64 hwpoison_filter_memcg;
  354 extern u32 hwpoison_filter_enable;
  355 
  356 extern unsigned long vm_mmap_pgoff(struct file *, unsigned long,
  357         unsigned long, unsigned long,
  358         unsigned long, unsigned long);
  359 
  360 extern void set_pageblock_order(void);
  361 unsigned long reclaim_clean_pages_from_list(struct zone *zone,
  362                                             struct list_head *page_list);
  363 /* The ALLOC_WMARK bits are used as an index to zone->watermark */
  364 #define ALLOC_WMARK_MIN         WMARK_MIN
  365 #define ALLOC_WMARK_LOW         WMARK_LOW
  366 #define ALLOC_WMARK_HIGH        WMARK_HIGH
  367 #define ALLOC_NO_WATERMARKS     0x04 /* don't check watermarks at all */
  368 
  369 /* Mask to get the watermark bits */
  370 #define ALLOC_WMARK_MASK        (ALLOC_NO_WATERMARKS-1)
  371 
  372 #define ALLOC_HARDER            0x10 /* try to alloc harder */
  373 #define ALLOC_HIGH              0x20 /* __GFP_HIGH set */
  374 #define ALLOC_CPUSET            0x40 /* check for correct cpuset */
  375 #define ALLOC_CMA               0x80 /* allow allocations from CMA areas */
  376 
  377 #endif  /* __MM_INTERNAL_H */

Cache object: b012ad2b15d9453a0f687fff4e393656


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.