diff options
author | Miaohe Lin <linmiaohe@huawei.com> | 2021-09-09 04:10:11 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-09-18 14:44:02 +0300 |
commit | 40298f33aa3197316e8bce40b5c34882bc01e718 (patch) | |
tree | 782696e3706e3f7ec5a0e5a92af2571e6bff53fa /mm | |
parent | d8f8f8c8f3692e7529c0386ab7741c17a57e83cd (diff) | |
download | linux-40298f33aa3197316e8bce40b5c34882bc01e718.tar.xz |
mm/page_alloc.c: avoid accessing uninitialized pcp page migratetype
commit 053cfda102306a3394012f9fe2594811c34925e4 upstream.
If it's not prepared to free unref page, the pcp page migratetype is
unset. Thus we will get rubbish from get_pcppage_migratetype() and
might list_del(&page->lru) again after it's already deleted from the list
leading to grumble about data corruption.
Link: https://lkml.kernel.org/r/20210902115447.57050-1-linmiaohe@huawei.com
Fixes: df1acc856923 ("mm/page_alloc: avoid conflating IRQs disabled with zone->lock")
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Mel Gorman <mgorman@techsingularity.net>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: David Hildenbrand <david@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index eeb3a9cb36bb..7a28f7db7d28 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3445,8 +3445,10 @@ void free_unref_page_list(struct list_head *list) /* Prepare pages for freeing */ list_for_each_entry_safe(page, next, list, lru) { pfn = page_to_pfn(page); - if (!free_unref_page_prepare(page, pfn, 0)) + if (!free_unref_page_prepare(page, pfn, 0)) { list_del(&page->lru); + continue; + } /* * Free isolated pages directly to the allocator, see |