From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756808AbZD1KcS (ORCPT ); Tue, 28 Apr 2009 06:32:18 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753966AbZD1KcF (ORCPT ); Tue, 28 Apr 2009 06:32:05 -0400 Received: from gir.skynet.ie ([193.1.99.77]:50516 "EHLO gir.skynet.ie" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753785AbZD1KcD (ORCPT ); Tue, 28 Apr 2009 06:32:03 -0400 Date: Tue, 28 Apr 2009 11:31:59 +0100 From: Mel Gorman To: Andrew Morton Cc: Linux Memory Management List , KOSAKI Motohiro , Christoph Lameter , Nick Piggin , Linux Kernel Mailing List , Lin Ming , Peter Zijlstra , Pekka Enberg , "Zhang, Yanmin" Subject: [PATCH] Properly account for freed pages in free_pages_bulk() and when allocating high-order pages in buffered_rmqueue() Message-ID: <20090428103159.GB23540@csn.ul.ie> References: <1240408407-21848-1-git-send-email-mel@csn.ul.ie> <1240819119.2567.884.camel@ymzhang> <20090427143845.GC912@csn.ul.ie> <1240883957.2567.886.camel@ymzhang> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <1240883957.2567.886.camel@ymzhang> User-Agent: Mutt/1.5.17+20080114 (2008-01-14) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch fixes two problems with one patch in the page allocator optimisation patchset. free_pages_bulk() updates the number of free pages in the zone but it is assuming that the pages being freed are order-0. While this is currently always true, it's wrong to assume the order is 0. This patch fixes the problem. buffered_rmqueue() is not updating NR_FREE_PAGES when allocating pages with __rmqueue(). As a result, a high-order allocation will leave an elevated free page count value leading to the situation where the free page count exceeds available RAM. This patch accounts for those allocated pages properly. This is a fix for page-allocator-update-nr_free_pages-only-as-necessary.patch. Reported-by: Zhang, Yanmin Signed-off-by: Mel Gorman --- mm/page_alloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5dd2d59..59eb2e1 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -545,7 +545,7 @@ static void free_pages_bulk(struct zone *zone, int count, zone_clear_flag(zone, ZONE_ALL_UNRECLAIMABLE); zone->pages_scanned = 0; - __mod_zone_page_state(zone, NR_FREE_PAGES, count); + __mod_zone_page_state(zone, NR_FREE_PAGES, count << order); while (count--) { struct page *page; @@ -1151,6 +1151,7 @@ again: } else { spin_lock_irqsave(&zone->lock, flags); page = __rmqueue(zone, order, migratetype); + __mod_zone_page_state(zone, NR_FREE_PAGES, -(1UL << order)); spin_unlock(&zone->lock); if (!page) goto failed;