author | tao zeng <tao.zeng@amlogic.com> | 2018-04-17 07:29:50 (GMT) |
---|---|---|
committer | Xindong Xu <xindong.xu@amlogic.com> | 2018-04-19 06:00:29 (GMT) |
commit | 9eb1034cad606251c0ace7bd79a5133b71dfcdfd (patch) | |
tree | 509931f5f072896d87904e8daae90215f6a1f041 | |
parent | 334608c160a6a8361993816b3a44351c03284301 (diff) | |
download | common-9eb1034cad606251c0ace7bd79a5133b71dfcdfd.zip common-9eb1034cad606251c0ace7bd79a5133b71dfcdfd.tar.gz common-9eb1034cad606251c0ace7bd79a5133b71dfcdfd.tar.bz2 |
mm: optimize for lowmemory killer
PD#164558: mm: optimize for lowmemory killer
1. Remove change for LRU;
2. Only subtract cma file caches when task is not kswapd.
Change-Id: I09ad86fc9754c1136cd976d656a023dee6cbe2eb
Signed-off-by: tao zeng <tao.zeng@amlogic.com>
-rw-r--r-- | drivers/staging/android/lowmemorykiller.c | 2 | ||||
-rw-r--r-- | include/linux/mm_inline.h | 39 | ||||
-rw-r--r-- | include/linux/mmzone.h | 14 | ||||
-rw-r--r-- | mm/mmzone.c | 4 | ||||
-rw-r--r-- | mm/swap.c | 22 | ||||
-rw-r--r-- | mm/vmscan.c | 70 |
6 files changed, 39 insertions, 112 deletions
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 8774de0..9e54901 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -148,7 +148,7 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) int file_cma = 0; int cma_forbid = 0; - if (cma_forbidden_mask(sc->gfp_mask)) { + if (cma_forbidden_mask(sc->gfp_mask) && !current_is_kswapd()) { free_cma = global_page_state(NR_FREE_CMA_PAGES); file_cma = global_page_state(NR_INACTIVE_FILE_CMA) + global_page_state(NR_ACTIVE_FILE_CMA); diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 8fc56ac..a60c09c 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -3,9 +3,9 @@ #include <linux/huge_mm.h> #include <linux/swap.h> -#ifdef CONFIG_AMLOGIC_CMA +#ifdef CONFIG_AMLOGIC_MEMORY_EXTEND #include <linux/page-isolation.h> -#endif /* CONFIG_AMLOGIC_CMA */ +#endif /* CONFIG_AMLOGIC_MEMORY_EXTEND */ /** * page_is_file_cache - should the page be on a file LRU or anon LRU? @@ -49,46 +49,41 @@ static __always_inline void update_lru_size(struct lruvec *lruvec, static __always_inline void add_page_to_lru_list(struct page *page, struct lruvec *lruvec, enum lru_list lru) { -#ifdef CONFIG_AMLOGIC_CMA +#ifdef CONFIG_AMLOGIC_MEMORY_EXTEND int nr_pages = hpage_nr_pages(page); int num = NR_INACTIVE_ANON_CMA - NR_INACTIVE_ANON; int migrate_type = 0; -#endif /* CONFIG_AMLOGIC_CMA */ +#endif /* CONFIG_AMLOGIC_MEMORY_EXTEND */ update_lru_size(lruvec, lru, page_zonenum(page), hpage_nr_pages(page)); -#ifdef CONFIG_AMLOGIC_CMA + list_add(&page->lru, &lruvec->lists[lru]); + +#ifdef CONFIG_AMLOGIC_MEMORY_EXTEND migrate_type = get_pageblock_migratetype(page); - if (is_migrate_cma(migrate_type) || is_migrate_isolate(migrate_type)) { + if (is_migrate_cma(migrate_type) || is_migrate_isolate(migrate_type)) __mod_zone_page_state(page_zone(page), NR_LRU_BASE + lru + num, nr_pages); - list_add_tail(&page->lru, lruvec->cma_list[lru]); - /* Always to point to first cma page */ - lruvec->cma_list[lru] = &page->lru; - } else - list_add(&page->lru, &lruvec->lists[lru]); -#else - list_add(&page->lru, &lruvec->lists[lru]); -#endif /* CONFIG_AMLOGIC_CMA */ +#endif /* CONFIG_AMLOGIC_MEMORY_EXTEND */ } static __always_inline void del_page_from_lru_list(struct page *page, struct lruvec *lruvec, enum lru_list lru) { -#ifdef CONFIG_AMLOGIC_CMA +#ifdef CONFIG_AMLOGIC_MEMORY_EXTEND int nr_pages = hpage_nr_pages(page); int num = NR_INACTIVE_ANON_CMA - NR_INACTIVE_ANON; int migrate_type = 0; +#endif /* CONFIG_AMLOGIC_MEMORY_EXTEND */ + list_del(&page->lru); + update_lru_size(lruvec, lru, page_zonenum(page), -hpage_nr_pages(page)); + +#ifdef CONFIG_AMLOGIC_MEMORY_EXTEND migrate_type = get_pageblock_migratetype(page); - if (is_migrate_cma(migrate_type) || is_migrate_isolate(migrate_type)) { + if (is_migrate_cma(migrate_type) || is_migrate_isolate(migrate_type)) __mod_zone_page_state(page_zone(page), NR_LRU_BASE + lru + num, -nr_pages); - if (lruvec->cma_list[lru] == &page->lru) - lruvec->cma_list[lru] = page->lru.next; - } -#endif /* CONFIG_AMLOGIC_CMA */ - list_del(&page->lru); - update_lru_size(lruvec, lru, page_zonenum(page), -hpage_nr_pages(page)); +#endif /* CONFIG_AMLOGIC_MEMORY_EXTEND */ } /** diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 082280d..9d7c732 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -244,9 +244,6 @@ struct zone_reclaim_stat { struct lruvec { struct list_head lists[NR_LRU_LISTS]; struct zone_reclaim_stat reclaim_stat; -#ifdef CONFIG_AMLOGIC_CMA - struct list_head *cma_list[NR_LRU_LISTS]; -#endif /* CONFIG_AMLOGIC_CMA */ /* Evictions & activations on the inactive file list */ atomic_long_t inactive_age; #ifdef CONFIG_MEMCG @@ -254,17 +251,6 @@ struct lruvec { #endif }; -#ifdef CONFIG_AMLOGIC_CMA -static inline bool lru_normal_empty(enum lru_list lru, struct lruvec *lruv) -{ - if (lruv->lists[lru].next == lruv->cma_list[lru]) - return true; - else - return false; -} -#endif /* CONFIG_AMLOGIC_CMA */ - - /* Mask used at gathering information at once (see memcontrol.c) */ #define LRU_ALL_FILE (BIT(LRU_INACTIVE_FILE) | BIT(LRU_ACTIVE_FILE)) #define LRU_ALL_ANON (BIT(LRU_INACTIVE_ANON) | BIT(LRU_ACTIVE_ANON)) diff --git a/mm/mmzone.c b/mm/mmzone.c index 83da7b2..5652be8 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -93,10 +93,6 @@ void lruvec_init(struct lruvec *lruvec) for_each_lru(lru) INIT_LIST_HEAD(&lruvec->lists[lru]); -#ifdef CONFIG_AMLOGIC_CMA - for_each_lru(lru) - lruvec->cma_list[lru] = &lruvec->lists[lru]; -#endif /* CONFIG_AMLOGIC_CMA */ } #if defined(CONFIG_NUMA_BALANCING) && !defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) @@ -210,18 +210,7 @@ static void pagevec_move_tail_fn(struct page *page, struct lruvec *lruvec, if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { enum lru_list lru = page_lru_base_type(page); - #ifdef CONFIG_AMLOGIC_CMA - if (!cma_page(page)) { - list_move_tail(&page->lru, lruvec->cma_list[lru]); - } else { - if ((lruvec->cma_list[lru] == &page->lru) && - (page->lru.next != &lruvec->lists[lru])) - lruvec->cma_list[lru] = page->lru.next; - list_move_tail(&page->lru, &lruvec->lists[lru]); - } - #else list_move_tail(&page->lru, &lruvec->lists[lru]); - #endif /* CONFIG_AMLOGIC_CMA */ (*pgmoved)++; } } @@ -560,18 +549,7 @@ static void lru_deactivate_file_fn(struct page *page, struct lruvec *lruvec, * The page's writeback ends up during pagevec * We moves tha page into tail of inactive. */ - #ifdef CONFIG_AMLOGIC_CMA - if (!cma_page(page)) { - list_move_tail(&page->lru, lruvec->cma_list[lru]); - } else { - if ((lruvec->cma_list[lru] == &page->lru) && - (page->lru.next != &lruvec->lists[lru])) - lruvec->cma_list[lru] = page->lru.next; - list_move_tail(&page->lru, &lruvec->lists[lru]); - } - #else list_move_tail(&page->lru, &lruvec->lists[lru]); - #endif /* CONFIG_AMLOGIC_CMA */ __count_vm_event(PGROTATED); } diff --git a/mm/vmscan.c b/mm/vmscan.c index 3a65c54..04d109a 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1456,30 +1456,16 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, unsigned long nr_skipped[MAX_NR_ZONES] = { 0, }; unsigned long scan, nr_pages; LIST_HEAD(pages_skipped); -#ifdef CONFIG_AMLOGIC_CMA +#ifdef CONFIG_AMLOGIC_MODIFY int num = NR_INACTIVE_ANON_CMA - NR_INACTIVE_ANON; - bool use_cma = true, is_cma_page; - - if (cma_forbidden_mask(sc->gfp_mask)) - use_cma = false; -#endif /* CONFIG_AMLOGIC_CMA */ + int migrate_type = 0; +#endif /* CONFIG_AMLOGIC_MODIFY */ for (scan = 0; scan < nr_to_scan && nr_taken < nr_to_scan && !list_empty(src);) { struct page *page; - #ifdef CONFIG_AMLOGIC_CMA - page = NULL; - if (!use_cma) { - if (!lru_normal_empty(lru, lruvec)) - page = lru_to_page(lruvec->cma_list[lru]); - } - if (!page) - page = lru_to_page(src); - is_cma_page = cma_page(page); - #else page = lru_to_page(src); - #endif /* CONFIG_AMLOGIC_CMA */ prefetchw_prev_lru_page(page, src, flags); VM_BUG_ON_PAGE(!PageLRU(page), page); @@ -1501,30 +1487,20 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, nr_pages = hpage_nr_pages(page); nr_taken += nr_pages; nr_zone_taken[page_zonenum(page)] += nr_pages; - #ifdef CONFIG_AMLOGIC_CMA - if (is_cma_page) { - __mod_zone_page_state(page_zone(page), - NR_LRU_BASE + lru + num, - -nr_pages); - if (lruvec->cma_list[lru] == &page->lru) - lruvec->cma_list[lru] = page->lru.next; - } - #endif /* CONFIG_AMLOGIC_CMA */ list_move(&page->lru, dst); + #ifdef CONFIG_AMLOGIC_MODIFY + migrate_type = get_pageblock_migratetype(page); + if (is_migrate_cma(migrate_type) || + is_migrate_isolate(migrate_type)) + __mod_zone_page_state(page_zone(page), + NR_LRU_BASE + lru + num, + -nr_pages); + #endif /* CONFIG_AMLOGIC_MODIFY */ break; case -EBUSY: /* else it is being freed elsewhere */ - #ifdef CONFIG_AMLOGIC_CMA - if (is_cma_page) { - list_move(&page->lru, - lruvec->cma_list[lru]->prev); - lruvec->cma_list[lru] = &page->lru; - } else - list_move(&page->lru, src); - #else list_move(&page->lru, src); - #endif /* CONFIG_AMLOGIC_CMA */ continue; default: @@ -1932,10 +1908,10 @@ static void move_active_pages_to_lru(struct lruvec *lruvec, unsigned long pgmoved = 0; struct page *page; int nr_pages; -#ifdef CONFIG_AMLOGIC_CMA +#ifdef CONFIG_AMLOGIC_MODIFY int num = NR_INACTIVE_ANON_CMA - NR_INACTIVE_ANON; - bool is_cma_page; -#endif /* CONFIG_AMLOGIC_CMA */ + int migrate_type = 0; +#endif /* CONFIG_AMLOGIC_MODIFY */ while (!list_empty(list)) { page = lru_to_page(list); @@ -1946,20 +1922,16 @@ static void move_active_pages_to_lru(struct lruvec *lruvec, nr_pages = hpage_nr_pages(page); update_lru_size(lruvec, lru, page_zonenum(page), nr_pages); - #ifdef CONFIG_AMLOGIC_CMA - is_cma_page = cma_page(page); - if (is_cma_page) { + list_move(&page->lru, &lruvec->lists[lru]); + pgmoved += nr_pages; + #ifdef CONFIG_AMLOGIC_MODIFY + migrate_type = get_pageblock_migratetype(page); + if (is_migrate_cma(migrate_type) || + is_migrate_isolate(migrate_type)) __mod_zone_page_state(page_zone(page), NR_LRU_BASE + lru + num, nr_pages); - list_move(&page->lru, lruvec->cma_list[lru]->prev); - lruvec->cma_list[lru] = &page->lru; - } else - list_move(&page->lru, &lruvec->lists[lru]); - #else - list_move(&page->lru, &lruvec->lists[lru]); - #endif /* CONFIG_AMLOGIC_CMA */ - pgmoved += nr_pages; + #endif /* CONFIG_AMLOGIC_MODIFY */ if (put_page_testzero(page)) { __ClearPageLRU(page); |