Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755843AbZDVOAK (ORCPT ); Wed, 22 Apr 2009 10:00:10 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755090AbZDVNxq (ORCPT ); Wed, 22 Apr 2009 09:53:46 -0400 Received: from gir.skynet.ie ([193.1.99.77]:43842 "EHLO gir.skynet.ie" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755492AbZDVNxm (ORCPT ); Wed, 22 Apr 2009 09:53:42 -0400 From: Mel Gorman To: Mel Gorman , Linux Memory Management List Cc: KOSAKI Motohiro , Christoph Lameter , Nick Piggin , Linux Kernel Mailing List , Lin Ming , Zhang Yanmin , Peter Zijlstra , Pekka Enberg , Andrew Morton Subject: [PATCH 18/22] Use allocation flags as an index to the zone watermark Date: Wed, 22 Apr 2009 14:53:23 +0100 Message-Id: <1240408407-21848-19-git-send-email-mel@csn.ul.ie> X-Mailer: git-send-email 1.5.6.5 In-Reply-To: <1240408407-21848-1-git-send-email-mel@csn.ul.ie> References: <1240408407-21848-1-git-send-email-mel@csn.ul.ie> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3012 Lines: 80 ALLOC_WMARK_MIN, ALLOC_WMARK_LOW and ALLOC_WMARK_HIGH determin whether pages_min, pages_low or pages_high is used as the zone watermark when allocating the pages. Two branches in the allocator hotpath determine which watermark to use. This patch uses the flags as an array index and places the three watermarks in a union with an array so it can be offset. This means the flags can be used as an array index and reduces the branches taken. Signed-off-by: Mel Gorman Reviewed-by: Christoph Lameter --- include/linux/mmzone.h | 8 +++++++- mm/page_alloc.c | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index f82bdba..c1fa208 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -275,7 +275,13 @@ struct zone_reclaim_stat { struct zone { /* Fields commonly accessed by the page allocator */ - unsigned long pages_min, pages_low, pages_high; + union { + struct { + unsigned long pages_min, pages_low, pages_high; + }; + unsigned long pages_mark[3]; + }; + /* * We don't know if the memory that we're going to allocate will be freeable * or/and it will be released eventually, so to avoid totally wasting several diff --git a/mm/page_alloc.c b/mm/page_alloc.c index b174f2c..6030f49 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1154,10 +1154,15 @@ failed: return NULL; } -#define ALLOC_NO_WATERMARKS 0x01 /* don't check watermarks at all */ -#define ALLOC_WMARK_MIN 0x02 /* use pages_min watermark */ -#define ALLOC_WMARK_LOW 0x04 /* use pages_low watermark */ -#define ALLOC_WMARK_HIGH 0x08 /* use pages_high watermark */ +/* The WMARK bits are used as an index zone->pages_mark */ +#define ALLOC_WMARK_MIN 0x00 /* use pages_min watermark */ +#define ALLOC_WMARK_LOW 0x01 /* use pages_low watermark */ +#define ALLOC_WMARK_HIGH 0x02 /* use pages_high watermark */ +#define ALLOC_NO_WATERMARKS 0x04 /* don't check watermarks at all */ + +/* Mask to get the watermark bits */ +#define ALLOC_WMARK_MASK (ALLOC_NO_WATERMARKS-1) + #define ALLOC_HARDER 0x10 /* try to alloc harder */ #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ @@ -1445,12 +1450,7 @@ zonelist_scan: if (!(alloc_flags & ALLOC_NO_WATERMARKS)) { unsigned long mark; - if (alloc_flags & ALLOC_WMARK_MIN) - mark = zone->pages_min; - else if (alloc_flags & ALLOC_WMARK_LOW) - mark = zone->pages_low; - else - mark = zone->pages_high; + mark = zone->pages_mark[alloc_flags & ALLOC_WMARK_MASK]; if (!zone_watermark_ok(zone, order, mark, classzone_idx, alloc_flags)) { if (!zone_reclaim_mode || -- 1.5.6.5 -- 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/