Function ‘is_pageblock_removable_nolock’ is not used unless
CONFIG_MEMORY_HOTREMOVE is activated. Move it in between #ifdef sentinel to
match prototype in <linux/memory_hotplug.h>. Silence gcc warning (W=1):
mm/page_alloc.c:7704:6: warning: no previous prototype for ‘is_pageblock_removable_nolock’ [-Wmissing-prototypes]
Signed-off-by: Mathieu Malaterre <[email protected]>
---
mm/page_alloc.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 905db9d7962f..94ca579938e5 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -7701,6 +7701,7 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
return false;
}
+#ifdef CONFIG_MEMORY_HOTREMOVE
bool is_pageblock_removable_nolock(struct page *page)
{
struct zone *zone;
@@ -7723,6 +7724,7 @@ bool is_pageblock_removable_nolock(struct page *page)
return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
}
+#endif
#if (defined(CONFIG_MEMORY_ISOLATION) && defined(CONFIG_COMPACTION)) || defined(CONFIG_CMA)
--
2.11.0
On Sat 05-05-18 22:11:06, Mathieu Malaterre wrote:
> Function ‘is_pageblock_removable_nolock’ is not used unless
> CONFIG_MEMORY_HOTREMOVE is activated. Move it in between #ifdef sentinel to
> match prototype in <linux/memory_hotplug.h>. Silence gcc warning (W=1):
>
> mm/page_alloc.c:7704:6: warning: no previous prototype for ‘is_pageblock_removable_nolock’ [-Wmissing-prototypes]
Could you move is_pageblock_removable_nolock to mm/memory_hotplug.c
and make it static instead? There is only one caller
is_mem_section_removable so there shouldn't be any real reason to have
it extern and add more ifdefs.
> Signed-off-by: Mathieu Malaterre <[email protected]>
> ---
> mm/page_alloc.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 905db9d7962f..94ca579938e5 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -7701,6 +7701,7 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
> return false;
> }
>
> +#ifdef CONFIG_MEMORY_HOTREMOVE
> bool is_pageblock_removable_nolock(struct page *page)
> {
> struct zone *zone;
> @@ -7723,6 +7724,7 @@ bool is_pageblock_removable_nolock(struct page *page)
>
> return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
> }
> +#endif
>
> #if (defined(CONFIG_MEMORY_ISOLATION) && defined(CONFIG_COMPACTION)) || defined(CONFIG_CMA)
>
> --
> 2.11.0
>
--
Michal Hocko
SUSE Labs
Function ‘is_pageblock_removable_nolock’ is not used outside of
mm/memory_hotplug.c. Move it next to unique caller:
‘is_mem_section_removable’ and make it static.
Remove prototype in <linux/memory_hotplug.h>. Silence gcc warning (W=1):
mm/page_alloc.c:7704:6: warning: no previous prototype for ‘is_pageblock_removable_nolock’ [-Wmissing-prototypes]
Suggested-by: Michal Hocko <[email protected]>
Signed-off-by: Mathieu Malaterre <[email protected]>
---
v2: this function can be made static, make it so
include/linux/memory_hotplug.h | 1 -
mm/memory_hotplug.c | 23 +++++++++++++++++++++++
mm/page_alloc.c | 23 -----------------------
3 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index e0e49b5b1ee1..9566d551a41b 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -107,7 +107,6 @@ static inline bool movable_node_is_enabled(void)
}
#ifdef CONFIG_MEMORY_HOTREMOVE
-extern bool is_pageblock_removable_nolock(struct page *page);
extern int arch_remove_memory(u64 start, u64 size,
struct vmem_altmap *altmap);
extern int __remove_pages(struct zone *zone, unsigned long start_pfn,
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index f74826cdceea..9342e120518a 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1237,6 +1237,29 @@ static struct page *next_active_pageblock(struct page *page)
return page + pageblock_nr_pages;
}
+static bool is_pageblock_removable_nolock(struct page *page)
+{
+ struct zone *zone;
+ unsigned long pfn;
+
+ /*
+ * We have to be careful here because we are iterating over memory
+ * sections which are not zone aware so we might end up outside of
+ * the zone but still within the section.
+ * We have to take care about the node as well. If the node is offline
+ * its NODE_DATA will be NULL - see page_zone.
+ */
+ if (!node_online(page_to_nid(page)))
+ return false;
+
+ zone = page_zone(page);
+ pfn = page_to_pfn(page);
+ if (!zone_spans_pfn(zone, pfn))
+ return false;
+
+ return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
+}
+
/* Checks if this range of memory is likely to be hot-removable. */
bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
{
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 905db9d7962f..52731601ca5a 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -7701,29 +7701,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
return false;
}
-bool is_pageblock_removable_nolock(struct page *page)
-{
- struct zone *zone;
- unsigned long pfn;
-
- /*
- * We have to be careful here because we are iterating over memory
- * sections which are not zone aware so we might end up outside of
- * the zone but still within the section.
- * We have to take care about the node as well. If the node is offline
- * its NODE_DATA will be NULL - see page_zone.
- */
- if (!node_online(page_to_nid(page)))
- return false;
-
- zone = page_zone(page);
- pfn = page_to_pfn(page);
- if (!zone_spans_pfn(zone, pfn))
- return false;
-
- return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
-}
-
#if (defined(CONFIG_MEMORY_ISOLATION) && defined(CONFIG_COMPACTION)) || defined(CONFIG_CMA)
static unsigned long pfn_max_align_down(unsigned long pfn)
--
2.11.0
On Wed 09-05-18 20:59:57, Mathieu Malaterre wrote:
> Function ‘is_pageblock_removable_nolock’ is not used outside of
> mm/memory_hotplug.c. Move it next to unique caller:
> ‘is_mem_section_removable’ and make it static.
> Remove prototype in <linux/memory_hotplug.h>. Silence gcc warning (W=1):
>
> mm/page_alloc.c:7704:6: warning: no previous prototype for ‘is_pageblock_removable_nolock’ [-Wmissing-prototypes]
>
> Suggested-by: Michal Hocko <[email protected]>
> Signed-off-by: Mathieu Malaterre <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Thanks!
> ---
> v2: this function can be made static, make it so
>
> include/linux/memory_hotplug.h | 1 -
> mm/memory_hotplug.c | 23 +++++++++++++++++++++++
> mm/page_alloc.c | 23 -----------------------
> 3 files changed, 23 insertions(+), 24 deletions(-)
>
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index e0e49b5b1ee1..9566d551a41b 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -107,7 +107,6 @@ static inline bool movable_node_is_enabled(void)
> }
>
> #ifdef CONFIG_MEMORY_HOTREMOVE
> -extern bool is_pageblock_removable_nolock(struct page *page);
> extern int arch_remove_memory(u64 start, u64 size,
> struct vmem_altmap *altmap);
> extern int __remove_pages(struct zone *zone, unsigned long start_pfn,
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index f74826cdceea..9342e120518a 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -1237,6 +1237,29 @@ static struct page *next_active_pageblock(struct page *page)
> return page + pageblock_nr_pages;
> }
>
> +static bool is_pageblock_removable_nolock(struct page *page)
> +{
> + struct zone *zone;
> + unsigned long pfn;
> +
> + /*
> + * We have to be careful here because we are iterating over memory
> + * sections which are not zone aware so we might end up outside of
> + * the zone but still within the section.
> + * We have to take care about the node as well. If the node is offline
> + * its NODE_DATA will be NULL - see page_zone.
> + */
> + if (!node_online(page_to_nid(page)))
> + return false;
> +
> + zone = page_zone(page);
> + pfn = page_to_pfn(page);
> + if (!zone_spans_pfn(zone, pfn))
> + return false;
> +
> + return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
> +}
> +
> /* Checks if this range of memory is likely to be hot-removable. */
> bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
> {
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 905db9d7962f..52731601ca5a 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -7701,29 +7701,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
> return false;
> }
>
> -bool is_pageblock_removable_nolock(struct page *page)
> -{
> - struct zone *zone;
> - unsigned long pfn;
> -
> - /*
> - * We have to be careful here because we are iterating over memory
> - * sections which are not zone aware so we might end up outside of
> - * the zone but still within the section.
> - * We have to take care about the node as well. If the node is offline
> - * its NODE_DATA will be NULL - see page_zone.
> - */
> - if (!node_online(page_to_nid(page)))
> - return false;
> -
> - zone = page_zone(page);
> - pfn = page_to_pfn(page);
> - if (!zone_spans_pfn(zone, pfn))
> - return false;
> -
> - return !has_unmovable_pages(zone, page, 0, MIGRATE_MOVABLE, true);
> -}
> -
> #if (defined(CONFIG_MEMORY_ISOLATION) && defined(CONFIG_COMPACTION)) || defined(CONFIG_CMA)
>
> static unsigned long pfn_max_align_down(unsigned long pfn)
> --
> 2.11.0
>
--
Michal Hocko
SUSE Labs