On Wed, Sep 14, 2022 at 11:37 AM zhaoyang.huang <zhaoyang.huang@xxxxxxxxxx> wrote: > > From: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxx> > > The page with special page type will be deemed as bad page wrongly since > type share the same address with mapcount. > > Signed-off-by: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxx> > --- > include/linux/page-flags.h | 4 ++-- > mm/page_alloc.c | 2 +- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > index e66f7aa..5d3274b 100644 > --- a/include/linux/page-flags.h > +++ b/include/linux/page-flags.h > @@ -946,9 +946,9 @@ static inline bool is_page_hwpoison(struct page *page) > #define PageType(page, flag) \ > ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) > > -static inline int page_has_type(struct page *page) > +static inline bool page_has_type(struct page *page) > { > - return (int)page->page_type < PAGE_MAPCOUNT_RESERVE; > + return (int)page->page_type < PAGE_MAPCOUNT_RESERVE; amend the type conversion > } > > #define PAGE_TYPE_OPS(uname, lname) \ > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index e008a3d..3714680 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1164,7 +1164,7 @@ int split_free_page(struct page *free_page, > static inline bool page_expected_state(struct page *page, > unsigned long check_flags) > { > - if (unlikely(atomic_read(&page->_mapcount) != -1)) > + if (unlikely(!page_has_type(page) && atomic_read(&page->_mapcount) != -1)) > return false; > > if (unlikely((unsigned long)page->mapping | > -- > 1.9.1 >