]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blobdiff - mm/page_owner.c
mm: fix race between MADV_FREE reclaim and blkdev direct IO read
[mirror_ubuntu-focal-kernel.git] / mm / page_owner.c
index e327bcd0380e9d79a5f974c3a4f56889e026cd0f..83d08943bcdeefb95c4a0a71c618e9da48e19d81 100644 (file)
@@ -204,7 +204,7 @@ void __set_page_owner_migrate_reason(struct page *page, int reason)
        page_owner->last_migrate_reason = reason;
 }
 
-void __split_page_owner(struct page *page, unsigned int order)
+void __split_page_owner(struct page *page, unsigned int nr)
 {
        int i;
        struct page_ext *page_ext = lookup_page_ext(page);
@@ -213,7 +213,7 @@ void __split_page_owner(struct page *page, unsigned int order)
        if (unlikely(!page_ext))
                return;
 
-       for (i = 0; i < (1 << order); i++) {
+       for (i = 0; i < nr; i++) {
                page_owner = get_page_owner(page_ext);
                page_owner->order = 0;
                page_ext = page_ext_next(page_ext);
@@ -271,7 +271,8 @@ void pagetypeinfo_showmixedcount_print(struct seq_file *m,
         * not matter as the mixed block count will still be correct
         */
        for (; pfn < end_pfn; ) {
-               if (!pfn_valid(pfn)) {
+               page = pfn_to_online_page(pfn);
+               if (!page) {
                        pfn = ALIGN(pfn + 1, MAX_ORDER_NR_PAGES);
                        continue;
                }
@@ -279,13 +280,13 @@ void pagetypeinfo_showmixedcount_print(struct seq_file *m,
                block_end_pfn = ALIGN(pfn + 1, pageblock_nr_pages);
                block_end_pfn = min(block_end_pfn, end_pfn);
 
-               page = pfn_to_page(pfn);
                pageblock_mt = get_pageblock_migratetype(page);
 
                for (; pfn < block_end_pfn; pfn++) {
                        if (!pfn_valid_within(pfn))
                                continue;
 
+                       /* The pageblock is online, no need to recheck. */
                        page = pfn_to_page(pfn);
 
                        if (page_zone(page) != zone)