From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: akpm@linux-foundation.org, mgorman@suse.de, mjg59@srcf.ucam.org,
paulmck@linux.vnet.ibm.com, dave@linux.vnet.ibm.com,
maxime.coquelin@stericsson.com, loic.pallardy@stericsson.com,
arjan@linux.intel.com, kmpark@infradead.org,
kamezawa.hiroyu@jp.fujitsu.com, lenb@kernel.org, rjw@sisk.pl
Cc: gargankita@gmail.com, amit.kachhap@linaro.org,
svaidy@linux.vnet.ibm.com, thomas.abraham@linaro.org,
santosh.shilimkar@ti.com, srivatsa.bhat@linux.vnet.ibm.com,
linux-pm@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: [RFC PATCH 3/8] mm: Introduce and initialize zone memory regions
Date: Wed, 07 Nov 2012 01:23:02 +0530 [thread overview]
Message-ID: <20121106195256.6941.69079.stgit@srivatsabhat.in.ibm.com> (raw)
In-Reply-To: <20121106195026.6941.24662.stgit@srivatsabhat.in.ibm.com>
Memory region boundaries don't necessarily fit on zone boundaries. So we need
to maintain a zone-level mapping of the absolute memory region boundaries.
"Node Memory Regions" will be used to capture the absolute region boundaries.
Add "Zone Memory Regions" to track the subsets of the absolute memory regions
that fall within the zone boundaries.
Eg:
|<---------------------Node---------------------->|
_________________________________________________
| Node mem reg 0 | Node mem reg 1 |
|_______________________|_________________________|
_________________________________________________
| ZONE_DMA | ZONE_NORMAL |
|_______________|_________________________________|
In the above figure,
ZONE_DMA has only 1 zone memory region (say, Zone mem reg 0) which is a subset
of Node mem reg 0.
ZONE_NORMAL has 2 zone memory regions (say, Zone mem reg 0 and Zone mem reg 1)
which are subsets of Node mem reg 0 and Node mem reg 1 respectively.
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---
include/linux/mmzone.h | 9 +++++++++
mm/page_alloc.c | 42 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index bb7c3ef..9f923aa 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -339,6 +339,12 @@ struct node_mem_region {
struct pglist_data *pgdat;
};
+struct zone_mem_region {
+ unsigned long start_pfn;
+ unsigned long spanned_pages;
+ unsigned long present_pages;
+};
+
struct zone {
/* Fields commonly accessed by the page allocator */
@@ -403,6 +409,9 @@ struct zone {
#endif
struct free_area free_area[MAX_ORDER];
+ struct zone_mem_region zone_mem_region[MAX_NR_REGIONS];
+ int nr_zone_regions;
+
#ifndef CONFIG_SPARSEMEM
/*
* Flags for a pageblock_nr_pages block. See pageblock-flags.h.
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 709e3c1..c00f72d 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -4594,6 +4594,46 @@ void init_node_memory_regions(struct pglist_data *pgdat)
}
}
+void init_zone_memory_regions(struct pglist_data *pgdat)
+{
+ unsigned long start_pfn, end_pfn, absent;
+ int i, j, idx, nid = pgdat->node_id;
+ struct node_mem_region *region;
+ struct zone *z;
+
+ for (i = 0; i < pgdat->nr_zones; i++) {
+ z = &pgdat->node_zones[i];
+ idx = 0;
+
+ for (j = 0; j < pgdat->nr_node_regions; j++) {
+ region = &pgdat->node_regions[j];
+ start_pfn = max(z->zone_start_pfn, region->start_pfn);
+ end_pfn = min(z->zone_start_pfn + z->spanned_pages,
+ region->start_pfn + region->spanned_pages);
+
+ if (start_pfn >= end_pfn)
+ continue;
+
+ z->zone_mem_region[idx].start_pfn = start_pfn;
+ z->zone_mem_region[idx].spanned_pages = end_pfn - start_pfn;
+
+ absent = __absent_pages_in_range(nid, start_pfn,
+ end_pfn);
+ z->zone_mem_region[idx].present_pages =
+ end_pfn - start_pfn - absent;
+ idx++;
+ }
+
+ z->nr_zone_regions = idx;
+ }
+}
+
+void init_memory_regions(struct pglist_data *pgdat)
+{
+ init_node_memory_regions(pgdat);
+ init_zone_memory_regions(pgdat);
+}
+
void __paginginit free_area_init_node(int nid, unsigned long *zones_size,
unsigned long node_start_pfn, unsigned long *zholes_size)
{
@@ -4615,7 +4655,7 @@ void __paginginit free_area_init_node(int nid, unsigned long *zones_size,
#endif
free_area_init_core(pgdat, zones_size, zholes_size);
- init_node_memory_regions(pgdat);
+ init_memory_regions(pgdat);
}
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-11-06 19:54 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-06 19:52 [RFC PATCH 0/8][Sorted-buddy] mm: Linux VM Infrastructure to support Memory Power Management Srivatsa S. Bhat
2012-11-06 19:52 ` [RFC PATCH 1/8] mm: Introduce memory regions data-structure to capture region boundaries within node Srivatsa S. Bhat
2012-11-06 23:03 ` Dave Hansen
2012-11-07 20:12 ` Srivatsa S. Bhat
2012-11-06 19:52 ` [RFC PATCH 2/8] mm: Initialize node memory regions during boot Srivatsa S. Bhat
2012-12-04 8:25 ` wujianguo
2012-11-06 19:53 ` Srivatsa S. Bhat [this message]
2012-11-06 19:53 ` [RFC PATCH 4/8] mm: Add helpers to retrieve node region and zone region for a given page Srivatsa S. Bhat
2012-11-16 18:39 ` [RFC PATCH UPDATED " Srivatsa S. Bhat
2012-11-06 19:53 ` [RFC PATCH 5/8] mm: Add data-structures to describe memory regions within the zones' freelists Srivatsa S. Bhat
2012-11-06 19:53 ` [RFC PATCH 6/8] mm: Demarcate and maintain pageblocks in region-order in " Srivatsa S. Bhat
2012-11-06 21:49 ` Dave Hansen
2012-11-07 20:15 ` Srivatsa S. Bhat
2012-11-09 6:22 ` Ankita Garg
2012-11-09 6:01 ` Ankita Garg
2012-11-09 9:03 ` Srivatsa S. Bhat
2012-11-06 19:54 ` [RFC PATCH 7/8] mm: Add an optimized version of del_from_freelist to keep page allocation fast Srivatsa S. Bhat
2012-11-06 19:54 ` [RFC PATCH 8/8] mm: Print memory region statistics to understand the buddy allocator behavior Srivatsa S. Bhat
2012-11-08 18:02 ` [RFC PATCH 0/8][Sorted-buddy] mm: Linux VM Infrastructure to support Memory Power Management Mel Gorman
2012-11-08 19:38 ` Srivatsa S. Bhat
2012-11-09 5:14 ` Vaidyanathan Srinivasan
2012-11-09 9:00 ` Mel Gorman
2012-11-09 14:51 ` Srivatsa S. Bhat
2012-11-09 15:23 ` Srivatsa S. Bhat
2012-11-09 16:13 ` Dave Hansen
2012-11-09 16:34 ` Srivatsa S. Bhat
2012-11-09 16:43 ` Srivatsa S. Bhat
2012-11-09 16:52 ` Srivatsa S. Bhat
2012-11-16 18:32 ` Srivatsa S. Bhat
2012-11-09 15:34 ` Arjan van de Ven
[not found] ` <loom.20121109T172910-394@post.gmane.org>
2012-11-12 16:14 ` Srivatsa S. Bhat
2012-12-04 10:51 ` wujianguo
2012-12-06 6:32 ` Srivatsa S. Bhat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121106195256.6941.69079.stgit@srivatsabhat.in.ibm.com \
--to=srivatsa.bhat@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=amit.kachhap@linaro.org \
--cc=arjan@linux.intel.com \
--cc=dave@linux.vnet.ibm.com \
--cc=gargankita@gmail.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kmpark@infradead.org \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pm@vger.kernel.org \
--cc=loic.pallardy@stericsson.com \
--cc=maxime.coquelin@stericsson.com \
--cc=mgorman@suse.de \
--cc=mjg59@srcf.ucam.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=rjw@sisk.pl \
--cc=santosh.shilimkar@ti.com \
--cc=svaidy@linux.vnet.ibm.com \
--cc=thomas.abraham@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).