|
@@ -495,7 +495,6 @@ static inline void __free_one_page(struct page *page,
|
|
|
|
|
|
static inline int free_pages_check(struct page *page)
|
|
static inline int free_pages_check(struct page *page)
|
|
{
|
|
{
|
|
- free_page_mlock(page);
|
|
|
|
if (unlikely(page_mapcount(page) |
|
|
if (unlikely(page_mapcount(page) |
|
|
(page->mapping != NULL) |
|
|
(page->mapping != NULL) |
|
|
(page_count(page) != 0) |
|
|
(page_count(page) != 0) |
|
|
@@ -552,6 +551,7 @@ static void __free_pages_ok(struct page *page, unsigned int order)
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
int i;
|
|
int i;
|
|
int bad = 0;
|
|
int bad = 0;
|
|
|
|
+ int clearMlocked = PageMlocked(page);
|
|
|
|
|
|
for (i = 0 ; i < (1 << order) ; ++i)
|
|
for (i = 0 ; i < (1 << order) ; ++i)
|
|
bad += free_pages_check(page + i);
|
|
bad += free_pages_check(page + i);
|
|
@@ -567,6 +567,8 @@ static void __free_pages_ok(struct page *page, unsigned int order)
|
|
kernel_map_pages(page, 1 << order, 0);
|
|
kernel_map_pages(page, 1 << order, 0);
|
|
|
|
|
|
local_irq_save(flags);
|
|
local_irq_save(flags);
|
|
|
|
+ if (unlikely(clearMlocked))
|
|
|
|
+ free_page_mlock(page);
|
|
__count_vm_events(PGFREE, 1 << order);
|
|
__count_vm_events(PGFREE, 1 << order);
|
|
free_one_page(page_zone(page), page, order,
|
|
free_one_page(page_zone(page), page, order,
|
|
get_pageblock_migratetype(page));
|
|
get_pageblock_migratetype(page));
|
|
@@ -1013,6 +1015,7 @@ static void free_hot_cold_page(struct page *page, int cold)
|
|
struct zone *zone = page_zone(page);
|
|
struct zone *zone = page_zone(page);
|
|
struct per_cpu_pages *pcp;
|
|
struct per_cpu_pages *pcp;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
+ int clearMlocked = PageMlocked(page);
|
|
|
|
|
|
if (PageAnon(page))
|
|
if (PageAnon(page))
|
|
page->mapping = NULL;
|
|
page->mapping = NULL;
|
|
@@ -1028,7 +1031,10 @@ static void free_hot_cold_page(struct page *page, int cold)
|
|
|
|
|
|
pcp = &zone_pcp(zone, get_cpu())->pcp;
|
|
pcp = &zone_pcp(zone, get_cpu())->pcp;
|
|
local_irq_save(flags);
|
|
local_irq_save(flags);
|
|
|
|
+ if (unlikely(clearMlocked))
|
|
|
|
+ free_page_mlock(page);
|
|
__count_vm_event(PGFREE);
|
|
__count_vm_event(PGFREE);
|
|
|
|
+
|
|
if (cold)
|
|
if (cold)
|
|
list_add_tail(&page->lru, &pcp->list);
|
|
list_add_tail(&page->lru, &pcp->list);
|
|
else
|
|
else
|