linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Wei Yang <richard.weiyang@gmail.com>
To: akpm@linux-foundation.org
Cc: mhocko@suse.com, tj@kernel.org, linux-mm@kvack.org,
	Wei Yang <richard.weiyang@gmail.com>
Subject: [PATCH] mm/page_alloc: optimize find_min_pfn_for_node() by geting the minimal pfn directly
Date: Wed, 28 Mar 2018 11:47:52 +0800	[thread overview]
Message-ID: <20180328034752.96146-1-richard.weiyang@gmail.com> (raw)
In-Reply-To: <20180327183757.f66f5fc200109c06b7a4b620@linux-foundation.org>

find_min_pfn_for_node() iterates on pfn range to find the minimum pfn for a
node, while this process could be optimized. The memblock_region in
memblock_type are already in ascending order, so the first one is the
minimal one.

For example, if there are 30 memory regions, the original version would
iterate all 30 regions, while the new version just need iterate a single
time.

This patch does a trivial optimization by adding first_mem_pfn() and use
this to get the minimal pfn directly.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>

---
v2:
    * add first_mem_pfn() and use it to replace for_each_mem_pfn_ragne()
    * some more meaningful words in change log
---
 include/linux/memblock.h |  9 +++++++++
 mm/page_alloc.c          | 14 ++++++++------
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 8be5077efb5f..22932f45538f 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -189,6 +189,15 @@ void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
 			  unsigned long *out_end_pfn, int *out_nid);
 unsigned long memblock_next_valid_pfn(unsigned long pfn, unsigned long max_pfn);
 
+/**
+ * first_mem_pfn - get the first memory pfn
+ * @i: an integer used as an indicator
+ * @nid: node selector, %MAX_NUMNODES for all nodes
+ * @p_first: ptr to ulong for first pfn of the range, can be %NULL
+ */
+#define first_mem_pfn(i, nid, p_first)				\
+	__next_mem_pfn_range(&i, nid, p_first, NULL, NULL)
+
 /**
  * for_each_mem_pfn_range - early memory pfn range iterator
  * @i: an integer used as loop variable
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 635d7dd29d7f..8c964dcc3a9e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6365,14 +6365,16 @@ unsigned long __init node_map_pfn_alignment(void)
 /* Find the lowest pfn for a node */
 static unsigned long __init find_min_pfn_for_node(int nid)
 {
-	unsigned long min_pfn = ULONG_MAX;
-	unsigned long start_pfn;
-	int i;
+	unsigned long min_pfn;
+	int i = -1;
 
-	for_each_mem_pfn_range(i, nid, &start_pfn, NULL, NULL)
-		min_pfn = min(min_pfn, start_pfn);
+	/*
+	 * The first pfn on nid node is the minimal one, as the pfn's are
+	 * stored in ascending order.
+	 */
+	first_mem_pfn(i, nid, &min_pfn);
 
-	if (min_pfn == ULONG_MAX) {
+	if (i == -1) {
 		pr_warn("Could not find start_pfn for node %d\n", nid);
 		return 0;
 	}
-- 
2.15.1

  parent reply	other threads:[~2018-03-28  3:48 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-27  3:57 [PATCH] mm/page_alloc: break on the first hit of mem range Wei Yang
2018-03-27 10:58 ` Michal Hocko
2018-03-28  0:39   ` Wei Yang
2018-03-28  7:02     ` Michal Hocko
2018-03-28 13:17       ` Wei Yang
2018-03-27 22:47 ` Andrew Morton
2018-03-28  0:51   ` Wei Yang
2018-03-28  1:37     ` Andrew Morton
2018-03-28  3:44       ` Wei Yang
2018-03-28  3:47       ` Wei Yang [this message]
2018-03-28 11:58         ` [PATCH] mm/page_alloc: optimize find_min_pfn_for_node() by geting the minimal pfn directly Michal Hocko
2018-03-28 13:34           ` Wei Yang
2018-03-28 14:02             ` Michal Hocko

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=20180328034752.96146-1-richard.weiyang@gmail.com \
    --to=richard.weiyang@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=tj@kernel.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).