Messages in this thread | | | Date | Thu, 18 Mar 2021 04:46:00 +0000 | From | Matthew Wilcox <> | Subject | Re: [PATCH] mm/gup: check page posion status for coredump. |
| |
On Wed, Mar 17, 2021 at 10:12:02AM +0100, David Hildenbrand wrote: > > + if (IS_ENABLED(CONFIG_MEMORY_FAILURE) && ret == 1) { > > + if (unlikely(PageHuge(page) && PageHWPoison(compound_head(page)))) > > + ret = 0; > > + else if (unlikely(PageHWPoison(page))) > > + ret = 0; > > + } > > I wonder if a simple > > if (PageHWPoison(compound_head(page))) > ret = 0; > > won't suffice. But I guess the "issue" is compound pages that are not huge > pages or transparent huge pages.
THPs don't set the HWPoison bit on the head page.
https://lore.kernel.org/linux-mm/20210316140947.GA3420@casper.infradead.org/
(and PAGEFLAG(HWPoison, hwpoison, PF_ANY))
By the way,
#ifdef CONFIG_MEMORY_FAILURE PAGEFLAG(HWPoison, hwpoison, PF_ANY) TESTSCFLAG(HWPoison, hwpoison, PF_ANY) #define __PG_HWPOISON (1UL << PG_hwpoison) extern bool take_page_off_buddy(struct page *page); #else PAGEFLAG_FALSE(HWPoison) #define __PG_HWPOISON 0 #endif
so there's no need for this if (IS_ENABLED(CONFIG_MEMORY_FAILURE) check, as it simply turns into
if (PageHuge(page) && 0) else if (0)
and the compiler can optimise it all away.
| |