On Mon, 12 Nov 2012 09:59:42 +0100 Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> wrote: > It has been observed that system tends to keep a lot of CMA free pages > even in very high memory pressure use cases. The CMA fallback for movable > pages is used very rarely, only when system is completely pruned from > MOVABLE pages, what usually means that the out-of-memory even will be > triggered very soon. To avoid such situation and make better use of CMA > pages, a heuristics is introduced which turns on CMA fallback for movable > pages when the real number of free pages (excluding CMA free pages) > approaches low water mark. > > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Reviewed-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> > CC: Michal Nazarewicz <mina86@xxxxxxxxxx> > --- > mm/page_alloc.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index fcb9719..90b51f3 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1076,6 +1076,15 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order, > { > struct page *page; > > +#ifdef CONFIG_CMA > + unsigned long nr_free = zone_page_state(zone, NR_FREE_PAGES); > + unsigned long nr_cma_free = zone_page_state(zone, NR_FREE_CMA_PAGES); > + > + if (migratetype == MIGRATE_MOVABLE && nr_cma_free && > + nr_free - nr_cma_free < 2 * low_wmark_pages(zone)) > + migratetype = MIGRATE_CMA; > +#endif /* CONFIG_CMA */ > + > retry_reserve: > page = __rmqueue_smallest(zone, order, migratetype); erk, this is right on the page allocator hotpath. Bad. At the very least, we could code it so it is not quite so dreadfully inefficient: if (migratetype == MIGRATE_MOVABLE) { unsigned long nr_cma_free; nr_cma_free = zone_page_state(zone, NR_FREE_CMA_PAGES); if (nr_cma_free) { unsigned long nr_free; nr_free = zone_page_state(zone, NR_FREE_PAGES); if (nr_free - nr_cma_free < 2 * low_wmark_pages(zone)) migratetype = MIGRATE_CMA; } } but it still looks pretty bad. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>