X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mm%2Fpage_alloc.c;h=bf6c9285013fb0372693ef82f75cdd50007b2620;hb=77e142e21dfd6507f7d1f0464c12f9e5502e1f10;hp=82e897fc291f53b4d2a9202efddfb871fa6f9609;hpb=abc5c8153c473f352bbc6eccfb016564a1b58b7e;p=firefly-linux-kernel-4.4.55.git diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 82e897fc291f..bf6c9285013f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -373,9 +373,11 @@ void prep_compound_page(struct page *page, unsigned long order) __SetPageHead(page); for (i = 1; i < nr_pages; i++) { struct page *p = page + i; - __SetPageTail(p); set_page_count(p, 0); p->first_page = page; + /* Make sure p->first_page is always valid for PageTail() */ + smp_wmb(); + __SetPageTail(p); } } @@ -1048,6 +1050,15 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) page = list_entry(area->free_list[migratetype].next, struct page, lru); + +#ifdef CONFIG_ARCH_ROCKCHIP + if (is_migrate_cma(migratetype)){ + int mt = get_pageblock_migratetype(page); + if (unlikely(is_migrate_isolate(mt))) + continue; + } +#endif + area->nr_free--; /* @@ -4540,7 +4551,7 @@ static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone, #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE /* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */ -void __init set_pageblock_order(void) +void __paginginit set_pageblock_order(void) { unsigned int order; @@ -4568,7 +4579,7 @@ void __init set_pageblock_order(void) * include/linux/pageblock-flags.h for the values of pageblock_order based on * the kernel config */ -void __init set_pageblock_order(void) +void __paginginit set_pageblock_order(void) { }