From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755133AbbJAI6j (ORCPT ); Thu, 1 Oct 2015 04:58:39 -0400 Received: from mga02.intel.com ([134.134.136.20]:50792 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752698AbbJAI6h (ORCPT ); Thu, 1 Oct 2015 04:58:37 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,616,1437462000"; d="scan'208";a="571960162" From: "Kirill A. Shutemov" To: Andrew Morton Cc: Andrea Arcangeli , Hugh Dickins , Vlastimil Babka , Johannes Weiner , Michal Hocko , David Rientjes , Mel Gorman , linux-kernel@vger.kernel.org, linux-mm@kvack.org, "Kirill A. Shutemov" Subject: [PATCH] mm: avoid false-positive PageTail() during meminit Date: Thu, 1 Oct 2015 11:58:00 +0300 Message-Id: <1443689880-147129-1-git-send-email-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 2.5.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since compound_head() rework we encode PageTail() into bit 0 of page->lru.next (aka page->compound_head). We need to make sure that page->lru is initialized before first use of compound_head() or PageTail(). My page-flags patchset makes sure that we don't use PG_reserved on compound pages. That means we have PageTail() check as eary as in SetPageReserved() in reserve_bootmem_region() Let's initialize page->lru before that to avoid false positive from PageTail(). Signed-off-by: Kirill A. Shutemov --- Andrew, this can be folded into "mm: make compound_head() robust" --- mm/page_alloc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 778eb3a0f103..95fbc43a93dd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -926,8 +926,6 @@ static void init_reserved_page(unsigned long pfn) #else static inline void init_reserved_page(unsigned long pfn) { - /* Avoid false-positive PageTail() */ - INIT_LIST_HEAD(&pfn_to_page(pfn)->lru); } #endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */ @@ -947,6 +945,10 @@ void __meminit reserve_bootmem_region(unsigned long start, unsigned long end) struct page *page = pfn_to_page(start_pfn); init_reserved_page(start_pfn); + + /* Avoid false-positive PageTail() */ + INIT_LIST_HEAD(&page->lru); + SetPageReserved(page); } } -- 2.5.1