2021-07-07 15:10:38

by Ohhoon Kwon

[permalink] [raw]
Subject: [PATCH v4 0/3] mm: sparse: remove __section_nr() function

This series contains cleanups to remove __section_nr().

In contrast to v1, there were some modifications on commit messages
In contrast to v2, [PATCH 1/3] has been updated to pass section_nr as
well as mem_section, as Michal suggested.

Also, I appended acked-by's and reviewed-by's from the initial mailing
list for convenience.

Ohhoon Kwon (3):
mm: sparse: pass section_nr to section_mark_present
mm: sparse: pass section_nr to find_memory_block
mm: sparse: remove __section_nr() function

.../platforms/pseries/hotplug-memory.c | 4 +--
drivers/base/memory.c | 4 +--
include/linux/memory.h | 2 +-
include/linux/mmzone.h | 1 -
mm/sparse.c | 35 +++----------------
5 files changed, 8 insertions(+), 38 deletions(-)

--
2.17.1


2021-07-07 15:11:29

by Ohhoon Kwon

[permalink] [raw]
Subject: [PATCH v4 3/3] mm: sparse: remove __section_nr() function

As the last users of __section_nr() are gone, let's remove unused
function __section_nr().

Signed-off-by: Ohhoon Kwon <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Acked-by: Mike Rapoport <[email protected]>
Reviewed-by: David Hildenbrand <[email protected]>
---
include/linux/mmzone.h | 1 -
mm/sparse.c | 26 --------------------------
2 files changed, 27 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index fcb535560028..8827f4d081d4 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1342,7 +1342,6 @@ static inline struct mem_section *__nr_to_section(unsigned long nr)
return NULL;
return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
}
-extern unsigned long __section_nr(struct mem_section *ms);
extern size_t mem_section_usage_size(void);

/*
diff --git a/mm/sparse.c b/mm/sparse.c
index 8018ee7fcda5..d85655242ed9 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -109,32 +109,6 @@ static inline int sparse_index_init(unsigned long section_nr, int nid)
}
#endif

-#ifdef CONFIG_SPARSEMEM_EXTREME
-unsigned long __section_nr(struct mem_section *ms)
-{
- unsigned long root_nr;
- struct mem_section *root = NULL;
-
- for (root_nr = 0; root_nr < NR_SECTION_ROOTS; root_nr++) {
- root = __nr_to_section(root_nr * SECTIONS_PER_ROOT);
- if (!root)
- continue;
-
- if ((ms >= root) && (ms < (root + SECTIONS_PER_ROOT)))
- break;
- }
-
- VM_BUG_ON(!root);
-
- return (root_nr * SECTIONS_PER_ROOT) + (ms - root);
-}
-#else
-unsigned long __section_nr(struct mem_section *ms)
-{
- return (unsigned long)(ms - mem_section[0]);
-}
-#endif
-
/*
* During early boot, before section_mem_map is used for an actual
* mem_map, we use section_mem_map to store the section's NUMA
--
2.17.1

2021-07-07 16:17:44

by Ohhoon Kwon

[permalink] [raw]
Subject: [PATCH v4 1/3] mm: sparse: pass section_nr to section_mark_present

With CONFIG_SPARSEMEM_EXTREME enabled, __section_nr() which converts
mem_section to section_nr could be costly since it iterates all
section roots to check if the given mem_section is in its range.

Since both callers of section_mark_present already know section_nr,
let's also pass section_nr as well as mem_section in order to reduce
costly translation.

Signed-off-by: Ohhoon Kwon <[email protected]>
Acked-by: Mike Rapoport <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Reviewed-by: David Hildenbrand <[email protected]>
---
mm/sparse.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index 6326cdf36c4f..8018ee7fcda5 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -187,10 +187,9 @@ void __meminit mminit_validate_memmodel_limits(unsigned long *start_pfn,
* those loops early.
*/
unsigned long __highest_present_section_nr;
-static void section_mark_present(struct mem_section *ms)
+static void __section_mark_present(struct mem_section *ms,
+ unsigned long section_nr)
{
- unsigned long section_nr = __section_nr(ms);
-
if (section_nr > __highest_present_section_nr)
__highest_present_section_nr = section_nr;

@@ -280,7 +279,7 @@ static void __init memory_present(int nid, unsigned long start, unsigned long en
if (!ms->section_mem_map) {
ms->section_mem_map = sparse_encode_early_nid(nid) |
SECTION_IS_ONLINE;
- section_mark_present(ms);
+ __section_mark_present(ms, section);
}
}
}
@@ -934,7 +933,7 @@ int __meminit sparse_add_section(int nid, unsigned long start_pfn,

ms = __nr_to_section(section_nr);
set_section_nid(section_nr, nid);
- section_mark_present(ms);
+ __section_mark_present(ms, section_nr);

/* Align memmap to section boundary in the subsection case */
if (section_nr_to_pfn(section_nr) != start_pfn)
--
2.17.1