Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933455Ab2KFBc1 (ORCPT ); Mon, 5 Nov 2012 20:32:27 -0500 Received: from szxga01-in.huawei.com ([119.145.14.64]:18483 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932963Ab2KFBc0 (ORCPT ); Mon, 5 Nov 2012 20:32:26 -0500 From: Jiang Liu To: Andrew Morton , Maciej Rutecki CC: Jiang Liu , Jianguo Wu , Chris Clayton , "Rafael J. Wysocki" , Mel Gorman , Minchan Kim , KAMEZAWA Hiroyuki , Michal Hocko , , Subject: [PATCH] mm: fix a regression with HIGHMEM introduced by changeset 7f1290f2f2a4d Date: Tue, 6 Nov 2012 09:31:57 +0800 Message-ID: <1352165517-9732-1-git-send-email-jiang.liu@huawei.com> X-Mailer: git-send-email 1.7.11.msysgit.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.108.108.229] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2707 Lines: 78 Changeset 7f1290f2f2 tries to fix a issue when calculating zone->present_pages, but it causes a regression to 32bit systems with HIGHMEM. With that changeset, function reset_zone_present_pages() resets all zone->present_pages to zero, and fixup_zone_present_pages() is called to recalculate zone->present_pages when boot allocator frees core memory pages into buddy allocator. Because highmem pages are not freed by bootmem allocator, all highmem zones' present_pages becomes zero. Actually there's no need to recalculate present_pages for highmem zone because bootmem allocator never allocates pages from them. So fix the regression by skipping highmem in function reset_zone_present_pages() and fixup_zone_present_pages(). Signed-off-by: Jiang Liu Signed-off-by: Jianguo Wu Reported-by: Maciej Rutecki Tested-by: Maciej Rutecki Cc: Chris Clayton Cc: Rafael J. Wysocki Cc: Andrew Morton Cc: Mel Gorman Cc: Minchan Kim Cc: KAMEZAWA Hiroyuki Cc: Michal Hocko Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org --- Hi Maciej, Thanks for reporting and bisecting. We have analyzed the regression and worked out a patch for it. Could you please help to verify whether it fix the regression? Thanks! Gerry --- mm/page_alloc.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5b74de6..2311f15 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -6108,7 +6108,8 @@ void reset_zone_present_pages(void) for_each_node_state(nid, N_HIGH_MEMORY) { for (i = 0; i < MAX_NR_ZONES; i++) { z = NODE_DATA(nid)->node_zones + i; - z->present_pages = 0; + if (!is_highmem(z)) + z->present_pages = 0; } } } @@ -6123,10 +6124,11 @@ void fixup_zone_present_pages(int nid, unsigned long start_pfn, for (i = 0; i < MAX_NR_ZONES; i++) { z = NODE_DATA(nid)->node_zones + i; + if (is_highmem(z)) + continue; + zone_start_pfn = z->zone_start_pfn; zone_end_pfn = zone_start_pfn + z->spanned_pages; - - /* if the two regions intersect */ if (!(zone_start_pfn >= end_pfn || zone_end_pfn <= start_pfn)) z->present_pages += min(end_pfn, zone_end_pfn) - max(start_pfn, zone_start_pfn); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/