diff options
Diffstat (limited to 'include/linux/mm.h')
| -rw-r--r-- | include/linux/mm.h | 132 |
1 files changed, 125 insertions, 7 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 8b2fa8593c61..462acaf36f3a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/prio_tree.h> | 12 | #include <linux/prio_tree.h> |
| 13 | #include <linux/debug_locks.h> | 13 | #include <linux/debug_locks.h> |
| 14 | #include <linux/mm_types.h> | 14 | #include <linux/mm_types.h> |
| 15 | #include <linux/range.h> | ||
| 15 | 16 | ||
| 16 | struct mempolicy; | 17 | struct mempolicy; |
| 17 | struct anon_vma; | 18 | struct anon_vma; |
| @@ -782,8 +783,8 @@ struct mm_walk { | |||
| 782 | int (*pmd_entry)(pmd_t *, unsigned long, unsigned long, struct mm_walk *); | 783 | int (*pmd_entry)(pmd_t *, unsigned long, unsigned long, struct mm_walk *); |
| 783 | int (*pte_entry)(pte_t *, unsigned long, unsigned long, struct mm_walk *); | 784 | int (*pte_entry)(pte_t *, unsigned long, unsigned long, struct mm_walk *); |
| 784 | int (*pte_hole)(unsigned long, unsigned long, struct mm_walk *); | 785 | int (*pte_hole)(unsigned long, unsigned long, struct mm_walk *); |
| 785 | int (*hugetlb_entry)(pte_t *, unsigned long, unsigned long, | 786 | int (*hugetlb_entry)(pte_t *, unsigned long, |
| 786 | struct mm_walk *); | 787 | unsigned long, unsigned long, struct mm_walk *); |
| 787 | struct mm_struct *mm; | 788 | struct mm_struct *mm; |
| 788 | void *private; | 789 | void *private; |
| 789 | }; | 790 | }; |
| @@ -869,6 +870,114 @@ extern int mprotect_fixup(struct vm_area_struct *vma, | |||
| 869 | */ | 870 | */ |
| 870 | int __get_user_pages_fast(unsigned long start, int nr_pages, int write, | 871 | int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
| 871 | struct page **pages); | 872 | struct page **pages); |
| 873 | /* | ||
| 874 | * per-process(per-mm_struct) statistics. | ||
| 875 | */ | ||
| 876 | #if defined(SPLIT_RSS_COUNTING) | ||
| 877 | /* | ||
| 878 | * The mm counters are not protected by its page_table_lock, | ||
| 879 | * so must be incremented atomically. | ||
| 880 | */ | ||
| 881 | static inline void set_mm_counter(struct mm_struct *mm, int member, long value) | ||
| 882 | { | ||
| 883 | atomic_long_set(&mm->rss_stat.count[member], value); | ||
| 884 | } | ||
| 885 | |||
| 886 | unsigned long get_mm_counter(struct mm_struct *mm, int member); | ||
| 887 | |||
| 888 | static inline void add_mm_counter(struct mm_struct *mm, int member, long value) | ||
| 889 | { | ||
| 890 | atomic_long_add(value, &mm->rss_stat.count[member]); | ||
| 891 | } | ||
| 892 | |||
| 893 | static inline void inc_mm_counter(struct mm_struct *mm, int member) | ||
| 894 | { | ||
| 895 | atomic_long_inc(&mm->rss_stat.count[member]); | ||
| 896 | } | ||
| 897 | |||
| 898 | static inline void dec_mm_counter(struct mm_struct *mm, int member) | ||
| 899 | { | ||
| 900 | atomic_long_dec(&mm->rss_stat.count[member]); | ||
| 901 | } | ||
| 902 | |||
| 903 | #else /* !USE_SPLIT_PTLOCKS */ | ||
| 904 | /* | ||
| 905 | * The mm counters are protected by its page_table_lock, | ||
| 906 | * so can be incremented directly. | ||
| 907 | */ | ||
| 908 | static inline void set_mm_counter(struct mm_struct *mm, int member, long value) | ||
| 909 | { | ||
| 910 | mm->rss_stat.count[member] = value; | ||
| 911 | } | ||
| 912 | |||
| 913 | static inline unsigned long get_mm_counter(struct mm_struct *mm, int member) | ||
| 914 | { | ||
| 915 | return mm->rss_stat.count[member]; | ||
| 916 | } | ||
| 917 | |||
| 918 | static inline void add_mm_counter(struct mm_struct *mm, int member, long value) | ||
| 919 | { | ||
| 920 | mm->rss_stat.count[member] += value; | ||
| 921 | } | ||
| 922 | |||
| 923 | static inline void inc_mm_counter(struct mm_struct *mm, int member) | ||
| 924 | { | ||
| 925 | mm->rss_stat.count[member]++; | ||
| 926 | } | ||
| 927 | |||
| 928 | static inline void dec_mm_counter(struct mm_struct *mm, int member) | ||
| 929 | { | ||
| 930 | mm->rss_stat.count[member]--; | ||
| 931 | } | ||
| 932 | |||
| 933 | #endif /* !USE_SPLIT_PTLOCKS */ | ||
| 934 | |||
| 935 | static inline unsigned long get_mm_rss(struct mm_struct *mm) | ||
| 936 | { | ||
| 937 | return get_mm_counter(mm, MM_FILEPAGES) + | ||
| 938 | get_mm_counter(mm, MM_ANONPAGES); | ||
| 939 | } | ||
| 940 | |||
| 941 | static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm) | ||
| 942 | { | ||
| 943 | return max(mm->hiwater_rss, get_mm_rss(mm)); | ||
| 944 | } | ||
| 945 | |||
| 946 | static inline unsigned long get_mm_hiwater_vm(struct mm_struct *mm) | ||
| 947 | { | ||
| 948 | return max(mm->hiwater_vm, mm->total_vm); | ||
| 949 | } | ||
| 950 | |||
| 951 | static inline void update_hiwater_rss(struct mm_struct *mm) | ||
| 952 | { | ||
| 953 | unsigned long _rss = get_mm_rss(mm); | ||
| 954 | |||
| 955 | if ((mm)->hiwater_rss < _rss) | ||
| 956 | (mm)->hiwater_rss = _rss; | ||
| 957 | } | ||
| 958 | |||
| 959 | static inline void update_hiwater_vm(struct mm_struct *mm) | ||
| 960 | { | ||
| 961 | if (mm->hiwater_vm < mm->total_vm) | ||
| 962 | mm->hiwater_vm = mm->total_vm; | ||
| 963 | } | ||
| 964 | |||
| 965 | static inline void setmax_mm_hiwater_rss(unsigned long *maxrss, | ||
| 966 | struct mm_struct *mm) | ||
| 967 | { | ||
| 968 | unsigned long hiwater_rss = get_mm_hiwater_rss(mm); | ||
| 969 | |||
| 970 | if (*maxrss < hiwater_rss) | ||
| 971 | *maxrss = hiwater_rss; | ||
| 972 | } | ||
| 973 | |||
| 974 | #if defined(SPLIT_RSS_COUNTING) | ||
| 975 | void sync_mm_rss(struct task_struct *task, struct mm_struct *mm); | ||
| 976 | #else | ||
| 977 | static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm) | ||
| 978 | { | ||
| 979 | } | ||
| 980 | #endif | ||
| 872 | 981 | ||
| 873 | /* | 982 | /* |
| 874 | * A callback you can register to apply pressure to ageable caches. | 983 | * A callback you can register to apply pressure to ageable caches. |
| @@ -1049,6 +1158,10 @@ extern void get_pfn_range_for_nid(unsigned int nid, | |||
| 1049 | extern unsigned long find_min_pfn_with_active_regions(void); | 1158 | extern unsigned long find_min_pfn_with_active_regions(void); |
| 1050 | extern void free_bootmem_with_active_regions(int nid, | 1159 | extern void free_bootmem_with_active_regions(int nid, |
| 1051 | unsigned long max_low_pfn); | 1160 | unsigned long max_low_pfn); |
| 1161 | int add_from_early_node_map(struct range *range, int az, | ||
| 1162 | int nr_range, int nid); | ||
| 1163 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, | ||
| 1164 | u64 goal, u64 limit); | ||
| 1052 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); | 1165 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); |
| 1053 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); | 1166 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); |
| 1054 | extern void sparse_memory_present_with_active_regions(int nid); | 1167 | extern void sparse_memory_present_with_active_regions(int nid); |
| @@ -1081,11 +1194,7 @@ extern void si_meminfo(struct sysinfo * val); | |||
| 1081 | extern void si_meminfo_node(struct sysinfo *val, int nid); | 1194 | extern void si_meminfo_node(struct sysinfo *val, int nid); |
| 1082 | extern int after_bootmem; | 1195 | extern int after_bootmem; |
| 1083 | 1196 | ||
| 1084 | #ifdef CONFIG_NUMA | ||
| 1085 | extern void setup_per_cpu_pageset(void); | 1197 | extern void setup_per_cpu_pageset(void); |
| 1086 | #else | ||
| 1087 | static inline void setup_per_cpu_pageset(void) {} | ||
| 1088 | #endif | ||
| 1089 | 1198 | ||
| 1090 | extern void zone_pcp_update(struct zone *zone); | 1199 | extern void zone_pcp_update(struct zone *zone); |
| 1091 | 1200 | ||
| @@ -1113,7 +1222,7 @@ static inline void vma_nonlinear_insert(struct vm_area_struct *vma, | |||
| 1113 | 1222 | ||
| 1114 | /* mmap.c */ | 1223 | /* mmap.c */ |
| 1115 | extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin); | 1224 | extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin); |
| 1116 | extern void vma_adjust(struct vm_area_struct *vma, unsigned long start, | 1225 | extern int vma_adjust(struct vm_area_struct *vma, unsigned long start, |
| 1117 | unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); | 1226 | unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); |
| 1118 | extern struct vm_area_struct *vma_merge(struct mm_struct *, | 1227 | extern struct vm_area_struct *vma_merge(struct mm_struct *, |
| 1119 | struct vm_area_struct *prev, unsigned long addr, unsigned long end, | 1228 | struct vm_area_struct *prev, unsigned long addr, unsigned long end, |
| @@ -1321,12 +1430,19 @@ extern int randomize_va_space; | |||
| 1321 | const char * arch_vma_name(struct vm_area_struct *vma); | 1430 | const char * arch_vma_name(struct vm_area_struct *vma); |
| 1322 | void print_vma_addr(char *prefix, unsigned long rip); | 1431 | void print_vma_addr(char *prefix, unsigned long rip); |
| 1323 | 1432 | ||
| 1433 | void sparse_mem_maps_populate_node(struct page **map_map, | ||
| 1434 | unsigned long pnum_begin, | ||
| 1435 | unsigned long pnum_end, | ||
| 1436 | unsigned long map_count, | ||
| 1437 | int nodeid); | ||
| 1438 | |||
| 1324 | struct page *sparse_mem_map_populate(unsigned long pnum, int nid); | 1439 | struct page *sparse_mem_map_populate(unsigned long pnum, int nid); |
| 1325 | pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); | 1440 | pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); |
| 1326 | pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node); | 1441 | pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node); |
| 1327 | pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node); | 1442 | pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node); |
| 1328 | pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node); | 1443 | pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node); |
| 1329 | void *vmemmap_alloc_block(unsigned long size, int node); | 1444 | void *vmemmap_alloc_block(unsigned long size, int node); |
| 1445 | void *vmemmap_alloc_block_buf(unsigned long size, int node); | ||
| 1330 | void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); | 1446 | void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); |
| 1331 | int vmemmap_populate_basepages(struct page *start_page, | 1447 | int vmemmap_populate_basepages(struct page *start_page, |
| 1332 | unsigned long pages, int node); | 1448 | unsigned long pages, int node); |
| @@ -1349,5 +1465,7 @@ extern void shake_page(struct page *p, int access); | |||
| 1349 | extern atomic_long_t mce_bad_pages; | 1465 | extern atomic_long_t mce_bad_pages; |
| 1350 | extern int soft_offline_page(struct page *page, int flags); | 1466 | extern int soft_offline_page(struct page *page, int flags); |
| 1351 | 1467 | ||
| 1468 | extern void dump_page(struct page *page); | ||
| 1469 | |||
| 1352 | #endif /* __KERNEL__ */ | 1470 | #endif /* __KERNEL__ */ |
| 1353 | #endif /* _LINUX_MM_H */ | 1471 | #endif /* _LINUX_MM_H */ |
