On Thu, 16 Jul 2015 01:41:56 +0000 Naoya Horiguchi <n-horigu...@ah.jp.nec.com> wrote:
> The race condition addressed in commit add05cecef80 ("mm: soft-offline: don't > free target page in successful page migration") was not closed completely, > because that can happen not only for soft-offline, but also for hard-offline. > Consider that a slab page is about to be freed into buddy pool, and then an > uncorrected memory error hits the page just after entering __free_one_page(), > then VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP) is triggered, > despite the fact that it's not necessary because the data on the affected > page is not consumed. > > To solve it, this patch drops __PG_HWPOISON from page flag checks at > allocation/free time. I think it's justified because __PG_HWPOISON flags is > defined to prevent the page from being reused and setting it outside the > page's alloc-free cycle is a designed behavior (not a bug.) > > And the patch reverts most of the changes from commit add05cecef80 about > the new refcounting rule of soft-offlined pages, which is no longer necessary. > > ... > > --- v4.2-rc2.orig/mm/memory-failure.c > +++ v4.2-rc2/mm/memory-failure.c > @@ -1723,6 +1723,9 @@ int soft_offline_page(struct page *page, int flags) > > get_online_mems(); > > + if (get_pageblock_migratetype(page) != MIGRATE_ISOLATE) > + set_migratetype_isolate(page, true); > + > ret = get_any_page(page, pfn, flags); > put_online_mems(); > if (ret > 0) { /* for in-use pages */ This patch gets build-broken by your mm-page_isolation-make-set-unset_migratetype_isolate-file-local.patch, which I shall drop. From: Naoya Horiguchi <n-horigu...@ah.jp.nec.com> Subject: mm, page_isolation: make set/unset_migratetype_isolate() file-local Nowaday, set/unset_migratetype_isolate() is defined and used only in mm/page_isolation, so let's limit the scope within the file. Signed-off-by: Naoya Horiguchi <n-horigu...@ah.jp.nec.com> Cc: David Rientjes <rient...@google.com> Cc: Vlastimil Babka <vba...@suse.cz> Cc: Joonsoo Kim <iamjoonsoo....@lge.com> Cc: Minchan Kim <minc...@kernel.org> Signed-off-by: Andrew Morton <a...@linux-foundation.org> --- include/linux/page-isolation.h | 5 ----- mm/page_isolation.c | 5 +++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff -puN include/linux/page-isolation.h~mm-page_isolation-make-set-unset_migratetype_isolate-file-local include/linux/page-isolation.h --- a/include/linux/page-isolation.h~mm-page_isolation-make-set-unset_migratetype_isolate-file-local +++ a/include/linux/page-isolation.h @@ -65,11 +65,6 @@ undo_isolate_page_range(unsigned long st int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, bool skip_hwpoisoned_pages); -/* - * Internal functions. Changes pageblock's migrate type. - */ -int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages); -void unset_migratetype_isolate(struct page *page, unsigned migratetype); struct page *alloc_migrate_target(struct page *page, unsigned long private, int **resultp); diff -puN mm/page_isolation.c~mm-page_isolation-make-set-unset_migratetype_isolate-file-local mm/page_isolation.c --- a/mm/page_isolation.c~mm-page_isolation-make-set-unset_migratetype_isolate-file-local +++ a/mm/page_isolation.c @@ -9,7 +9,8 @@ #include <linux/hugetlb.h> #include "internal.h" -int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages) +static int set_migratetype_isolate(struct page *page, + bool skip_hwpoisoned_pages) { struct zone *zone; unsigned long flags, pfn; @@ -72,7 +73,7 @@ out: return ret; } -void unset_migratetype_isolate(struct page *page, unsigned migratetype) +static void unset_migratetype_isolate(struct page *page, unsigned migratetype) { struct zone *zone; unsigned long flags, nr_pages; _ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/