Skip to contentSkip to conversation

memory_hotplug: Free pages as higher order

PATCH Superseded Arun KS 6 participants 49 messages Oct 5, 2018 – Nov 19, 2018

Subsystems (6)

v5 of 11 Superseded Latest is v11 →

lore
Share & tools
lore

Arun KS

author
#0 lore raw

PATCH v5 1/2 memory_hotplug: Free pages as higher order

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

---
Changes since v4:
- As suggested by Michal Hocko,
- Simplify logic in online_pages_block() by using get_order().
- Seperate out removal of prefetch from __free_pages_core().

Changes since v3:
- Renamed _free_pages_boot_core -> __free_pages_core.
- Removed prefetch from __free_pages_core.
- Removed xen_online_page().

Changes since v2:
- Reuse code from __free_pages_boot_core().

Changes since v1:
- Removed prefetch().

Changes since RFC:
- Rebase.
- As suggested by Michal Hocko remove pages_per_block.
- Modifed external providers of online_page_callback.

v4: https://lore.kernel.org/patchwork/patch/995111/
v3: https://lore.kernel.org/patchwork/patch/992348/
v2: https://lore.kernel.org/patchwork/patch/991363/
v1: https://lore.kernel.org/patchwork/patch/989445/
RFC: https://lore.kernel.org/patchwork/patch/984754/

---
 drivers/hv/hv_balloon.c        |  6 ++++--
 drivers/xen/balloon.c          | 23 +++++++++++++++--------
 include/linux/memory_hotplug.h |  2 +-
 mm/internal.h                  |  1 +
 mm/memory_hotplug.c            | 42 ++++++++++++++++++++++++++++++------------
 mm/page_alloc.c                |  8 ++++----
 6 files changed, 55 insertions(+), 27 deletions(-)
drivers/hv/hv_balloon.c +4 -2
index b1b7880..c5bc0b5 100644
@@ -771,7 +771,7 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,
 	}
 }
 
-static void hv_online_page(struct page *pg)
+static int hv_online_page(struct page *pg, unsigned int order)
 {
 	struct hv_hotadd_state *has;
 	unsigned long flags;
@@ -783,10 +783,12 @@ static void hv_online_page(struct page *pg)
 		if ((pfn < has->start_pfn) || (pfn >= has->end_pfn))
 			continue;
 
-		hv_page_online_one(has, pg);
+		hv_bring_pgs_online(has, pfn, (1UL << order));
 		break;
 	}
 	spin_unlock_irqrestore(&dm_device.ha_lock, flags);
+
+	return 0;
 }
 
 static int pfn_covered(unsigned long start_pfn, unsigned long pfn_cnt)
drivers/xen/balloon.c +15 -8
index e12bb25..58ddf48 100644
@@ -390,8 +390,8 @@ static enum bp_state reserve_additional_memory(void)
 
 	/*
 	 * add_memory_resource() will call online_pages() which in its turn
-	 * will call xen_online_page() callback causing deadlock if we don't
-	 * release balloon_mutex here. Unlocking here is safe because the
+	 * will call xen_bring_pgs_online() callback causing deadlock if we
+	 * don't release balloon_mutex here. Unlocking here is safe because the
 	 * callers drop the mutex before trying again.
 	 */
 	mutex_unlock(&balloon_mutex);
@@ -411,15 +411,22 @@ static enum bp_state reserve_additional_memory(void)
 	return BP_ECANCELED;
 }
 
-static void xen_online_page(struct page *page)
+static int xen_bring_pgs_online(struct page *pg, unsigned int order)
 {
-	__online_page_set_limits(page);
+	unsigned long i, size = (1 << order);
+	unsigned long start_pfn = page_to_pfn(pg);
+	struct page *p;
 
+	pr_debug("Online %lu pages starting at pfn 0x%lx\n", size, start_pfn);
 	mutex_lock(&balloon_mutex);
-
-	__balloon_append(page);
-
+	for (i = 0; i < size; i++) {
+		p = pfn_to_page(start_pfn + i);
+		__online_page_set_limits(p);
+		__balloon_append(p);
+	}
 	mutex_unlock(&balloon_mutex);
+
+	return 0;
 }
 
 static int xen_memory_notifier(struct notifier_block *nb, unsigned long val, void *v)
@@ -744,7 +751,7 @@ static int __init balloon_init(void)
 	balloon_stats.max_retry_count = RETRY_UNLIMITED;
 
 #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-	set_online_page_callback(&xen_online_page);
+	set_online_page_callback(&xen_bring_pgs_online);
 	register_memory_notifier(&xen_memory_nb);
 	register_sysctl_table(xen_root);
 
include/linux/memory_hotplug.h +1 -1
index 34a2822..7b04c1d 100644
@@ -87,7 +87,7 @@ extern int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn,
 	unsigned long *valid_start, unsigned long *valid_end);
 extern void __offline_isolated_pages(unsigned long, unsigned long);
 
-typedef void (*online_page_callback_t)(struct page *page);
+typedef int (*online_page_callback_t)(struct page *page, unsigned int order);
 
 extern int set_online_page_callback(online_page_callback_t callback);
 extern int restore_online_page_callback(online_page_callback_t callback);
mm/internal.h +1 -0
index 87256ae..636679c 100644
@@ -163,6 +163,7 @@ static inline struct page *pageblock_pfn_to_page(unsigned long start_pfn,
 extern int __isolate_free_page(struct page *page, unsigned int order);
 extern void __free_pages_bootmem(struct page *page, unsigned long pfn,
 					unsigned int order);
+extern void __free_pages_core(struct page *page, unsigned int order);
 extern void prep_compound_page(struct page *page, unsigned int order);
 extern void post_alloc_hook(struct page *page, unsigned int order,
 					gfp_t gfp_flags);
mm/memory_hotplug.c +30 -12

63 lines not on this page · raw message

mm/page_alloc.c +4 -4
index 89d2a2a..7ab5274 100644
@@ -1252,7 +1252,7 @@ static void __free_pages_ok(struct page *page, unsigned int order)
 	local_irq_restore(flags);
 }
 
-static void __init __free_pages_boot_core(struct page *page, unsigned int order)
+void __free_pages_core(struct page *page, unsigned int order)
 {
 	unsigned int nr_pages = 1 << order;
 	struct page *p = page;
@@ -1331,7 +1331,7 @@ void __init __free_pages_bootmem(struct page *page, unsigned long pfn,
 {
 	if (early_page_uninitialised(pfn))
 		return;
-	return __free_pages_boot_core(page, order);
+	return __free_pages_core(page, order);
 }
 
 /*
@@ -1421,14 +1421,14 @@ static void __init deferred_free_range(unsigned long pfn,
 	if (nr_pages == pageblock_nr_pages &&
 	    (pfn & (pageblock_nr_pages - 1)) == 0) {
 		set_pageblock_migratetype(page, MIGRATE_MOVABLE);
-		__free_pages_boot_core(page, pageblock_order);
+		__free_pages_core(page, pageblock_order);
 		return;
 	}
 
 	for (i = 0; i < nr_pages; i++, page++, pfn++) {
 		if ((pfn & (pageblock_nr_pages - 1)) == 0)
 			set_pageblock_migratetype(page, MIGRATE_MOVABLE);
-		__free_pages_boot_core(page, 0);
+		__free_pages_core(page, 0);
 	}
 }
 
Signature · 1 line
1.9.1
author
#1 lore raw

PATCH v5 2/2 mm/page_alloc: remove software prefetching in __free_pages_core

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +1 -5
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);
Signature · 1 line
1.9.1
#2 lore raw

Re: [PATCH v5 2/2] mm/page_alloc: remove software prefetching in __free_pages_core

Quoted 3 lines · Arun KS

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

I agree with the change but it is much better to add some numbers whenever arguing about performance impact.

Quoted 30 lines
---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +1 -5
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);
Signature · 1 line
1.9.1
Signature · 2 lines
Michal Hocko
SUSE Labs
#3 lore raw

Re: [PATCH v5 2/2] mm/page_alloc: remove software prefetching in __free_pages_core

In reply to Arun KS
Quoted 3 lines · Arun KS

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

I agree with the change but it is much better to add some numbers whenever arguing about performance impact.

Quoted 30 lines
---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +1 -5
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);
Signature · 1 line
1.9.1
Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Acked-by on v5 2/2
#4 lore raw

Re: [PATCH v5 2/2] mm/page_alloc: remove software prefetching in __free_pages_core

In reply to Arun KS
Quoted 6 lines · Arun KS

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

Yeah, a tight loop with fixed stride is a trivial case for hw prefetcher.

Quoted 25 lines
---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +1 -5
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);
Acked-by on v5 2/2
#5 lore raw

Re: [PATCH v5 2/2] mm/page_alloc: remove software prefetching in __free_pages_core

In reply to Arun KS
Quoted 6 lines · Arun KS

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

Yeah, a tight loop with fixed stride is a trivial case for hw prefetcher.

Quoted 15 lines
---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +0 -2
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {

mm/page_alloc.c void __free_pages_core(struct page *page, unsigned int order) · line 1267

Quoted 10 lines
mm/page_alloc.c +1 -3
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

author
#6 lore raw

PATCH v5 2/2 mm/page_alloc: remove software prefetching in __free_pages_core

In reply to Arun KS

They not only increase the code footprint, they actually make things slower rather than faster. Remove them as contemporary hardware doesn't need any hint.

---
 mm/page_alloc.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
mm/page_alloc.c +1 -5
index 7ab5274..90db431 100644
@@ -1258,14 +1258,10 @@ void __free_pages_core(struct page *page, unsigned int order)
 	struct page *p = page;
 	unsigned int loop;
 
-	prefetchw(p);
-	for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
-		prefetchw(p + 1);
+	for (loop = 0; loop < nr_pages ; loop++, p++) {
 		__ClearPageReserved(p);
 		set_page_count(p, 0);
 	}
-	__ClearPageReserved(p);
-	set_page_count(p, 0);
 
 	page_zone(page)->managed_pages += nr_pages;
 	set_page_refcounted(page);
Signature · 7 lines
1.9.1


_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Reviewed-by on v5 1/2
#7 lore raw
In reply to Arun KS
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Looks good to me.

Just one thing below:

mm/page_alloc.c void __init __free_pages_bootmem(struct page *page, unsigned long pfn, · line 1334

Quoted 6 lines
mm/page_alloc.c +1 -1
@@ -1331,7 +1331,7 @@ void __init __free_pages_bootmem(struct page *page, unsigned long pfn,
 {
 	if (early_page_uninitialised(pfn))
 		return;
-	return __free_pages_boot_core(page, order);
+	return __free_pages_core(page, order);

__free_pages_core is void, so I guess we do not need that return there. Probably the code generated is the same though.

Signature · 2 lines
Oscar Salvador
SUSE L3
Reviewed-by on v5 1/2
#8 lore raw
In reply to Arun KS
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Looks good to me.

Just one thing below:

mm/page_alloc.c void __init __free_pages_bootmem(struct page *page, unsigned long pfn, · line 1334

Quoted 6 lines
mm/page_alloc.c +1 -1
@@ -1331,7 +1331,7 @@ void __init __free_pages_bootmem(struct page *page, unsigned long pfn,
 {
 	if (early_page_uninitialised(pfn))
 		return;
-	return __free_pages_boot_core(page, order);
+	return __free_pages_core(page, order);

__free_pages_core is void, so I guess we do not need that return there. Probably the code generated is the same though.

Signature · 7 lines
Oscar Salvador
SUSE L3

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Acked-by on v5 1/2
#9 lore raw
In reply to Arun KS
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Thanks for your patience with all the resubmission.

Signature · 2 lines
Michal Hocko
SUSE Labs
author
#10 lore raw
Quoted 11 lines · Michal Hocko
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Thanks for your patience with all the resubmission.

Hello Michal,

I got the below email few days back. Do I still need to resubmit the patch? or is it already on the way to merge?

Regards,
Arun

The patch titled
Subject: mm/page_alloc.c: memory hotplug: free pages as higher
order
has been added to the -mm tree. Its filename is
memory_hotplug-free-pages-as-higher-order.patch

This patch should soon appear at

http://ozlabs.org/~akpm/mmots/broken-out/memory_hotplug-free-pages-as-higher-order.patch
and later at

http://ozlabs.org/~akpm/mmotm/broken-out/memory_hotplug-free-pages-as-higher-order.patch

Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next and is updated there every 3-4 working days

#11 lore raw
Quoted 9 lines · Arun KS
Quoted 8 lines · Michal Hocko
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Quoted 8 lines
Quoted 3 lines

Thanks for your patience with all the resubmission.

Hello Michal,

I got the below email few days back. Do I still need to resubmit the patch? or is it already on the way to merge?

It is sitting in the queue for now. Andrew collects acks and reviewed-bys and add them to the patch.

Signature · 2 lines
Michal Hocko
SUSE Labs
#12 lore raw
In reply to Arun KS
Quoted 9 lines · Arun KS
Quoted 8 lines · Michal Hocko
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Quoted 8 lines
Quoted 3 lines

Thanks for your patience with all the resubmission.

Hello Michal,

I got the below email few days back. Do I still need to resubmit the patch? or is it already on the way to merge?

It is sitting in the queue for now. Andrew collects acks and reviewed-bys and add them to the patch.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
author
#13 lore raw
In reply to Michal Hocko
Quoted 11 lines · Michal Hocko
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Thanks for your patience with all the resubmission.

Hello Michal,

I got the below email few days back. Do I still need to resubmit the patch? or is it already on the way to merge?

Regards,
Arun

The patch titled
Subject: mm/page_alloc.c: memory hotplug: free pages as higher
order
has been added to the -mm tree. Its filename is
memory_hotplug-free-pages-as-higher-order.patch

This patch should soon appear at

http://ozlabs.org/~akpm/mmots/broken-out/memory_hotplug-free-pages-as-higher-order.patch
and later at

http://ozlabs.org/~akpm/mmotm/broken-out/memory_hotplug-free-pages-as-higher-order.patch

Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next and is updated there every 3-4 working days

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

Acked-by on v5 1/2
#14 lore raw
In reply to Arun KS
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Thanks for your patience with all the resubmission.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#15 lore raw
In reply to Arun KS
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Hi Arun, out of curiosity:

could you please explain how exactly did you mesure the speed improvement?

Thanks

Signature · 2 lines
Oscar Salvador
SUSE L3
author
#16 lore raw
Quoted 8 lines · Oscar Salvador
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Quoted 4 lines

Hi Arun, out of curiosity:

could you please explain how exactly did you mesure the speed improvement?

mm/memory_hotplug.c +2 -0
index e379e85..2416136 100644
@@ -690,9 +690,13 @@ static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages,
                        void *arg)
 {
        unsigned long onlined_pages = *(unsigned long *)arg;
+       u64 t1, t2;
 
+       t1 = local_clock();
        if (PageReserved(pfn_to_page(start_pfn)))
                onlined_pages = online_pages_blocks(start_pfn, 

nr_pages);
+ t2 = local_clock();
+ trace_printk("time spend = %llu us\n", (t2-t1)/(1000));

        online_mem_sections(start_pfn, start_pfn + nr_pages);

Regards,
Arun

Quoted 2 lines

Thanks

#17 lore raw
Quoted 8 lines · Arun KS
mm/memory_hotplug.c +0 -0
index e379e85..2416136 100644
@@ -690,9 +690,13 @@ static int online_pages_range(unsigned long start_pfn,
 unsigned long nr_pages,
                        void *arg)
 {

mm/memory_hotplug.c static int online_pages_range(unsigned long start_pfn, · line 702

Quoted 10 lines
mm/memory_hotplug.c +4 -0
        unsigned long onlined_pages = *(unsigned long *)arg;
+       u64 t1, t2;
 
+       t1 = local_clock();
        if (PageReserved(pfn_to_page(start_pfn)))
                onlined_pages = online_pages_blocks(start_pfn, nr_pages);
+       t2 = local_clock();
+       trace_printk("time spend = %llu us\n", (t2-t1)/(1000));
 
        online_mem_sections(start_pfn, start_pfn + nr_pages);

Thanks ;-)

Signature · 2 lines
Oscar Salvador
SUSE L3
#18 lore raw
In reply to Arun KS
Quoted 8 lines · Arun KS
mm/memory_hotplug.c +0 -0
index e379e85..2416136 100644
@@ -690,9 +690,13 @@ static int online_pages_range(unsigned long start_pfn,
 unsigned long nr_pages,
                        void *arg)
 {

mm/memory_hotplug.c static int online_pages_range(unsigned long start_pfn, · line 702

Quoted 10 lines
mm/memory_hotplug.c +4 -0
        unsigned long onlined_pages = *(unsigned long *)arg;
+       u64 t1, t2;
 
+       t1 = local_clock();
        if (PageReserved(pfn_to_page(start_pfn)))
                onlined_pages = online_pages_blocks(start_pfn, nr_pages);
+       t2 = local_clock();
+       trace_printk("time spend = %llu us\n", (t2-t1)/(1000));
 
        online_mem_sections(start_pfn, start_pfn + nr_pages);

Thanks ;-)

Signature · 7 lines
Oscar Salvador
SUSE L3

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
author
#19 lore raw
In reply to Oscar Salvador
Quoted 8 lines · Oscar Salvador
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Quoted 4 lines

Hi Arun, out of curiosity:

could you please explain how exactly did you mesure the speed improvement?

mm/memory_hotplug.c +2 -0
index e379e85..2416136 100644
@@ -690,9 +690,13 @@ static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages,
                        void *arg)
 {
        unsigned long onlined_pages = *(unsigned long *)arg;
+       u64 t1, t2;
 
+       t1 = local_clock();
        if (PageReserved(pfn_to_page(start_pfn)))
                onlined_pages = online_pages_blocks(start_pfn, 

nr_pages);
+ t2 = local_clock();
+ trace_printk("time spend = %llu us\n", (t2-t1)/(1000));

        online_mem_sections(start_pfn, start_pfn + nr_pages);

Regards,
Arun

Quoted 2 lines

Thanks

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#20 lore raw
In reply to Arun KS
Quoted 6 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

Hi Arun, out of curiosity:

could you please explain how exactly did you mesure the speed improvement?

Thanks

Signature · 7 lines
Oscar Salvador
SUSE L3

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#21 lore raw
In reply to Arun KS
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

author
#22 lore raw
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

https://lore.kernel.org/patchwork/patch/989445/

-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
{
- __online_page_set_limits(page);
- __online_page_increment_counters(page);
- __online_page_free(page);
+ unsigned long nr_pages = 1 << order;
+ struct page *p = page;
+
+ for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+ __ClearPageReserved(p);
+ set_page_count(p, 0);
+ }
+
+ adjust_managed_page_count(page, nr_pages);
+ set_page_refcounted(page);
+ __free_pages(page, order);
+
+ return 0;
+}

Regards,
Arun

#23 lore raw
Quoted 40 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Signature · 2 lines
Michal Hocko
SUSE Labs
author
#24 lore raw
Quoted 41 lines · Michal Hocko
Quoted 40 lines · Arun KS
Quoted 38 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}

Won't they race with memory hotplug?

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 << h->order);

Regards,
Arun

#25 lore raw
Quoted 64 lines · Arun KS
Quoted 41 lines · Michal Hocko
Quoted 40 lines · Arun KS
Quoted 38 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}
Quoted 8 lines

Won't they race with memory hotplug?

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 <<

h->order);

They can, and I have missed those.

Signature · 2 lines
Michal Hocko
SUSE Labs
maintainer
#26 lore raw
Quoted 42 lines · On Thu, 11 Oct 2018 09:55:03 +0200 Michal Hocko <[email protected]> wrote:
Quoted 42 lines
Quoted 18 lines
Quoted 18 lines
Quoted 17 lines

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}

Won't they race with memory hotplug?

Quoted 8 lines
Quoted 6 lines

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 <<

h->order);

They can, and I have missed those.

So this patch needs more work, yes?

#27 lore raw

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Signature · 2 lines
Michal Hocko
SUSE Labs
author
#28 lore raw
Quoted 6 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Regards,
Arun

author
#29 lore raw
Quoted 11 lines · Arun KS
Quoted 6 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

Regards,
Arun

maintainer
#30 lore raw
Quoted 10 lines · On Mon, 05 Nov 2018 15:12:27 +0530 Arun KS <[email protected]> wrote:
Quoted 9 lines · Arun KS
Quoted 7 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he
will play with this some more.

Quoted 6 lines
Quoted 3 lines

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

I thought were awaiting a new version? "Will send out a separate patch on top of this one"?

I do think a resend would be useful, please. Ensure the changelog is updated to capture the above info and any other worthy issues which arose during review.

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

maintainer
#31 lore raw
In reply to Arun KS
Quoted 10 lines · On Mon, 05 Nov 2018 15:12:27 +0530 Arun KS <[email protected]> wrote:
Quoted 9 lines · Arun KS
Quoted 7 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he
will play with this some more.

Quoted 6 lines
Quoted 3 lines

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

I thought were awaiting a new version? "Will send out a separate patch on top of this one"?

I do think a resend would be useful, please. Ensure the changelog is updated to capture the above info and any other worthy issues which arose during review.

author
#32 lore raw
Quoted 15 lines · Andrew Morton
Quoted 13 lines · On Mon, 05 Nov 2018 15:12:27 +0530 Arun KS <[email protected]> wrote:
Quoted 12 lines · Arun KS
Quoted 7 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he
will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Quoted 6 lines
Quoted 3 lines

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

I thought were awaiting a new version? "Will send out a separate patch on top of this one"?

Sorry for confusion. I sent out an incremental patch converting counters to atomics.

https://patchwork.kernel.org/cover/10657217/

Quoted 4 lines

I do think a resend would be useful, please. Ensure the changelog is updated to capture the above info and any other worthy issues which arose during review.

Will do that.

Regards,
Arun

author
#33 lore raw
In reply to Andrew Morton
Quoted 15 lines · Andrew Morton
Quoted 13 lines · On Mon, 05 Nov 2018 15:12:27 +0530 Arun KS <[email protected]> wrote:
Quoted 12 lines · Arun KS
Quoted 7 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he
will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Quoted 6 lines
Quoted 3 lines

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

I thought were awaiting a new version? "Will send out a separate patch on top of this one"?

Sorry for confusion. I sent out an incremental patch converting counters to atomics.

https://patchwork.kernel.org/cover/10657217/

Quoted 4 lines

I do think a resend would be useful, please. Ensure the changelog is updated to capture the above info and any other worthy issues which arose during review.

Will do that.

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

author
#34 lore raw
In reply to Arun KS
Quoted 11 lines · Arun KS
Quoted 6 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Hello Andrew/Michal,

Will this be going in subsequent -rcs?

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

author
#35 lore raw
In reply to Michal Hocko
Quoted 6 lines · Michal Hocko

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Converted totalhigh_pages, totalram_pages and zone->managed_page to atomic and tested hot add. Latency is not effected with this change. Will send out a separate patch on top of this one.

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#36 lore raw
In reply to Andrew Morton

On Thu 18-10-18 19:18:25, Andrew Morton wrote:
[...]

Quoted 1 line

So this patch needs more work, yes?

Yes, I've talked to Arun (he is offline until next week) offlist and he will play with this some more.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
maintainer
#37 lore raw
In reply to Michal Hocko
Quoted 42 lines · On Thu, 11 Oct 2018 09:55:03 +0200 Michal Hocko <[email protected]> wrote:
Quoted 42 lines
Quoted 18 lines
Quoted 18 lines
Quoted 17 lines

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}

Won't they race with memory hotplug?

Quoted 8 lines
Quoted 6 lines

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 <<

h->order);

They can, and I have missed those.

So this patch needs more work, yes?

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#38 lore raw
In reply to Arun KS
Quoted 64 lines · Arun KS
Quoted 41 lines · Michal Hocko
Quoted 40 lines · Arun KS
Quoted 38 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}
Quoted 8 lines

Won't they race with memory hotplug?

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 <<

h->order);

They can, and I have missed those.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
author
#39 lore raw
In reply to Michal Hocko
Quoted 41 lines · Michal Hocko
Quoted 40 lines · Arun KS
Quoted 38 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 7 lines
Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Other main callers of adjust_manage_page_count(),

static inline void free_reserved_page(struct page *page)

{
        __free_reserved_page(page);
        adjust_managed_page_count(page, 1);
}

static inline void mark_page_reserved(struct page *page)

{
        SetPageReserved(page);
        adjust_managed_page_count(page, -1);
}

Won't they race with memory hotplug?

Few more,

./drivers/xen/balloon.c:519:            adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:175:  adjust_managed_page_count(page, -1);
./drivers/virtio/virtio_balloon.c:196:  adjust_managed_page_count(page, 1);
./mm/hugetlb.c:2158:                    adjust_managed_page_count(page, 1 << h->order);

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#40 lore raw
In reply to Arun KS
Quoted 40 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 1 line

Looks unsafe without managed_page_count_lock.

Why does it matter actually? We cannot online/offline memory in parallel. This is not the case for the boot where we initialize memory in parallel on multiple nodes. So this seems to be safe currently unless I am missing something. A comment explaining that would be helpful though.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#41 lore raw
In reply to Arun KS
Quoted 40 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 6 lines

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages. I expect __free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

Quoted 25 lines
(quoted diff) +15 -4
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
  {
-	__online_page_set_limits(page);
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	unsigned long nr_pages = 1 << order;
+	struct page *p = page;
+
+	for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+		__ClearPageReserved(p);
+		set_page_count(p, 0);
+	}
+
+	adjust_managed_page_count(page, nr_pages);
+	set_page_refcounted(page);
+	__free_pages(page, order);
+
+	return 0;
+}

Regards,
Arun

#42 lore raw
Quoted 46 lines · Vlastimil Babka
Quoted 45 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

Quoted 4 lines
Quoted 1 line

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages.

deferred initialization has one thread per node AFAIR so we cannot race on managed_pages updates. Well, unless some of the mentioned can run that early which I dunno.

Quoted 6 lines

__free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

I wanted to suggest that already but I have no idea whether the lock instructions would cause more overhead.

Signature · 2 lines
Michal Hocko
SUSE Labs
#43 lore raw
In reply to Vlastimil Babka
Quoted 46 lines · Vlastimil Babka
Quoted 45 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

Quoted 4 lines
Quoted 1 line

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages.

deferred initialization has one thread per node AFAIR so we cannot race on managed_pages updates. Well, unless some of the mentioned can run that early which I dunno.

Quoted 6 lines

__free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

I wanted to suggest that already but I have no idea whether the lock instructions would cause more overhead.

Signature · 7 lines
Michal Hocko
SUSE Labs

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#44 lore raw
In reply to Vlastimil Babka
Quoted 47 lines · Vlastimil Babka
Quoted 45 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-   __online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-   __online_page_increment_counters(page);
-   __online_page_free(page);
+   __free_pages_core(page, order);
+   totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+   if (PageHighMem(page))
+           totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

Quoted 8 lines
Quoted 1 line

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages. I expect __free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

Seems deferred_free_range() is protected by
pgdat_resize_lock()/pgdat_resize_unlock().

Which protects pgdat's zones, if I am right.

Quoted 29 lines

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

Quoted 25 lines
(quoted diff) +15 -4
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
  {
-     __online_page_set_limits(page);
-     __online_page_increment_counters(page);
-     __online_page_free(page);
+     unsigned long nr_pages = 1 << order;
+     struct page *p = page;
+
+     for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+             __ClearPageReserved(p);
+             set_page_count(p, 0);
+     }
+
+     adjust_managed_page_count(page, nr_pages);
+     set_page_refcounted(page);
+     __free_pages(page, order);
+
+     return 0;
+}

Regards,
Arun

#45 lore raw
In reply to Vlastimil Babka
Quoted 47 lines · Vlastimil Babka
Quoted 45 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-   __online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-   __online_page_increment_counters(page);
-   __online_page_free(page);
+   __free_pages_core(page, order);
+   totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+   if (PageHighMem(page))
+           totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

Quoted 8 lines
Quoted 1 line

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages. I expect __free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

Seems deferred_free_range() is protected by
pgdat_resize_lock()/pgdat_resize_unlock().

Which protects pgdat's zones, if I am right.

Quoted 25 lines

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

Quoted 22 lines
(quoted diff) +15 -4
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
  {
-     __online_page_set_limits(page);
-     __online_page_increment_counters(page);
-     __online_page_free(page);
+     unsigned long nr_pages = 1 << order;
+     struct page *p = page;
+
+     for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+             __ClearPageReserved(p);
+             set_page_count(p, 0);
+     }
+
+     adjust_managed_page_count(page, nr_pages);
+     set_page_refcounted(page);
+     __free_pages(page, order);
+
+     return 0;
+}
Quoted 4 lines
Quoted 3 lines

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#46 lore raw
In reply to Arun KS
Quoted 40 lines · Arun KS
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Quoted 6 lines

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

https://lore.kernel.org/patchwork/patch/989445/

Looks like deferred_free_range() has the same problem calling __free_pages_core() to adjust zone->managed_pages. I expect __free_pages_bootmem() is OK because at that point the system is still single-threaded?
Could be solved by moving that out of __free_pages_core().

But do we care about readers potentially seeing a store tear? If yes then maybe these counters should be converted to atomics...

Quoted 22 lines
(quoted diff) +15 -4
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
  {
-	__online_page_set_limits(page);
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	unsigned long nr_pages = 1 << order;
+	struct page *p = page;
+
+	for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+		__ClearPageReserved(p);
+		set_page_count(p, 0);
+	}
+
+	adjust_managed_page_count(page, nr_pages);
+	set_page_refcounted(page);
+	__free_pages(page, order);
+
+	return 0;
+}
Quoted 3 lines

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

author
#47 lore raw
In reply to Vlastimil Babka
Quoted 25 lines · Vlastimil Babka
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

Quoted 13 lines

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

Looks unsafe without managed_page_count_lock. I think better have a similar implementation of free_boot_core() in memory_hotplug.c like we had in version 1 of patch. And use adjust_managed_page_count() instead of page_zone(page)->managed_pages += nr_pages;

https://lore.kernel.org/patchwork/patch/989445/

-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
{
- __online_page_set_limits(page);
- __online_page_increment_counters(page);
- __online_page_free(page);
+ unsigned long nr_pages = 1 << order;
+ struct page *p = page;
+
+ for (loop = 0 ; loop < nr_pages ; loop++, p++) {
+ __ClearPageReserved(p);
+ set_page_count(p, 0);
+ }
+
+ adjust_managed_page_count(page, nr_pages);
+ set_page_refcounted(page);
+ __free_pages(page, order);
+
+ return 0;
+}

Regards,
Arun

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#48 lore raw
In reply to Arun KS
Quoted 8 lines · Arun KS

When free pages are done with higher order, time spend on coalescing pages by buddy allocator can be reduced. With section size of 256MB, hot add latency of a single section shows improvement from 50-60 ms to less than 1 ms, hence improving the hot add latency by 60%. Modify external providers of online callback to align with the change.

[...]

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 660

Quoted 8 lines
mm/memory_hotplug.c +1 -2
@@ -655,26 +655,44 @@ void __online_page_free(struct page *page)
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
-static void generic_online_page(struct page *page)
+static int generic_online_page(struct page *page, unsigned int order)
 {
-	__online_page_set_limits(page);

This is now not called anymore, although the xen/hv variants still do it. The function seems empty these days, maybe remove it as a followup cleanup?

mm/memory_hotplug.c void __online_page_free(struct page *page) · line 665

Quoted 8 lines
mm/memory_hotplug.c +6 -2
-	__online_page_increment_counters(page);
-	__online_page_free(page);
+	__free_pages_core(page, order);
+	totalram_pages += (1UL << order);
+#ifdef CONFIG_HIGHMEM
+	if (PageHighMem(page))
+		totalhigh_pages += (1UL << order);
+#endif

__online_page_increment_counters() would have used adjust_managed_page_count() which would do the changes under managed_page_count_lock. Are we safe without the lock? If yes, there should perhaps be a comment explaining why.

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel