2019-02-06 12:11:36

by Mike Rapoport

[permalink] [raw]
Subject: [PATCH 0/2] memblock: minor cleanups

Hi,

These patches perform some minor cleanups in memblock.
Generated vs mmotm-2019-02-04-17-47.

Mike Rapoport (2):
memblock: remove memblock_{set,clear}_region_flags
memblock: split checks whether a region should be skipped to a helper
function

include/linux/memblock.h | 12 ----------
mm/memblock.c | 62 ++++++++++++++++++++++++------------------------
2 files changed, 31 insertions(+), 43 deletions(-)

--
2.7.4



2019-02-06 12:12:14

by Mike Rapoport

[permalink] [raw]
Subject: [PATCH 2/2] memblock: split checks whether a region should be skipped to a helper function

The __next_mem_range() and __next_mem_range_rev() duplucate the code that
checks whether a region should be skipped because of node or flags
incompatibility.

Split this code into a helper function.

Signed-off-by: Mike Rapoport <[email protected]>
---
mm/memblock.c | 53 +++++++++++++++++++++++++----------------------------
1 file changed, 25 insertions(+), 28 deletions(-)

diff --git a/mm/memblock.c b/mm/memblock.c
index af5fe8e..f87d3ae 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -958,6 +958,29 @@ void __init_memblock __next_reserved_mem_region(u64 *idx,
*idx = ULLONG_MAX;
}

+static bool should_skip_region(struct memblock_region *m, int nid, int flags)
+{
+ int m_nid = memblock_get_region_node(m);
+
+ /* only memory regions are associated with nodes, check it */
+ if (nid != NUMA_NO_NODE && nid != m_nid)
+ return true;
+
+ /* skip hotpluggable memory regions if needed */
+ if (movable_node_is_enabled() && memblock_is_hotpluggable(m))
+ return true;
+
+ /* if we want mirror memory skip non-mirror memory regions */
+ if ((flags & MEMBLOCK_MIRROR) && !memblock_is_mirror(m))
+ return true;
+
+ /* skip nomap memory unless we were asked for it explicitly */
+ if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m))
+ return true;
+
+ return false;
+}
+
/**
* __next__mem_range - next function for for_each_free_mem_range() etc.
* @idx: pointer to u64 loop variable
@@ -1005,20 +1028,7 @@ void __init_memblock __next_mem_range(u64 *idx, int nid,
phys_addr_t m_end = m->base + m->size;
int m_nid = memblock_get_region_node(m);

- /* only memory regions are associated with nodes, check it */
- if (nid != NUMA_NO_NODE && nid != m_nid)
- continue;
-
- /* skip hotpluggable memory regions if needed */
- if (movable_node_is_enabled() && memblock_is_hotpluggable(m))
- continue;
-
- /* if we want mirror memory skip non-mirror memory regions */
- if ((flags & MEMBLOCK_MIRROR) && !memblock_is_mirror(m))
- continue;
-
- /* skip nomap memory unless we were asked for it explicitly */
- if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m))
+ if (should_skip_region(m, nid, flags))
continue;

if (!type_b) {
@@ -1122,20 +1132,7 @@ void __init_memblock __next_mem_range_rev(u64 *idx, int nid,
phys_addr_t m_end = m->base + m->size;
int m_nid = memblock_get_region_node(m);

- /* only memory regions are associated with nodes, check it */
- if (nid != NUMA_NO_NODE && nid != m_nid)
- continue;
-
- /* skip hotpluggable memory regions if needed */
- if (movable_node_is_enabled() && memblock_is_hotpluggable(m))
- continue;
-
- /* if we want mirror memory skip non-mirror memory regions */
- if ((flags & MEMBLOCK_MIRROR) && !memblock_is_mirror(m))
- continue;
-
- /* skip nomap memory unless we were asked for it explicitly */
- if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m))
+ if (should_skip_region(m, nid, flags))
continue;

if (!type_b) {
--
2.7.4


2019-02-06 12:34:23

by Mike Rapoport

[permalink] [raw]
Subject: [PATCH 1/2] memblock: remove memblock_{set,clear}_region_flags

The memblock API provides dedicated helpers to set or clear a flag on a
memory region, e.g. memblock_{mark,clear}_hotplug().

The memblock_{set,clear}_region_flags() functions are used only by the
memblock internal function that adjusts the region flags.
Drop these functions and use open-coded implementation instead.

Signed-off-by: Mike Rapoport <[email protected]>
---
include/linux/memblock.h | 12 ------------
mm/memblock.c | 9 ++++++---
2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 71c9e32..32a9a6b 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -317,18 +317,6 @@ void __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \
nid, flags, p_start, p_end, p_nid)

-static inline void memblock_set_region_flags(struct memblock_region *r,
- enum memblock_flags flags)
-{
- r->flags |= flags;
-}
-
-static inline void memblock_clear_region_flags(struct memblock_region *r,
- enum memblock_flags flags)
-{
- r->flags &= ~flags;
-}
-
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
int memblock_set_node(phys_addr_t base, phys_addr_t size,
struct memblock_type *type, int nid);
diff --git a/mm/memblock.c b/mm/memblock.c
index 0151a5b..af5fe8e 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -851,11 +851,14 @@ static int __init_memblock memblock_setclr_flag(phys_addr_t base,
if (ret)
return ret;

- for (i = start_rgn; i < end_rgn; i++)
+ for (i = start_rgn; i < end_rgn; i++) {
+ struct memblock_region *r = &type->regions[i];
+
if (set)
- memblock_set_region_flags(&type->regions[i], flag);
+ r->flags |= flag;
else
- memblock_clear_region_flags(&type->regions[i], flag);
+ r->flags &= ~flag;
+ }

memblock_merge_regions(type);
return 0;
--
2.7.4


2019-02-07 16:28:53

by Souptick Joarder

[permalink] [raw]
Subject: Re: [PATCH 1/2] memblock: remove memblock_{set,clear}_region_flags

On Wed, Feb 6, 2019 at 6:01 PM Mike Rapoport <[email protected]> wrote:
>
> The memblock API provides dedicated helpers to set or clear a flag on a
> memory region, e.g. memblock_{mark,clear}_hotplug().
>
> The memblock_{set,clear}_region_flags() functions are used only by the
> memblock internal function that adjusts the region flags.
> Drop these functions and use open-coded implementation instead.
>
> Signed-off-by: Mike Rapoport <[email protected]>
> ---
> include/linux/memblock.h | 12 ------------
> mm/memblock.c | 9 ++++++---
> 2 files changed, 6 insertions(+), 15 deletions(-)
>
> diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> index 71c9e32..32a9a6b 100644
> --- a/include/linux/memblock.h
> +++ b/include/linux/memblock.h
> @@ -317,18 +317,6 @@ void __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
> for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \
> nid, flags, p_start, p_end, p_nid)
>
> -static inline void memblock_set_region_flags(struct memblock_region *r,
> - enum memblock_flags flags)
> -{
> - r->flags |= flags;
> -}
> -
> -static inline void memblock_clear_region_flags(struct memblock_region *r,
> - enum memblock_flags flags)
> -{
> - r->flags &= ~flags;
> -}
> -
> #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
> int memblock_set_node(phys_addr_t base, phys_addr_t size,
> struct memblock_type *type, int nid);
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 0151a5b..af5fe8e 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -851,11 +851,14 @@ static int __init_memblock memblock_setclr_flag(phys_addr_t base,
> if (ret)
> return ret;
>
> - for (i = start_rgn; i < end_rgn; i++)
> + for (i = start_rgn; i < end_rgn; i++) {
> + struct memblock_region *r = &type->regions[i];

Is it fine if we drop this memblock_region *r altogether ?

> +
> if (set)
> - memblock_set_region_flags(&type->regions[i], flag);
> + r->flags |= flag;
> else
> - memblock_clear_region_flags(&type->regions[i], flag);
> + r->flags &= ~flag;
> + }
>
> memblock_merge_regions(type);
> return 0;
> --
> 2.7.4
>

2019-02-08 10:04:42

by Mike Rapoport

[permalink] [raw]
Subject: Re: [PATCH 1/2] memblock: remove memblock_{set,clear}_region_flags

On Thu, Feb 07, 2019 at 10:02:24PM +0530, Souptick Joarder wrote:
> On Wed, Feb 6, 2019 at 6:01 PM Mike Rapoport <[email protected]> wrote:
> >
> > The memblock API provides dedicated helpers to set or clear a flag on a
> > memory region, e.g. memblock_{mark,clear}_hotplug().
> >
> > The memblock_{set,clear}_region_flags() functions are used only by the
> > memblock internal function that adjusts the region flags.
> > Drop these functions and use open-coded implementation instead.
> >
> > Signed-off-by: Mike Rapoport <[email protected]>
> > ---
> > include/linux/memblock.h | 12 ------------
> > mm/memblock.c | 9 ++++++---
> > 2 files changed, 6 insertions(+), 15 deletions(-)
> >
> > diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> > index 71c9e32..32a9a6b 100644
> > --- a/include/linux/memblock.h
> > +++ b/include/linux/memblock.h
> > @@ -317,18 +317,6 @@ void __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
> > for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \
> > nid, flags, p_start, p_end, p_nid)
> >
> > -static inline void memblock_set_region_flags(struct memblock_region *r,
> > - enum memblock_flags flags)
> > -{
> > - r->flags |= flags;
> > -}
> > -
> > -static inline void memblock_clear_region_flags(struct memblock_region *r,
> > - enum memblock_flags flags)
> > -{
> > - r->flags &= ~flags;
> > -}
> > -
> > #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
> > int memblock_set_node(phys_addr_t base, phys_addr_t size,
> > struct memblock_type *type, int nid);
> > diff --git a/mm/memblock.c b/mm/memblock.c
> > index 0151a5b..af5fe8e 100644
> > --- a/mm/memblock.c
> > +++ b/mm/memblock.c
> > @@ -851,11 +851,14 @@ static int __init_memblock memblock_setclr_flag(phys_addr_t base,
> > if (ret)
> > return ret;
> >
> > - for (i = start_rgn; i < end_rgn; i++)
> > + for (i = start_rgn; i < end_rgn; i++) {
> > + struct memblock_region *r = &type->regions[i];
>
> Is it fine if we drop this memblock_region *r altogether ?

I prefer using a local variable to

type->regions[i].flags

> > +
> > if (set)
> > - memblock_set_region_flags(&type->regions[i], flag);
> > + r->flags |= flag;
> > else
> > - memblock_clear_region_flags(&type->regions[i], flag);
> > + r->flags &= ~flag;
> > + }
> >
> > memblock_merge_regions(type);
> > return 0;
> > --
> > 2.7.4
> >
>

--
Sincerely yours,
Mike.