|
@@ -92,6 +92,21 @@ static struct page *dequeue_huge_page(struct vm_area_struct *vma,
|
|
|
return page;
|
|
|
}
|
|
|
|
|
|
+static void update_and_free_page(struct page *page)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ nr_huge_pages--;
|
|
|
+ nr_huge_pages_node[page_to_nid(page)]--;
|
|
|
+ for (i = 0; i < (HPAGE_SIZE / PAGE_SIZE); i++) {
|
|
|
+ page[i].flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
|
|
|
+ 1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
|
|
|
+ 1 << PG_private | 1<< PG_writeback);
|
|
|
+ }
|
|
|
+ set_compound_page_dtor(page, NULL);
|
|
|
+ set_page_refcounted(page);
|
|
|
+ __free_pages(page, HUGETLB_PAGE_ORDER);
|
|
|
+}
|
|
|
+
|
|
|
static void free_huge_page(struct page *page)
|
|
|
{
|
|
|
BUG_ON(page_count(page));
|
|
@@ -201,21 +216,6 @@ static unsigned int cpuset_mems_nr(unsigned int *array)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
|
-static void update_and_free_page(struct page *page)
|
|
|
-{
|
|
|
- int i;
|
|
|
- nr_huge_pages--;
|
|
|
- nr_huge_pages_node[page_to_nid(page)]--;
|
|
|
- for (i = 0; i < (HPAGE_SIZE / PAGE_SIZE); i++) {
|
|
|
- page[i].flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
|
|
|
- 1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
|
|
|
- 1 << PG_private | 1<< PG_writeback);
|
|
|
- }
|
|
|
- set_compound_page_dtor(page, NULL);
|
|
|
- set_page_refcounted(page);
|
|
|
- __free_pages(page, HUGETLB_PAGE_ORDER);
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
static void try_to_free_low(unsigned long count)
|
|
|
{
|