From patchwork Wed Sep 25 23:18:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Srivatsa S. Bhat" X-Patchwork-Id: 2945861 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 216159F288 for ; Wed, 25 Sep 2013 23:28:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4E9DB20378 for ; Wed, 25 Sep 2013 23:28:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 718A720373 for ; Wed, 25 Sep 2013 23:28:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756018Ab3IYXXK (ORCPT ); Wed, 25 Sep 2013 19:23:10 -0400 Received: from e28smtp08.in.ibm.com ([122.248.162.8]:42069 "EHLO e28smtp08.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751961Ab3IYXXH (ORCPT ); Wed, 25 Sep 2013 19:23:07 -0400 Received: from /spool/local by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 26 Sep 2013 04:53:05 +0530 Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp08.in.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 26 Sep 2013 04:53:03 +0530 Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 50C743940057; Thu, 26 Sep 2013 04:52:47 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8PNPJPe26280158; Thu, 26 Sep 2013 04:55:19 +0530 Received: from d28av04.in.ibm.com (localhost [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8PNMx6I022444; Thu, 26 Sep 2013 04:53:02 +0530 Received: from srivatsabhat.in.ibm.com ([9.79.250.85]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8PNMtde022231; Thu, 26 Sep 2013 04:52:56 +0530 From: "Srivatsa S. Bhat" Subject: [RFC PATCH v4 22/40] mm: Propagate the sorted-buddy bias for picking free regions, to region allocator To: akpm@linux-foundation.org, mgorman@suse.de, dave@sr71.net, hannes@cmpxchg.org, tony.luck@intel.com, matthew.garrett@nebula.com, riel@redhat.com, arjan@linux.intel.com, srinivas.pandruvada@linux.intel.com, willy@linux.intel.com, kamezawa.hiroyu@jp.fujitsu.com, lenb@kernel.org, rjw@sisk.pl Cc: gargankita@gmail.com, paulmck@linux.vnet.ibm.com, svaidy@linux.vnet.ibm.com, andi@firstfloor.org, isimatu.yasuaki@jp.fujitsu.com, santosh.shilimkar@ti.com, kosaki.motohiro@gmail.com, srivatsa.bhat@linux.vnet.ibm.com, linux-pm@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Date: Thu, 26 Sep 2013 04:48:53 +0530 Message-ID: <20130925231852.26184.31885.stgit@srivatsabhat.in.ibm.com> In-Reply-To: <20130925231250.26184.31438.stgit@srivatsabhat.in.ibm.com> References: <20130925231250.26184.31438.stgit@srivatsabhat.in.ibm.com> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092523-2000-0000-0000-00000DDDF0A4 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The sorted-buddy page allocator keeps the buddy freelists sorted region-wise, and tries to pick lower numbered regions while allocating pages. The idea is to allocate regions in the increasing order of region number. Propagate the same bias to the region allocator as well. That is, make it favor lower numbered regions while allocating regions to the page allocator. To do this efficiently, add a bitmap to represent the regions in the region allocator, and use bitmap operations to manage these regions and to pick the lowest numbered free region efficiently. Signed-off-by: Srivatsa S. Bhat --- include/linux/mmzone.h | 1 + mm/page_alloc.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 7c87518..49c8926 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -125,6 +125,7 @@ struct mem_region { struct region_allocator { struct mem_region region[MAX_NR_ZONE_REGIONS]; int next_region; + DECLARE_BITMAP(ralloc_mask, MAX_NR_ZONE_REGIONS); }; struct pglist_data; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ee6c098..d5acea7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -935,7 +935,7 @@ static void add_to_region_allocator(struct zone *z, struct free_list *free_list, struct free_area_region *reg_area; struct list_head *ralloc_list; unsigned long nr_pages; - int order; + int order, *next_region; if (WARN_ON(list_empty(&free_list->list))) return; @@ -952,6 +952,13 @@ static void add_to_region_allocator(struct zone *z, struct free_list *free_list, WARN_ON(reg_area->nr_free != 0); reg_area->nr_free += nr_pages; + + set_bit(region_id, reg_alloc->ralloc_mask); + next_region = ®_alloc->next_region; + + if ((*next_region < 0) || + (*next_region > 0 && region_id < *next_region)) + *next_region = region_id; } /* Delete freepages from the region allocator and add them to buddy freelists */ @@ -982,6 +989,16 @@ static int del_from_region_allocator(struct zone *zone, unsigned int order, reg_area->nr_free -= nr_pages; WARN_ON(reg_area->nr_free != 0); + /* Pick a new next_region */ + clear_bit(next_region, reg_alloc->ralloc_mask); + next_region = find_first_bit(reg_alloc->ralloc_mask, + MAX_NR_ZONE_REGIONS); + + if (next_region >= MAX_NR_ZONE_REGIONS) + next_region = -1; /* No free regions available */ + + reg_alloc->next_region = next_region; + return 0; }