diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index a8bf4ab01f86..254ce2b90158 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
10 | #include <linux/sysctl.h> | 10 | #include <linux/sysctl.h> |
11 | #include <linux/highmem.h> | 11 | #include <linux/highmem.h> |
12 | #include <linux/mmu_notifier.h> | ||
12 | #include <linux/nodemask.h> | 13 | #include <linux/nodemask.h> |
13 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
14 | #include <linux/mempolicy.h> | 15 | #include <linux/mempolicy.h> |
@@ -19,6 +20,7 @@ | |||
19 | 20 | ||
20 | #include <asm/page.h> | 21 | #include <asm/page.h> |
21 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
23 | #include <asm/io.h> | ||
22 | 24 | ||
23 | #include <linux/hugetlb.h> | 25 | #include <linux/hugetlb.h> |
24 | #include "internal.h" | 26 | #include "internal.h" |
@@ -1026,18 +1028,6 @@ static void __init report_hugepages(void) | |||
1026 | } | 1028 | } |
1027 | } | 1029 | } |
1028 | 1030 | ||
1029 | static unsigned int cpuset_mems_nr(unsigned int *array) | ||
1030 | { | ||
1031 | int node; | ||
1032 | unsigned int nr = 0; | ||
1033 | |||
1034 | for_each_node_mask(node, cpuset_current_mems_allowed) | ||
1035 | nr += array[node]; | ||
1036 | |||
1037 | return nr; | ||
1038 | } | ||
1039 | |||
1040 | #ifdef CONFIG_SYSCTL | ||
1041 | #ifdef CONFIG_HIGHMEM | 1031 | #ifdef CONFIG_HIGHMEM |
1042 | static void try_to_free_low(struct hstate *h, unsigned long count) | 1032 | static void try_to_free_low(struct hstate *h, unsigned long count) |
1043 | { | 1033 | { |
@@ -1386,6 +1376,18 @@ static int __init hugetlb_default_setup(char *s) | |||
1386 | } | 1376 | } |
1387 | __setup("default_hugepagesz=", hugetlb_default_setup); | 1377 | __setup("default_hugepagesz=", hugetlb_default_setup); |
1388 | 1378 | ||
1379 | static unsigned int cpuset_mems_nr(unsigned int *array) | ||
1380 | { | ||
1381 | int node; | ||
1382 | unsigned int nr = 0; | ||
1383 | |||
1384 | for_each_node_mask(node, cpuset_current_mems_allowed) | ||
1385 | nr += array[node]; | ||
1386 | |||
1387 | return nr; | ||
1388 | } | ||
1389 | |||
1390 | #ifdef CONFIG_SYSCTL | ||
1389 | int hugetlb_sysctl_handler(struct ctl_table *table, int write, | 1391 | int hugetlb_sysctl_handler(struct ctl_table *table, int write, |
1390 | struct file *file, void __user *buffer, | 1392 | struct file *file, void __user *buffer, |
1391 | size_t *length, loff_t *ppos) | 1393 | size_t *length, loff_t *ppos) |
@@ -1672,6 +1674,7 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
1672 | BUG_ON(start & ~huge_page_mask(h)); | 1674 | BUG_ON(start & ~huge_page_mask(h)); |
1673 | BUG_ON(end & ~huge_page_mask(h)); | 1675 | BUG_ON(end & ~huge_page_mask(h)); |
1674 | 1676 | ||
1677 | mmu_notifier_invalidate_range_start(mm, start, end); | ||
1675 | spin_lock(&mm->page_table_lock); | 1678 | spin_lock(&mm->page_table_lock); |
1676 | for (address = start; address < end; address += sz) { | 1679 | for (address = start; address < end; address += sz) { |
1677 | ptep = huge_pte_offset(mm, address); | 1680 | ptep = huge_pte_offset(mm, address); |
@@ -1713,6 +1716,7 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
1713 | } | 1716 | } |
1714 | spin_unlock(&mm->page_table_lock); | 1717 | spin_unlock(&mm->page_table_lock); |
1715 | flush_tlb_range(vma, start, end); | 1718 | flush_tlb_range(vma, start, end); |
1719 | mmu_notifier_invalidate_range_end(mm, start, end); | ||
1716 | list_for_each_entry_safe(page, tmp, &page_list, lru) { | 1720 | list_for_each_entry_safe(page, tmp, &page_list, lru) { |
1717 | list_del(&page->lru); | 1721 | list_del(&page->lru); |
1718 | put_page(page); | 1722 | put_page(page); |