aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinayak Menon <vinmenon@codeaurora.org>2016-02-23 18:06:29 +0530
committerMoyster <oysterized@gmail.com>2019-05-03 12:53:09 +0200
commit6899527530aee8f9add4b18c591286a59405e1ed (patch)
tree39e8c5c7c0543ec25a6c42fc9bf9a024344a0447
parentf7f92736592211b56cb30a73177cabfd42e307d0 (diff)
mm: add zone counter for cma pages
Add per free area nr_free_cma counter. The idea is to also track the number of cma pages present in free pages. This will be used in later patches to fix issues with zone_watermark_ok. Change-Id: I97da9d2f3642db56fc541c48ab56a7ce78e2333c Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org> Signed-off-by: Prakash Gupta <guptap@codeaurora.org> (cherry picked from commit a147305588507b1a241af87f1006c5d0b30beade)
-rw-r--r--include/linux/mmzone.h1
-rw-r--r--include/linux/page-isolation.h4
-rw-r--r--mm/page_alloc.c34
-rw-r--r--mm/page_isolation.c8
4 files changed, 36 insertions, 11 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 9ceef771f..c44cd2925 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -102,6 +102,7 @@ static inline int get_pageblock_migratetype(struct page *page)
struct free_area {
struct list_head free_list[MIGRATE_TYPES];
unsigned long nr_free;
+ unsigned long nr_free_cma;
};
struct pglist_data;
diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h
index 843187592..6b6ad8a5c 100644
--- a/include/linux/page-isolation.h
+++ b/include/linux/page-isolation.h
@@ -37,10 +37,10 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
bool skip_hwpoisoned_pages);
void set_pageblock_migratetype(struct page *page, int migratetype);
int move_freepages_block(struct zone *zone, struct page *page,
- int migratetype);
+ int migratetype, int old_mt);
int move_freepages(struct zone *zone,
struct page *start_page, struct page *end_page,
- int migratetype);
+ int migratetype, int old_mt);
/*
* Changes migrate type in [start_pfn, end_pfn) to be MIGRATE_ISOLATE.
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 21686a238..430956db0 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -621,6 +621,8 @@ static inline void __free_one_page(struct page *page,
} else {
list_del(&buddy->lru);
zone->free_area[order].nr_free--;
+ if (is_migrate_cma(migratetype))
+ zone->free_area[order].nr_free_cma--;
rmv_page_order(buddy);
}
combined_idx = buddy_idx & page_idx;
@@ -752,6 +754,8 @@ static inline void __free_one_page(struct page *page,
list_add(&page->lru, &zone->free_area[order].free_list[migratetype]);
out:
zone->free_area[order].nr_free++;
+ if (is_migrate_cma(migratetype))
+ zone->free_area[order].nr_free_cma++;
}
#endif
@@ -1081,6 +1085,8 @@ static inline void expand(struct zone *zone, struct page *page,
#endif
list_add(&page[size].lru, &area->free_list[migratetype]);
area->nr_free++;
+ if (is_migrate_cma(migratetype))
+ area->nr_free_cma++;
set_page_order(&page[size], high);
}
}
@@ -1152,6 +1158,8 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
list_del(&page->lru);
rmv_page_order(page);
area->nr_free--;
+ if (is_migrate_cma(migratetype))
+ area->nr_free_cma--;
expand(zone, page, order, current_order, area, migratetype);
return page;
}
@@ -1218,7 +1226,7 @@ static int fallbacks[MIGRATE_TYPES][4] = {
*/
int move_freepages(struct zone *zone,
struct page *start_page, struct page *end_page,
- int migratetype)
+ int migratetype, int old_mt)
{
struct page *page;
unsigned long order;
@@ -1252,6 +1260,12 @@ int move_freepages(struct zone *zone,
order = page_order(page);
list_move(&page->lru,
&zone->free_area[order].free_list[migratetype]);
+
+ if (is_migrate_cma(migratetype))
+ zone->free_area[order].nr_free_cma++;
+ else if (is_migrate_cma(old_mt))
+ zone->free_area[order].nr_free_cma--;
+
set_freepage_migratetype(page, migratetype);
page += 1 << order;
pages_moved += 1 << order;
@@ -1261,7 +1275,7 @@ int move_freepages(struct zone *zone,
}
int move_freepages_block(struct zone *zone, struct page *page,
- int migratetype)
+ int migratetype, int old_mt)
{
unsigned long start_pfn, end_pfn;
struct page *start_page, *end_page;
@@ -1278,7 +1292,7 @@ int move_freepages_block(struct zone *zone, struct page *page,
if (!zone_spans_pfn(zone, end_pfn))
return 0;
- return move_freepages(zone, start_page, end_page, migratetype);
+ return move_freepages(zone, start_page, end_page, migratetype, old_mt);
}
static void change_pageblock_range(struct page *pageblock_page,
@@ -1326,6 +1340,8 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
page = list_entry(area->free_list[migratetype].next,
struct page, lru);
area->nr_free--;
+ if (is_migrate_cma(migratetype))
+ area->nr_free_cma--;
/* We don't want move pages with MIGRATE_MTKPASR to other mobilities either! */
if (is_migrate_mtkpasr(migratetype)) {
@@ -1374,7 +1390,7 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
page_group_by_mobility_disabled)) {
int pages;
pages = move_freepages_block(zone, page,
- start_migratetype);
+ start_migratetype, 0);
/* Claim the whole block if over half of it is free */
if (pages >= (1 << (pageblock_order-1)) ||
@@ -1776,6 +1792,8 @@ int __isolate_free_page(struct page *page, unsigned int order)
/* Remove page from free list */
list_del(&page->lru);
zone->free_area[order].nr_free--;
+ if (is_migrate_cma(mt))
+ zone->free_area[order].nr_free_cma--;
rmv_page_order(page);
/* Set the pageblock if the isolated page is at least a pageblock */
@@ -4596,7 +4614,7 @@ static void setup_zone_migrate_reserve(struct zone *zone)
set_pageblock_migratetype(page,
MIGRATE_RESERVE);
move_freepages_block(zone, page,
- MIGRATE_RESERVE);
+ MIGRATE_RESERVE, 0);
reserve--;
continue;
}
@@ -4608,7 +4626,8 @@ static void setup_zone_migrate_reserve(struct zone *zone)
*/
if (block_migratetype == MIGRATE_RESERVE) {
set_pageblock_migratetype(page, MIGRATE_MOVABLE);
- move_freepages_block(zone, page, MIGRATE_MOVABLE);
+ move_freepages_block(zone, page,
+ MIGRATE_MOVABLE, 0);
}
}
}
@@ -4698,6 +4717,7 @@ static void __meminit zone_init_free_lists(struct zone *zone)
for_each_migratetype_order(order, t) {
INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
zone->free_area[order].nr_free = 0;
+ zone->free_area[order].nr_free_cma = 0;
}
}
@@ -7525,6 +7545,8 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
if (PageHighMem(page))
totalhigh_pages -= 1 << order;
#endif
+ if (is_migrate_cma(get_pageblock_migratetype(page)))
+ zone->free_area[order].nr_free_cma--;
for (i = 0; i < (1 << order); i++)
SetPageReserved((page+i));
pfn += (1 << order);
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 87011247a..0e55d52c5 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -65,7 +65,8 @@ out:
// commit ad53f92eb416d81e469fa8ea57153e59455e7175
zone->nr_isolate_pageblock++;
#endif
- nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
+ nr_pages = move_freepages_block(zone, page,
+ MIGRATE_ISOLATE, migratetype);
#if !defined(CONFIG_CMA) || !defined(CONFIG_MTK_SVP) // SVP 16
__mod_zone_freepage_state(zone, -nr_pages, migratetype);
@@ -141,7 +142,8 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype)
* pageblock scanning for freepage moving.
*/
if (!isolated_page) {
- nr_pages = move_freepages_block(zone, page, migratetype);
+ nr_pages = move_freepages_block(zone, page,
+ migratetype, 0);
#if !defined(CONFIG_CMA) || !defined(CONFIG_MTK_SVP) // SVP 16
__mod_zone_freepage_state(zone, nr_pages, migratetype);
#else
@@ -274,7 +276,7 @@ __test_page_isolated_in_pageblock(struct zone *zone, unsigned long pfn,
end_page = page + (1 << page_order(page)) - 1;
move_freepages(page_zone(page), page, end_page,
- MIGRATE_ISOLATE);
+ MIGRATE_ISOLATE,0);
}
pfn += 1 << page_order(page);
}