mm, memory_hotplug: redefine memory offline retry logic
Subsystems (4)
v2 cover mm, memory_hotplug: redefine memory offline retry logic
Hi,
this has been previously sent http://lkml.kernel.org/r/[email protected]
No fundamental objections have been raised. There were some questions about potential permanent migration failures but those are deemed unlikely and
not really problematic because the context is interruptible. I have tried
to clarify the wording to be more clear.
original changelog:
While testing memory hotplug on a large 4TB machine we have noticed that memory offlining is just too eager to fail. The primary reason is that the retry logic is just too easy to give up. We have 4 ways out of the offline
- we have a permanent failure (isolation or memory notifiers fail, or hugetlb pages cannot be dropped)
- userspace sends a signal
- a hardcoded 120s timeout expires
- page migration fails 5 times
This is way too convoluted and it doesn't scale very well. We have seen both temporary migration failures as well as 120s being triggered. After removing those restrictions we were able to pass stress testing during memory hot remove without any other negative side effects observed. Therefore I suggest dropping both hard coded policies. I couldn't have found any specific reason for them in the changelog. I neither didn't get any response [1] from Kamezawa. If we need some upper bound - e.g. timeout based - then we should have a proper and user defined policy for that. In any case there should be a clear use case when introducing it.
Any comments, objections?
Shortlog
Michal Hocko (2):
mm, memory_hotplug: do not fail offlining too early mm, memory_hotplug: remove timeout from __offline_memory
Diffstat
mm/memory_hotplug.c | 48 ++++++++++++------------------------------------ 1 file changed, 12 insertions(+), 36 deletions(-)
[1] http://lkml.kernel.org/r/[email protected]
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH v2 1/2 mm, memory_hotplug: do not fail offlining too early
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failed
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
__offline_pages seems rather cluttered when it comes to the retry logic. We have 5 retries at maximum and a timeout. We could argue whether the timeout makes sense but failing just because of a race when somebody isoltes a page from LRU or puts it on a pcp LRU lists is just wrong. It only takes it to race with a process which unmaps some pages and remove them from the LRU list and we can fail the whole offline because of something that is a temporary condition and actually not harmful for the offline.
Please note that unmovable pages should be already excluded during start_isolate_page_range. We could argue that has_unmovable_pages is racy and MIGRATE_MOVABLE check doesn't provide any hard guarantee either but kernel zones (aka < ZONE_MOVABLE) will very likely detect unmovable pages in most cases and movable zone shouldn't contain unmovable pages at all. Some of those pages might be pinned but not for ever because that would be a bug on its own. In any case the context is still interruptible and so the userspace can easily bail out when the operation takes too long. This is certainly better behavior than a hardcoded retry loop which is racy.
Fix this by removing the max retry count and only rely on the timeout resp. interruption by a signal from the userspace. Also retry rather than fail when check_pages_isolated sees some !free pages because those could be a result of the race as well.
--- mm/memory_hotplug.c | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-)
mm/memory_hotplug.c +10 -30
@@ -1597,7 +1597,7 @@ static int __ref __offline_pages(unsigned long start_pfn, {unsigned long pfn, nr_pages, expire;long offlined_pages; -int ret, drain, retry_max, node; +int ret, node;unsigned long flags;unsigned long valid_start, valid_end;struct zone *zone;
@@ -1634,43 +1634,25 @@ static int __ref __offline_pages(unsigned long start_pfn, pfn = start_pfn; expire = jiffies + timeout; - drain =0 ; - retry_max =5 ; repeat:/* start memory hot removal */ - ret = -EAGAIN ; + ret = -EBUSY ;if (time_after (jiffies, expire)) goto failed_removal; ret = -EINTR ;if (signal_pending (current)) goto failed_removal; - ret =0 ; -if (drain) { -lru_add_drain_all_cpuslocked (); -cond_resched (); -drain_all_pages (zone); - } + +cond_resched (); +lru_add_drain_all_cpuslocked (); +drain_all_pages (zone); pfn =scan_movable_pages (start_pfn, end_pfn);if (pfn) {/* We have movable pages */ ret =do_migrate_range (pfn, end_pfn); -if (!ret) { - drain =1 ; - goto repeat; - }else { -if (ret <0 ) -if (--retry_max ==0 ) - goto failed_removal; -yield (); - drain =1 ; - goto repeat; - } + goto repeat; } -/* drain all zone's lru pagevec, this is asynchronous... */ -lru_add_drain_all_cpuslocked (); -yield (); -/* drain pcp pages, this is synchronous. */ -drain_all_pages (zone); +/* * dissolve free hugepages in the memory block before doing offlining * actually in order to make hugetlbfs's object counting consistent.
@@ -1680,10 +1662,8 @@ static int __ref __offline_pages(unsigned long start_pfn, goto failed_removal;/* check again */ offlined_pages =check_pages_isolated (start_pfn, end_pfn); -if (offlined_pages <0 ) { - ret = -EBUSY ; - goto failed_removal; - } +if (offlined_pages <0 ) + goto repeat;pr_info ("Offlined Pages %ld\n" , offlined_pages);/* Ok, all of our target is isolated. We cannot do rollback at this point. */
Signature · 7 lines
2.14.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 10 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failed
Quoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busy
real 0m0.001s
user 0m0.000s
sys 0m0.001s
After:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busy
real 2m0.009s
user 0m0.000s
sys 1m25.035s
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
With commit 3aa2823fdf66 ("mm, memory_hotplug: remove timeout from __offline_memory") also applied, it appears to just get stuck forever, and I get lots of:
[ 1232.112953] INFO: task kworker/3:0:4609 blocked for more than 120 seconds. [ 1232.113067] Not tainted 4.14.0-rc4-gcc6-next-20171009-g49827b9 #1 [ 1232.113183] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1232.113319] kworker/3:0 D11984 4609 2 0x00000800 [ 1232.113416] Workqueue: memcg_kmem_cache memcg_kmem_cache_create_func [ 1232.113531] Call Trace: [ 1232.113579] [c0000000fb2db7a0] [c0000000fb2db900] 0xc0000000fb2db900 (unreliable) [ 1232.113717] [c0000000fb2db970] [c00000000001c964] __switch_to+0x304/0x6e0 [ 1232.113840] [c0000000fb2dba10] [c000000000a408c0] __schedule+0x2e0/0xa80 [ 1232.113978] [c0000000fb2dbae0] [c000000000a410a8] schedule+0x48/0xc0 [ 1232.114113] [c0000000fb2dbb10] [c000000000a44d88] rwsem_down_read_failed+0x128/0x1b0 [ 1232.114269] [c0000000fb2dbb70] [c0000000001696a8] __percpu_down_read+0x108/0x110 [ 1232.114426] [c0000000fb2dbba0] [c00000000032e498] get_online_mems+0x68/0x80 [ 1232.115487] [c0000000fb2dbbc0] [c0000000002c82ec] memcg_create_kmem_cache+0x4c/0x190 [ 1232.115651] [c0000000fb2dbc60] [c0000000003483b8] memcg_kmem_cache_create_func+0x38/0xf0 [ 1232.115809] [c0000000fb2dbc90] [c000000000121594] process_one_work+0x2b4/0x590 [ 1232.115964] [c0000000fb2dbd20] [c000000000121908] worker_thread+0x98/0x5d0 [ 1232.116095] [c0000000fb2dbdc0] [c00000000012a134] kthread+0x164/0x1b0 [ 1232.116229] [c0000000fb2dbe30] [c00000000000bae0] ret_from_kernel_thread+0x5c/0x7c
cheers
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 31 lines · Michael Ellerman
Quoted 10 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedQuoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busy
Quoted 7 lines
real 2m0.009s
user 0m0.000s
sys 1m25.035sThere's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
OK, that means that start_isolate_page_range should have failed but it hasn't for some reason. I strongly suspect has_unmovable_pages is doing something wrong. Is the kernel text marked somehow? E.g. PageReserved? In other words, does the diff below helps?
mm/page_alloc.c +3 -0
@@ -7368,6 +7368,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
Quoted 15 lines
With commit
3aa2823fdf66("mm,memory_hotplug: remove timeout from__offline_memory") also applied, it appears to just get stuck forever, and I get lots of:[ 1232.112953] INFO: task kworker/3:0:4609 blocked for more than 120 seconds. [ 1232.113067] Not tainted 4.14.0-rc4-gcc6-next-20171009-g49827b9 #1 [ 1232.113183] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1232.113319] kworker/3:0 D11984 4609 2 0x00000800 [ 1232.113416] Workqueue: memcg_kmem_cache memcg_kmem_cache_create_func [ 1232.113531] Call Trace: [ 1232.113579] [c0000000fb2db7a0] [c0000000fb2db900] 0xc0000000fb2db900 (unreliable) [ 1232.113717] [c0000000fb2db970] [c00000000001c964] __switch_to+0x304/0x6e0 [ 1232.113840] [c0000000fb2dba10] [c000000000a408c0] __schedule+0x2e0/0xa80 [ 1232.113978] [c0000000fb2dbae0] [c000000000a410a8] schedule+0x48/0xc0 [ 1232.114113] [c0000000fb2dbb10] [c000000000a44d88] rwsem_down_read_failed+0x128/0x1b0
Quoted 8 lines
[ 1232.114269] [c0000000fb2dbb70] [c0000000001696a8] __percpu_down_read+0x108/0x110 [ 1232.114426] [c0000000fb2dbba0] [c00000000032e498] get_online_mems+0x68/0x80 [ 1232.115487] [c0000000fb2dbbc0] [c0000000002c82ec] memcg_create_kmem_cache+0x4c/0x190 [ 1232.115651] [c0000000fb2dbc60] [c0000000003483b8] memcg_kmem_cache_create_func+0x38/0xf0 [ 1232.115809] [c0000000fb2dbc90] [c000000000121594] process_one_work+0x2b4/0x590 [ 1232.115964] [c0000000fb2dbd20] [c000000000121908] worker_thread+0x98/0x5d0 [ 1232.116095] [c0000000fb2dbdc0] [c00000000012a134] kthread+0x164/0x1b0 [ 1232.116229] [c0000000fb2dbe30] [c00000000000bae0] ret_from_kernel_thread+0x5c/0x7c
I do not see how this is related to the offline path.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 37 lines · Michal Hocko
Quoted 36 lines · Michael Ellerman
Quoted 10 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedQuoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035s
Quoted 6 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
OK, that means that
start_isolate_page_rangeshould have failed but it hasn't for some reason. I strongly suspecthas_unmovable_pagesis doing something wrong. Is the kernel text marked somehow? E.g. PageReserved?
I'm not sure how the text is marked, will have to dig into that.
Quoted 1 line
In other words, does the diff below helps?
No that doesn't help.
Quoted 40 lines
mm/page_alloc.c +3
-0@@ -7368,6 +7368,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't Quoted 17 lines
With commit
3aa2823fdf66("mm,memory_hotplug: remove timeout from__offline_memory") also applied, it appears to just get stuck forever, and I get lots of:[ 1232.112953] INFO: task kworker/3:0:4609 blocked for more than 120 seconds. [ 1232.113067] Not tainted 4.14.0-rc4-gcc6-next-20171009-g49827b9 #1 [ 1232.113183] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1232.113319] kworker/3:0 D11984 4609 2 0x00000800 [ 1232.113416] Workqueue: memcg_kmem_cache memcg_kmem_cache_create_func [ 1232.113531] Call Trace: [ 1232.113579] [c0000000fb2db7a0] [c0000000fb2db900] 0xc0000000fb2db900 (unreliable) [ 1232.113717] [c0000000fb2db970] [c00000000001c964] __switch_to+0x304/0x6e0 [ 1232.113840] [c0000000fb2dba10] [c000000000a408c0] __schedule+0x2e0/0xa80 [ 1232.113978] [c0000000fb2dbae0] [c000000000a410a8] schedule+0x48/0xc0 [ 1232.114113] [c0000000fb2dbb10] [c000000000a44d88] rwsem_down_read_failed+0x128/0x1b0Quoted 8 lines
[ 1232.114269] [c0000000fb2dbb70] [c0000000001696a8] __percpu_down_read+0x108/0x110 [ 1232.114426] [c0000000fb2dbba0] [c00000000032e498] get_online_mems+0x68/0x80 [ 1232.115487] [c0000000fb2dbbc0] [c0000000002c82ec] memcg_create_kmem_cache+0x4c/0x190 [ 1232.115651] [c0000000fb2dbc60] [c0000000003483b8] memcg_kmem_cache_create_func+0x38/0xf0 [ 1232.115809] [c0000000fb2dbc90] [c000000000121594] process_one_work+0x2b4/0x590 [ 1232.115964] [c0000000fb2dbd20] [c000000000121908] worker_thread+0x98/0x5d0 [ 1232.116095] [c0000000fb2dbdc0] [c00000000012a134] kthread+0x164/0x1b0 [ 1232.116229] [c0000000fb2dbe30] [c00000000000bae0] ret_from_kernel_thread+0x5c/0x7c
Quoted 1 line
I do not see how this is related to the offline path.
It's blocked doing get_online_mems(). So it's unrelated to the offline, but it can't proceed until the offline finishes, which it never does, IIUIC.
cheers
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 35 lines · Michael Ellerman
Quoted 34 lines · Michal Hocko
Quoted 33 lines · Michael Ellerman
Quoted 9 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedQuoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035s
Quoted 8 lines
Quoted 6 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
OK, that means that
start_isolate_page_rangeshould have failed but it hasn't for some reason. I strongly suspecthas_unmovable_pagesis doing something wrong. Is the kernel text marked somehow? E.g. PageReserved?I'm not sure how the text is marked, will have to dig into that.
Yeah it's reserved:
$ grep __init_begin /proc/kallsyms
c000000000d70000 T __init_begin
$ ./page-types -r -a 0x0,0xd7
flags page-count MB symbolic-flags long-symbolic-flags
0x0000000100000000 215 13 __________________________r_______________ reserved
total 215 13I added some printks, we're getting EBUSY from do_migrate_range(pfn, end_pfn).
So we seem to just have an infinite loop:
repeat:
/* start memory hot removal */
ret = -EINTR;
if (signal_pending(current))
goto failed_removal;
cond_resched();
lru_add_drain_all_cpuslocked();
drain_all_pages(zone);
pfn = scan_movable_pages(start_pfn, end_pfn);
if (pfn) { /* We have movable pages */
ret = do_migrate_range(pfn, end_pfn);
printk_ratelimited("memory-hotplug: migrate range returned %ld\n", ret);
goto repeat;
}eg:
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
__offline_pages: 354031 callbacks suppressed
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
memory-hotplug: migrate range returned -16
__offline_pages: 355794 callbacks suppressed
cheers
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 41 lines · Michael Ellerman
Quoted 34 lines · Michael Ellerman
Quoted 33 lines · Michal Hocko
Quoted 32 lines · Michael Ellerman
Quoted 9 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedQuoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035sQuoted 6 lines
Quoted 5 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
OK, that means that
start_isolate_page_rangeshould have failed but it hasn't for some reason. I strongly suspecthas_unmovable_pagesis doing something wrong. Is the kernel text marked somehow? E.g. PageReserved?I'm not sure how the text is marked, will have to dig into that.
Quoted 8 lines
Yeah it's reserved:
$ grep __init_begin /proc/kallsyms c000000000d70000 T __init_begin $ ./page-types -r -a 0x0,0xd7 flags page-count MB symbolic-flags long-symbolic-flags 0x0000000100000000 215 13 __________________________r_______________ reserved total 215 13
Hey Michael,
What tool is this 'page-types' ?
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
On Wed 11-10-17 19:35:04, Anshuman Khandual wrote:
[...]
Quoted 10 lines
Quoted 6 lines
$ grep __init_begin /proc/kallsyms c000000000d70000 T __init_begin $ ./page-types -r -a 0x0,0xd7 flags page-count MB symbolic-flags long-symbolic-flags 0x0000000100000000 215 13 __________________________r_______________ reserved total 215 13Hey Michael,
What tool is this 'page-types' ?
tools/vm/page-types.c
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
In reply to Michael EllermanQuoted 46 lines · Michael Ellerman
Quoted 37 lines · Michal Hocko
Quoted 36 lines · Michael Ellerman
Quoted 10 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedQuoted 4 lines
Isolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035sQuoted 6 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
OK, that means that
start_isolate_page_rangeshould have failed but it hasn't for some reason. I strongly suspecthas_unmovable_pagesis doing something wrong. Is the kernel text marked somehow? E.g. PageReserved?
Quoted 5 lines
I'm not sure how the text is marked, will have to dig into that.
Quoted 1 line
In other words, does the diff below helps?
No that doesn't help.
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt)) return false;
has bailed out early. I would be quite surprised if the kernel text was sitting in the zone movable. The migrate type check is more fishy AFAICS. I can imagine that the kernel text can share the movable or CMA mt block. I am not really familiar with this function but it looks suspicious. So does it help to remove this check?
---
mm/page_alloc.c +3 -3
@@ -7355,9 +7355,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,*/ if (zone_idx (zone) ==ZONE_MOVABLE )return false; - mt =get_pageblock_migratetype (page); -if (mt ==MIGRATE_MOVABLE ||is_migrate_cma (mt)) -return false; pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {
@@ -7368,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
Signature · 2 lines
Michal Hocko SUSE Labs
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 21 lines · Michal Hocko
Quoted 20 lines · Michael Ellerman
Quoted 18 lines · Michal Hocko
Quoted 17 lines · Michael Ellerman
Quoted 14 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
[ 5410.336792] page:ffffea22a646bd00 count:255 mapcount:252 mapping:ffff88ff926c9f38 index:0x3 [ 5410.336809] flags: 0x9855fe40010048(uptodate|active|mappedtodisk) [ 5410.336811] page dumped because: isolation failed [ 5410.336813] page->mem_cgroup:ffff8801cd662000 [ 5420.655030] memory offlining [mem 0x18b580000000-0x18b5ffffffff] failedIsolation has failed here because the page is not on LRU. Most probably because it was on the pcp LRU cache or it has been removed from the LRU already but it hasn't been freed yet. In both cases the page doesn't look non-migrable so retrying more makes sense.
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busy
Well, that means offline didn't actually work for that block even before this patch, right? Is it even a movable_node block? I guess not?
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
real 0m0.001s
user 0m0.000s
sys 0m0.001sAfter:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busy
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
real 2m0.009s
user 0m0.000s
sys 1m25.035sThere's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
Ah, right. So your complain is really about that the failure is not instant anymore for blocks that can't be offlined.
Quoted 8 lines
Quoted 8 lines
Quoted 3 lines
OK, that means that
start_isolate_page_rangeshould have failed but it hasn't for some reason. I strongly suspecthas_unmovable_pagesis doing something wrong. Is the kernel text marked somehow? E.g. PageReserved?I'm not sure how the text is marked, will have to dig into that.
Quoted 1 line
In other words, does the diff below helps?
Quoted 8 lines
Quoted 1 line
No that doesn't help.
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))
The MIGRATE_MOVABLE check is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).
Quoted 23 lines
return false;has bailed out early. I would be quite surprised if the kernel text was sitting in the zone movable. The migrate type check is more fishy AFAICS. I can imagine that the kernel text can share the movable or CMA mt block. I am not really familiar with this function but it looks suspicious. So does it help to remove this check?
---mm/page_alloc.c +0
-3@@ -7355,9 +7355,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,*/ if (zone_idx (zone) ==ZONE_MOVABLE )return false; - mt =get_pageblock_migratetype (page); -if (mt ==MIGRATE_MOVABLE ||is_migrate_cma (mt)) -return false; pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7373
Quoted 9 lines
mm/page_alloc.c +3
-0@@ -7368,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 1 line · Vlastimil Babka
On 10/11/2017 08:51 AM, Michal Hocko wrote:
[...]
Quoted 10 lines
Quoted 6 lines
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))The
MIGRATE_MOVABLEcheck is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).
OK, thanks for confirmation. I will remove the MIGRATE_MOVABLE check here. Do you think it is worth removing CMA check as well? This is merely an optimization AFAIU because we do not have to check the full pageblockworth of pfns.
Anyway, let's way for Michael to confirm it really helps. If yes I will post a full patch and ask Andrew to add it as a prerequisite for this patch when sending to Linus to prevent the regression.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 10 lines · Michal Hocko
Quoted 1 line · Vlastimil Babka
On 10/11/2017 08:51 AM, Michal Hocko wrote:
[...]
Quoted 7 lines
Quoted 6 lines
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))
Quoted 8 lines
Quoted 3 lines
The
MIGRATE_MOVABLEcheck is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).OK, thanks for confirmation. I will remove the
MIGRATE_MOVABLEcheck here. Do you think it is worth removing CMA check as well? This is merely an optimization AFAIU because we do not have to check the full pageblockworth of pfns.
Actually, we should remove the CMA part as well. It's true that MIGRATE_CMA does guarantee that the *buddy allocator* won't allocate non-MOVABLE pages from the pageblock. But if the memory got allocated as an actual CMA allocation (alloc_contig...) it will almost certainly not be movable.
Quoted 4 lines
Anyway, let's way for Michael to confirm it really helps. If yes I will post a full patch and ask Andrew to add it as a prerequisite for this patch when sending to Linus to prevent the regression.
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 20 lines · Vlastimil Babka
Quoted 10 lines · Michal Hocko
Quoted 1 line · Vlastimil Babka
On 10/11/2017 08:51 AM, Michal Hocko wrote:
[...]
Quoted 7 lines
Quoted 6 lines
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))Quoted 8 lines
Quoted 3 lines
The
MIGRATE_MOVABLEcheck is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).OK, thanks for confirmation. I will remove the
MIGRATE_MOVABLEcheck here. Do you think it is worth removing CMA check as well? This is merely an optimization AFAIU because we do not have to check the full pageblockworth of pfns.
Quoted 5 lines
Actually, we should remove the CMA part as well. It's true that
MIGRATE_CMAdoes guarantee that the *buddy allocator* won't allocate non-MOVABLE pages from the pageblock. But if the memory got allocated as an actual CMA allocation (alloc_contig...) it will almost certainly not be movable.
That was my suspicious. Thanks!
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
In reply to Vlastimil BabkaQuoted 8 lines · Vlastimil Babka
Quoted 7 lines · Michal Hocko
Quoted 6 lines · Michael Ellerman
Quoted 5 lines · Michal Hocko
Quoted 4 lines · Michael Ellerman
Quoted 3 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
...
Quoted 9 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyWell, that means offline didn't actually work for that block even before this patch, right? Is it even a
movable_nodeblock? I guess not?
Correct. It should fail.
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
After:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035s
Quoted 5 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
Ah, right. So your complain is really about that the failure is not instant anymore for blocks that can't be offlined.
Yes. Previously it failed instantly, now it doesn't fail, and loops infinitely (once the 2 minute limit is removed).
Quoted 10 lines
Quoted 6 lines
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))The
MIGRATE_MOVABLEcheck is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).
OK I'll try that and get back to you.
cheers
Quoted 25 lines
Quoted 25 lines
mm/page_alloc.c +3
-3@@ -7355,9 +7355,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,*/ if (zone_idx (zone) ==ZONE_MOVABLE )return false; - mt =get_pageblock_migratetype (page); -if (mt ==MIGRATE_MOVABLE ||is_migrate_cma (mt)) -return false; pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {@@ -7368,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
Re: [PATCH 1/2] mm, memory_hotplug: do not fail offlining too early
Quoted 30 lines · Michael Ellerman
Quoted 8 lines · Vlastimil Babka
Quoted 7 lines · Michal Hocko
Quoted 6 lines · Michael Ellerman
Quoted 5 lines · Michal Hocko
Quoted 4 lines · Michael Ellerman
Quoted 3 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Memory offlining can fail just too eagerly under a heavy memory pressure.
...
Quoted 9 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
This breaks offline for me.
Prior to this commit:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyWell, that means offline didn't actually work for that block even before this patch, right? Is it even a
movable_nodeblock? I guess not?Correct. It should fail.
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
After:
/sys/devices/system/memory/memory0# time echo 0 > online -bash: echo: write error: Device or resource busyreal 2m0.009s
user 0m0.000s
sys 1m25.035s
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
There's no way that block can be removed, it contains the kernel text, so it should instantly fail - which it used to.
Ah, right. So your complain is really about that the failure is not instant anymore for blocks that can't be offlined.
Yes. Previously it failed instantly, now it doesn't fail, and loops infinitely (once the 2 minute limit is removed).
Yeah it failed only because the migration code retried few times and we bailed out which is wrong as well. I will send two patches as a reply to this email.
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
This is really strange! As you write in other email the page is reserved. That means that some of the earlier checks
if (zone_idx(zone) == ZONE_MOVABLE) return false; mt = get_pageblock_migratetype(page); if (mt == MIGRATE_MOVABLE || is_migrate_cma(mt))
Quoted 5 lines
Quoted 3 lines
The
MIGRATE_MOVABLEcheck is indeed bogus, because that doesn't guarantee there are no unmovable pages in the block (CMA block OTOH should be a guarantee).OK I'll try that and get back to you.
Thanks!
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH v2 1/2 mm: drop migrate type checks from has_unmovable_pages
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 > /sys/devices/system/memory/memory0/online
The current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
The real problem is in has_unmovable_pages in fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks because MIGRATE_MOVABLE is not guaranteed to contain only migrateable pages. It is merely a heuristic. Similarly MIGRATE_CMA does guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
--- mm/page_alloc.c | 3 --- 1 file changed, 3 deletions(-)
mm/page_alloc.c +0 -3
@@ -7355,9 +7355,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,*/ if (zone_idx (zone) ==ZONE_MOVABLE )return false; - mt =get_pageblock_migratetype (page); -if (mt ==MIGRATE_MOVABLE ||is_migrate_cma (mt)) -return false; pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {
Signature · 7 lines
2.14.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH v2 2/2 mm, page_alloc: fail has_unmovable_pages when seeing reserved pages
From: Michal Hocko <[email protected]>
Reserved pages should be completely ignored by the core mm because they have a special meaning for their owners. has_unmovable_pages doesn't check those so we rely on other tests (reference count, or PageLRU) to fail on such pages. Althought this happens to work it is safer to simply check for those explicitly and do not rely on the owner of the page to abuse those fields for special purposes.
Please note that this is more of a further fortification of the code rahter than a fix of an existing issue.
--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)
mm/page_alloc.c +3 -0
@@ -7365,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReferenced (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
Signature · 7 lines
2.14.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/2] mm, page_alloc: fail has_unmovable_pages when seeing reserved pages
Quoted 22 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Reserved pages should be completely ignored by the core mm because they have a special meaning for their owners.
has_unmovable_pagesdoesn't check those so we rely on other tests (reference count, or PageLRU) to fail on such pages. Althought this happens to work it is safer to simply check for those explicitly and do not rely on the owner of the page to abuse those fields for special purposes.Please note that this is more of a further fortification of the code rahter than a fix of an existing issue.
Signed-off-by Michal Hocko <[email protected]>--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)mm/page_alloc.c +0
-0
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7368
Quoted 4 lines
mm/page_alloc.c +1
-0@@ -7365,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReferenced (page))
"Referenced" != "Reserved"
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7373
Quoted 6 lines
mm/page_alloc.c +2
-0+return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/2] mm, page_alloc: fail has_unmovable_pages when seeing reserved pages
Quoted 24 lines · Vlastimil Babka
Quoted 23 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Reserved pages should be completely ignored by the core mm because they have a special meaning for their owners.
has_unmovable_pagesdoesn't check those so we rely on other tests (reference count, or PageLRU) to fail on such pages. Althought this happens to work it is safer to simply check for those explicitly and do not rely on the owner of the page to abuse those fields for special purposes.Please note that this is more of a further fortification of the code rahter than a fix of an existing issue.
Signed-off-by Michal Hocko <[email protected]>--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)mm/page_alloc.c +0
-0@@ -7365,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
Quoted 5 lines
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7368
Quoted 3 lines
mm/page_alloc.c +1
-0page =pfn_to_page (check); +if (PageReferenced (page))"Referenced" != "Reserved"
Dohh, you are right of course. I blame auto-completion ;) but I am lame in fact...
---
Vlastimil Babka
Acked-byRe: [PATCH 2/2] mm, page_alloc: fail has_unmovable_pages when seeing reserved pages
Quoted 47 lines · Michal Hocko
Quoted 24 lines · Vlastimil Babka
Quoted 23 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Reserved pages should be completely ignored by the core mm because they have a special meaning for their owners.
has_unmovable_pagesdoesn't check those so we rely on other tests (reference count, or PageLRU) to fail on such pages. Althought this happens to work it is safer to simply check for those explicitly and do not rely on the owner of the page to abuse those fields for special purposes.Please note that this is more of a further fortification of the code rahter than a fix of an existing issue.
Signed-off-by Michal Hocko <[email protected]>--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)mm/page_alloc.c +0
-0@@ -7365,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,Quoted 5 lines
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7368
Quoted 3 lines
mm/page_alloc.c +1
-0page =pfn_to_page (check); +if (PageReferenced (page))"Referenced" != "Reserved"
Dohh, you are right of course. I blame auto-completion ;) but I am lame in fact...
---
From44b20bdb03846bc5fd79c883d16b8f3aa436878fMon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Fri, 13 Oct 2017 13:55:21 +0200
Subject: [PATCH] mm,page_alloc: failhas_unmovable_pageswhen seeing reserved
pagesReserved pages should be completely ignored by the core mm because they have a special meaning for their owners.
has_unmovable_pagesdoesn't check those so we rely on other tests (reference count, or PageLRU) to fail on such pages. Althought this happens to work it is safer to simply check for those explicitly and do not rely on the owner of the page to abuse those fields for special purposes.
Quoted 4 lines
Please note that this is more of a further fortification of the code rahter than a fix of an existing issue.
Signed-off-by Michal Hocko <[email protected]>
Quoted 10 lines
--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)mm/page_alloc.c +0
-0
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7373
Quoted 9 lines
mm/page_alloc.c +3
-0@@ -7365,6 +7365,9 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count, page =pfn_to_page (check); +if (PageReserved (page)) +return true; +/* * Hugepages are not in LRU lists, but they're movable. * We need not scan over tail pages bacause we don't
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Michal HockoQuoted 20 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
Quoted 2 lines
Reported-by Michael Ellerman <[email protected]>Signed-off-by Michal Hocko <[email protected]>
Thanks, that works for me.
cheers
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 22 lines · Michael Ellerman
Quoted 20 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
Quoted 6 lines
Quoted 2 lines
Reported-by Michael Ellerman <[email protected]>Signed-off-by Michal Hocko <[email protected]>Thanks, that works for me.
Tested-by Michael Ellerman <[email protected]>
Thanks a lot Michael!
Andrew, could you add these two patches and merge them before mm-memory_hotplug-do-not-fail-offlining-too-early.patch? Or should I rather repost the full series (including 2 already merged patches? again?
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Michal HockoQuoted 20 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
Quoted 2 lines
Reported-by Michael Ellerman <[email protected]>Signed-off-by Michal Hocko <[email protected]>
Quoted 10 lines
--- mm/page_alloc.c | 3 --- 1 file changed, 3 deletions(-)mm/page_alloc.c +0
-0
mm/page_alloc.c bool has_unmovable_pages(struct zone *zone, struct page *page, int count, · line 7360
Quoted 9 lines
mm/page_alloc.c +0
-3@@ -7355,9 +7355,6 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,*/ if (zone_idx (zone) ==ZONE_MOVABLE )return false; - mt =get_pageblock_migratetype (page); -if (mt ==MIGRATE_MOVABLE ||is_migrate_cma (mt)) -return false; pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Michal HockoQuoted 12 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
Quoted 7 lines
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation, has_unmovable_pages() will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 21 lines · Joonsoo Kim
Quoted 12 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
Quoted 7 lines
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.
Hmm, does this mean that the CMA allocation path depends on has_unmovable_pages to return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of this function. Which path is that? Can we do the migrate type test theres?
Signature · 2 lines
Michal Hocko SUSE Labs
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 30 lines · Michal Hocko
Quoted 21 lines · Joonsoo Kim
Quoted 12 lines · Michal Hocko
From: Michal Hocko <[email protected]>
Michael has noticed that the memory offline tries to migrate kernel code pages when doing
echo 0 >/sys/devices/system/memory/memory0/onlineThe current implementation will fail the operation after several failed page migration attempts but we shouldn't even attempt to migrate that memory and fail right away because this memory is clearly not migrateable. This will become a real problem when we drop the retry loop counter resp. timeout.
Quoted 7 lines
The real problem is in
has_unmovable_pagesin fact. We should fail if there are any non migrateable pages in the area. In orther to guarantee that remove the migrate type checks becauseMIGRATE_MOVABLEis not guaranteed to contain only migrateable pages. It is merely a heuristic. SimilarlyMIGRATE_CMAdoes guarantee that the page allocator doesn't allocate any non-migrateable pages from the block but CMA allocations themselves are unlikely to migrateable. Therefore remove both checks.Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.
Quoted 3 lines
Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of this
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range() -> start_isolate_page_range() -> set_migratetype_isolate() -> has_unmovable_pages()
We can add one argument, 'XXX' to set_migratetype_isolate() and change it to check migrate type rather than has_unmovable_pages() if 'XXX' is specified.
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of this
Quoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()
I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.
Can we use the migratetype argument and do the special thing for MIGRATE_CMA? Like the following diff?
---
include/linux/page-isolation.h +1 -1
@@ -30,7 +30,7 @@ static inline bool is_migrate_isolate(int migratetype)#endif bool has_unmovable_pages (struct zone *zone,struct page *page,int count, -bool skip_hwpoisoned_pages); +int migratetype,bool skip_hwpoisoned_pages);void set_pageblock_migratetype (struct page *page,int migratetype);int move_freepages_block (struct zone *zone,struct page *page,int migratetype,int *num_movable);
mm/page_alloc.c +11 -1
@@ -7362,6 +7362,7 @@ void *__init alloc_large_system_hash(const char *tablename,* race condition. So you can't expect this function should be exact. */ bool has_unmovable_pages (struct zone *zone,struct page *page,int count, +int migratetype,bool skip_hwpoisoned_pages) {unsigned long pfn, iter, found;
@@ -7373,6 +7374,15 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,if (zone_idx (zone) ==ZONE_MOVABLE )return false; +/* +* CMA allocations (alloc_contig_range) really need to mark isolate +* CMA pageblocks even when they are not movable in fact so consider +* them movable here. +*/ +if (is_migrate_cma (migratetype) && +is_migrate_cma (get_pageblock_migratetype (page))) +return false; + pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {unsigned long check = pfn + iter;
@@ -7458,7 +7468,7 @@ bool is_pageblock_removable_nolock(struct page *page)if (!zone_spans_pfn (zone, pfn))return false; -return !has_unmovable_pages (zone, page,0 , true); +return !has_unmovable_pages (zone, page,0 ,MIGRATE_MOVABLE , true); }#if (defined(CONFIG_MEMORY_ISOLATION ) && defined(CONFIG_COMPACTION )) || defined(CONFIG_CMA )
mm/page_isolation.c +5 -5
@@ -14,7 +14,7 @@#define CREATE_TRACE_POINTS #include <trace/events/page_isolation.h> -static int set_migratetype_isolate (struct page *page, +static int set_migratetype_isolate (struct page *page,int migratetype,bool skip_hwpoisoned_pages) {struct zone *zone;
@@ -51,7 +51,7 @@ static int set_migratetype_isolate(struct page *page,* FIXME: Now, memory hotplug doesn't call shrink_slab() by itself. * We just check MOVABLE pages. */ -if (!has_unmovable_pages (zone, page, arg.pages_found, +if (!has_unmovable_pages (zone, page, arg.pages_found, migratetype, skip_hwpoisoned_pages)) ret =0 ;
@@ -63,14 +63,14 @@ static int set_migratetype_isolate(struct page *page, out:if (!ret) {unsigned long nr_pages; -int migratetype =get_pageblock_migratetype (page); +int mt =get_pageblock_migratetype (page);set_pageblock_migratetype (page,MIGRATE_ISOLATE ); zone->nr_isolate_pageblock++; nr_pages =move_freepages_block (zone, page,MIGRATE_ISOLATE ,NULL ); -__mod_zone_freepage_state (zone, -nr_pages, migratetype); +__mod_zone_freepage_state (zone, -nr_pages, mt); }spin_unlock_irqrestore (&zone->lock, flags);
@@ -182,7 +182,7 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, pfn += pageblock_nr_pages) { page =__first_valid_page (pfn, pageblock_nr_pages);if (page && -set_migratetype_isolate (page, skip_hwpoisoned_pages)) { +set_migratetype_isolate (page, migratetype, skip_hwpoisoned_pages)) { undo_pfn = pfn; goto undo; }
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?
And with the full changelog.
---
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.
Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.
Unfortunately, alloc_contig_range() can be called with MIGRATE_MOVABLE so this patch cannot perfectly fix the problem.
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the set_migratetype_isolate(). set_migratetype_isolate() should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling the start_isolate_page_range() in __offline_pages().
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 57 lines · Joonsoo Kim
Quoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.
Quoted 7 lines
Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.
Yes, alloc_contig_range can be called with MIGRATE_MOVABLE but my understanding is that only CMA allocator really depends on this weird semantic and that does MIGRATE_CMA unconditionally.
Quoted 6 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().
How do we guarantee the atomicity?
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 63 lines · Michal Hocko
Quoted 62 lines · Joonsoo Kim
Quoted 60 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.
Quoted 6 lines
Quoted 2 lines
Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.Yes,
alloc_contig_rangecan be called withMIGRATE_MOVABLEbut my understanding is that only CMA allocator really depends on this weird semantic and that doesMIGRATE_CMAunconditionally.
alloc_contig_range() could be called for partial pages in the pageblock. With your patch, this case also fails unnecessarilly if the other pages in the pageblock is pinned.
Until now, there is no user calling alloc_contig_range() with partial pages except CMA allocator but API could support it.
Quoted 9 lines
Quoted 7 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().How do we guarantee the atomicity?
What atomicity do you mean?
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 67 lines · Joonsoo Kim
Quoted 66 lines · Michal Hocko
Quoted 64 lines · Joonsoo Kim
Quoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.
Quoted 7 lines
Quoted 3 lines
Yes,
alloc_contig_rangecan be called withMIGRATE_MOVABLEbut my understanding is that only CMA allocator really depends on this weird semantic and that doesMIGRATE_CMAunconditionally.
alloc_contig_range()could be called for partial pages in the pageblock. With your patch, this case also fails unnecessarilly if the other pages in the pageblock is pinned.
Is this really the case for GB pages? Do we really want to mess those with CMA blocks and make those blocks basically unusable because GB pages are rarely (if at all migrateable)?
Quoted 2 lines
Until now, there is no user calling
alloc_contig_range()with partial pages except CMA allocator but API could support it.
I disagree. If this is a CMA thing it should stay that way. The semantic is quite confusing already, please let's not make it even worse.
Quoted 10 lines
Quoted 8 lines
Quoted 6 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().How do we guarantee the atomicity?
What atomicity do you mean?
Currently we are checking and isolating pages under zone lock. If we split that we are losing atomicity, aren't we.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 72 lines · Michal Hocko
Quoted 71 lines · Joonsoo Kim
Quoted 69 lines · Michal Hocko
Quoted 57 lines · Joonsoo Kim
Quoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Quoted 7 lines
Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.Yes,
alloc_contig_rangecan be called withMIGRATE_MOVABLEbut my understanding is that only CMA allocator really depends on this weird semantic and that doesMIGRATE_CMAunconditionally.
Quoted 5 lines
Quoted 3 lines
alloc_contig_range()could be called for partial pages in the pageblock. With your patch, this case also fails unnecessarilly if the other pages in the pageblock is pinned.Is this really the case for GB pages? Do we really want to mess those
No, but, as I mentioned already, this API can be called with less pages. I know that there is no user with less pages at this moment but I cannot see any point to reduce this API's capability.
Quoted 8 lines
with CMA blocks and make those blocks basically unusable because GB pages are rarely (if at all migrateable)?
Quoted 2 lines
Until now, there is no user calling
alloc_contig_range()with partial pages except CMA allocator but API could support it.I disagree. If this is a CMA thing it should stay that way. The semantic is quite confusing already, please let's not make it even worse.
It is already used by other component.
I'm not sure what is the confusing semantic you mentioned. I think that set_migratetype_isolate() has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think that set_migratetype_isolate() need to check it? If so, why?
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().
Quoted 6 lines
Quoted 3 lines
Quoted 1 line
How do we guarantee the atomicity?
What atomicity do you mean?
Currently we are checking and isolating pages under zone lock. If we split that we are losing atomicity, aren't we.
I think that it can be done easily.
set_migratetype_isolate() {
lock
__set_migratetype_isolate();
unlock
}set_migratetype_isolate_if_no_unmovable_pages() {
lock
if (has_unmovable_pages())
fail
else
__set_migratetype_isolate()
unlock
}
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 77 lines · Joonsoo Kim
Quoted 76 lines · Michal Hocko
Quoted 74 lines · Joonsoo Kim
Quoted 63 lines · Michal Hocko
Quoted 62 lines · Joonsoo Kim
Quoted 60 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Quoted 6 lines
Quoted 2 lines
Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.Yes,
alloc_contig_rangecan be called withMIGRATE_MOVABLEbut my understanding is that only CMA allocator really depends on this weird semantic and that doesMIGRATE_CMAunconditionally.
alloc_contig_range()could be called for partial pages in the pageblock. With your patch, this case also fails unnecessarilly if the other pages in the pageblock is pinned.
Quoted 5 lines
Quoted 1 line
Is this really the case for GB pages? Do we really want to mess those
No, but, as I mentioned already, this API can be called with less pages. I know that there is no user with less pages at this moment but I cannot see any point to reduce this API's capability.
I am still confused. So when exactly would you want to use this api for MIGRATE_MOVABLE and use a partial MIGRATE_CMA pageblock?
Quoted 9 lines
Quoted 8 lines
with CMA blocks and make those blocks basically unusable because GB pages are rarely (if at all migrateable)?
Quoted 2 lines
Until now, there is no user calling
alloc_contig_range()with partial pages except CMA allocator but API could support it.I disagree. If this is a CMA thing it should stay that way. The semantic is quite confusing already, please let's not make it even worse.
Quoted 7 lines
It is already used by other component.
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?
My intuitive understanding of set_migratetype_isolate is that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that the alloc_contig_range would like to guarantee the same to not rely on a fixed amount of migration attempts.
Quoted 22 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().Quoted 6 lines
Quoted 3 lines
Quoted 1 line
How do we guarantee the atomicity?
What atomicity do you mean?
Currently we are checking and isolating pages under zone lock. If we split that we are losing atomicity, aren't we.
I think that it can be done easily.
set_migratetype_isolate() { lock __set_migratetype_isolate(); unlock }
Quoted 8 lines
set_migratetype_isolate_if_no_unmovable_pages(){
lock
if (has_unmovable_pages())
fail
else
__set_migratetype_isolate()
unlock
}
So you are essentially suggesting to split the API for alloc_contig_range and hotplug users? Care to send a patch? It is not like I would really love this but I would really like to have this issue addressed because I really do want all other patches which depend on this to be merged in the next release cycle.
That being said, I would much rather see MIGRATE_CMA case special cased than duplicate the already confusing API but I will not insist of course.
Signature · 2 lines
Michal Hocko SUSE Labs
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 104 lines · Michal Hocko
Quoted 77 lines · Joonsoo Kim
Quoted 76 lines · Michal Hocko
Quoted 74 lines · Joonsoo Kim
Quoted 63 lines · Michal Hocko
Quoted 62 lines · Joonsoo Kim
Quoted 60 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Quoted 6 lines
Quoted 2 lines
Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.Yes,
alloc_contig_rangecan be called withMIGRATE_MOVABLEbut my understanding is that only CMA allocator really depends on this weird semantic and that doesMIGRATE_CMAunconditionally.
alloc_contig_range()could be called for partial pages in the pageblock. With your patch, this case also fails unnecessarilly if the other pages in the pageblock is pinned.Quoted 5 lines
Quoted 1 line
Is this really the case for GB pages? Do we really want to mess those
No, but, as I mentioned already, this API can be called with less pages. I know that there is no user with less pages at this moment but I cannot see any point to reduce this API's capability.
I am still confused. So when exactly would you want to use this api for
MIGRATE_MOVABLEand use a partialMIGRATE_CMApageblock?Quoted 9 lines
Quoted 8 lines
with CMA blocks and make those blocks basically unusable because GB pages are rarely (if at all migrateable)?
Quoted 2 lines
Until now, there is no user calling
alloc_contig_range()with partial pages except CMA allocator but API could support it.I disagree. If this is a CMA thing it should stay that way. The semantic is quite confusing already, please let's not make it even worse.
Quoted 7 lines
It is already used by other component.
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?
Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.
Yes, alloc_contig_range() also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit but alloc_contig_range() doesn't. alloc_contig_range() works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'. In this case, checking movability of all pages on the pageblock would cause the problem as I mentioned before.
Quoted 38 lines
Quoted 23 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().Quoted 6 lines
Quoted 3 lines
Quoted 1 line
How do we guarantee the atomicity?
What atomicity do you mean?
Currently we are checking and isolating pages under zone lock. If we split that we are losing atomicity, aren't we.
I think that it can be done easily.
set_migratetype_isolate() { lock __set_migratetype_isolate(); unlock }Quoted 8 lines
set_migratetype_isolate_if_no_unmovable_pages(){
lock
if (has_unmovable_pages())
fail
else
__set_migratetype_isolate()
unlock
}So you are essentially suggesting to split the API for
alloc_contig_rangeand hotplug users? Care to send a patch? It is not like I would really love this but I would really like to have this issue addressed because I really do want all other patches which depend on this to be merged in the next release cycle.
Quoted 3 lines
That being said, I would much rather see
MIGRATE_CMAcase special cased than duplicate the already confusing API but I will not insist of course.
Okay. I atteach the patch. Andrew, could you revert Michal's series and apply this patch first? Perhaps, Michal will resend his series on top of this one.
Thanks.
--------------->8-------------------
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 1 line · Joonsoo Kim
On Mon, Oct 23, 2017 at 10:10:09AM +0200, Michal Hocko wrote:
[...]
Quoted 8 lines
Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.
Quoted 6 lines
Yes,
alloc_contig_range()also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit butalloc_contig_range()doesn't.alloc_contig_range()works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'.
I am still confused. So when is it safe to isolate a page from the CMA pageblock for something that is not a CMA allocation request? Don't we lose a CMA guanratee that way?
[...]
Quoted 7 lines
Quoted 3 lines
That being said, I would much rather see
MIGRATE_CMAcase special cased than duplicate the already confusing API but I will not insist of course.Okay. I atteach the patch. Andrew, could you revert Michal's series and apply this patch first? Perhaps, Michal will resend his series on top of this one.
I am not convinced about this approach but I will not argue about the patch though. If this is seen as a right way forward, I will rebase my patches on top.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Joonsoo KimQuoted 14 lines · Joonsoo Kim
Quoted 6 lines
Quoted 5 lines
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.
Quoted 8 lines
Yes,
alloc_contig_range()also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit butalloc_contig_range()doesn't.alloc_contig_range()works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'. In this case, checking movability of all pages on the pageblock would cause the problem as I mentioned before.
I couldn't look too closely yet, but do I understand correctly that the *potential* problem (because as you say there are no such alloc_contig_range callers) you are describing is not newly introduced by Michal's series? Then his patch fixing the introduced regression should be enough for now, and further improvements could be posted on top, and not vice versa? Please don't take it wrong, I agree the current state is a bit of a mess and improvements are welcome. Also it seems to me that Michal is right, and there's nothing preventing alloc_contig_range() to allocate from CMA pageblocks for non-CMA purposes (likely not movable), and that should be also fixed?
Vlastimil
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 24 lines · Vlastimil Babka
Quoted 14 lines · Joonsoo Kim
Quoted 6 lines
Quoted 5 lines
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.Quoted 8 lines
Yes,
alloc_contig_range()also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit butalloc_contig_range()doesn't.alloc_contig_range()works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'. In this case, checking movability of all pages on the pageblock would cause the problem as I mentioned before.
Quoted 10 lines
I couldn't look too closely yet, but do I understand correctly that the *potential* problem (because as you say there are no such
alloc_contig_rangecallers) you are describing is not newly introduced by Michal's series? Then his patch fixing the introduced regression should be enough for now, and further improvements could be posted on top, and not vice versa? Please don't take it wrong, I agree the current state is a bit of a mess and improvements are welcome. Also it seems to me that Michal is right, and there's nothing preventingalloc_contig_range()to allocate from CMA pageblocks for non-CMA purposes (likely not movable), and that should be also fixed?
OK, it seems I understand Joonsoo's concern more now. And I agree with Vlastimil, that it is better to plug the immediate regression with a minimal patch and discuss general improvements of the pfn based allocator separatelly. There are more things to clear up there, including the proper API (alloc_contig_range is just too low level for anybody to use) as well as the MIGRATE_* flags usage (e.g. I am not really sure GB pages usage of MIGRATE_MOVABLE is really correct). alloc_contig_range looks like an internal CMA function which has been (ab)used for a different purpose to me rather than a well thought through interface. MAP_CONTIG discussion has shown some interest in an API for large allocations so I _believe_ we should think that through befire we grow more unexpected users.
I am definitely willing to help there.
Is that something you would agree with Joonsoo?
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Vlastimil BabkaQuoted 24 lines · Vlastimil Babka
Quoted 14 lines · Joonsoo Kim
Quoted 6 lines
Quoted 5 lines
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.Quoted 8 lines
Yes,
alloc_contig_range()also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit butalloc_contig_range()doesn't.alloc_contig_range()works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'. In this case, checking movability of all pages on the pageblock would cause the problem as I mentioned before.
Quoted 4 lines
I couldn't look too closely yet, but do I understand correctly that the *potential* problem (because as you say there are no such
alloc_contig_rangecallers) you are describing is not newly introduced by Michal's series? Then his patch fixing the introduced regression
This potential problem exists there before Michal's series if the migratetype of the target pageblock isn't MIGRATE_MOVABLE or MIGRATE_CMA. However, his series enlarges this potential problem surface. It would be the problem now even if the migratetype of the target pageblock is MIGRATE_MOVABLE.
Quoted 3 lines
should be enough for now, and further improvements could be posted on top, and not vice versa? Please don't take it wrong, I agree the current state is a bit of a mess and improvements are welcome. Also it seems to
I'm not very sensitive that which patch is applied first. I can do rebase. But, IMHO, correct applying order is my patch first and then Michal's series.
Anyway, Michal, feel free to do what you think correct.
Quoted 3 lines
me that Michal is right, and there's nothing preventing
alloc_contig_range()to allocate from CMA pageblocks for non-CMA purposes (likely not movable), and that should be also fixed?
I noticed the problem you mentioned now and, yes, it should be fixed. My patch will naturally fixes this issue, too.
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 40 lines · Joonsoo Kim
Quoted 24 lines · Vlastimil Babka
Quoted 14 lines · Joonsoo Kim
Quoted 6 lines
Quoted 5 lines
I'm not sure what is the confusing semantic you mentioned. I think that
set_migratetype_isolate()has confusing semantic and should be fixed since making the pageblock isolated doesn't need to check if there is unmovable page or not. Do you think thatset_migratetype_isolate()need to check it? If so, why?Quoted 7 lines
My intuitive understanding of
set_migratetype_isolateis that it either suceeds and that means that the given pfn range can be isolated for the given type of allocation (be it movable or cma). No new pages will be allocated from this range to allow converging into a free range in a finit amount of time. At least this is how the hotplug code would like to use it and I suppose that thealloc_contig_rangewould like to guarantee the same to not rely on a fixed amount of migration attempts.Quoted 8 lines
Yes,
alloc_contig_range()also want to guarantee the similar thing. Major difference between them is 'given pfn range'. memory hotplug works by pageblock unit butalloc_contig_range()doesn't.alloc_contig_range()works by the page unit. However, there is no easy way to isolate individual page so it uses pageblock isolation regardless of 'given pfn range'. In this case, checking movability of all pages on the pageblock would cause the problem as I mentioned before.Quoted 4 lines
I couldn't look too closely yet, but do I understand correctly that the *potential* problem (because as you say there are no such
alloc_contig_rangecallers) you are describing is not newly introduced by Michal's series? Then his patch fixing the introduced regressionThis potential problem exists there before Michal's series if the migratetype of the target pageblock isn't
MIGRATE_MOVABLEorMIGRATE_CMA. However, his series enlarges this potential problem surface. It would be the problem now even if the migratetype of the target pageblock isMIGRATE_MOVABLE.Quoted 3 lines
should be enough for now, and further improvements could be posted on top, and not vice versa? Please don't take it wrong, I agree the current state is a bit of a mess and improvements are welcome. Also it seems to
Quoted 5 lines
I'm not very sensitive that which patch is applied first. I can do rebase. But, IMHO, correct applying order is my patch first and then Michal's series.
Anyway, Michal, feel free to do what you think correct.
If you do not mind I would rather go with the simple patch first and then build on top of that. For two reasons 1) it documents the CMA requirement and 2) there do not seem to be any real users affected by the issue you are seeing right now. And 3) I really believe alloc_contig_range needs a deeper thought to be usable in more general contexts.
Quoted 6 lines
Quoted 3 lines
me that Michal is right, and there's nothing preventing
alloc_contig_range()to allocate from CMA pageblocks for non-CMA purposes (likely not movable), and that should be also fixed?I noticed the problem you mentioned now and, yes, it should be fixed. My patch will naturally fixes this issue, too.
I really do not see how.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Joonsoo KimQuoted 65 lines · Joonsoo Kim
Quoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.
Quoted 9 lines
I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().Thanks.
Hi Joonsoo,
How about add a flag to skip or not has_unmovable_pages() in set_migratetype_isolate()? Something like the skip_hwpoisoned_pages.
Thanks,
Xishi Qiu
Quoted 3 lines
.
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 3 lines · Xishi Qiu
Quoted 1 line · Joonsoo Kim
On Thu, Oct 19, 2017 at 02:21:18PM +0200, Michal Hocko wrote:
[...]
Quoted 35 lines
Quoted 35 lines
Quoted 20 lines
Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().
Quoted 7 lines
Quoted 2 lines
Thanks.
Hi Joonsoo,
How about add a flag to skip or not
has_unmovable_pages()inset_migratetype_isolate()? Something like theskip_hwpoisoned_pages.
I believe this is what Joonsoo was proposing actually. I cannot say I would like skip_hwpoisoned_pages and adding one more flag is just too ugly. So I would prefer to have something that would actually make sense from the semantic POV. If CMA really needs to work with partial CMA blocks then MIGRATE_CMA as an indicator sounds like the right way to go to me. But I am not a CMA expert so I might be missing some subtlety here.
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
Quoted 43 lines · Michal Hocko
Quoted 3 lines · Xishi Qiu
Quoted 1 line · Joonsoo Kim
On Thu, Oct 19, 2017 at 02:21:18PM +0200, Michal Hocko wrote:
[...]
Quoted 38 lines
Quoted 37 lines
Quoted 20 lines
Quoted 1 line
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.Quoted 4 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Unfortunately,
alloc_contig_range()can be called withMIGRATE_MOVABLEso this patch cannot perfectly fix the problem.I did a more thinking and found that it's strange to check if there is unmovable page in the pageblock during the
set_migratetype_isolate().set_migratetype_isolate()should be just for setting the migratetype of the pageblock. Checking other things should be done by another place, for example, before calling thestart_isolate_page_range()in__offline_pages().Thanks.
Quoted 6 lines
Quoted 4 lines
Hi Joonsoo,
How about add a flag to skip or not
has_unmovable_pages()inset_migratetype_isolate()? Something like theskip_hwpoisoned_pages.I believe this is what Joonsoo was proposing actually. I cannot say I
Yes, I initially suggested this idea but change my mind. Now, I think that problem is not in has_unmovable_pages() but in set_migratetype_isolate(). So different solution is needed. See my other reply to Michal.
Thanks.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Vlastimil Babka
Acked-byRe: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Michal HockoQuoted 56 lines · Michal Hocko
Quoted 26 lines · Michal Hocko
Quoted 2 lines · Joonsoo Kim
Quoted 1 line · Michal Hocko
On Thu 19-10-17 11:51:11, Joonsoo Kim wrote:
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Hello,
This patch will break the CMA user. As you mentioned, CMA allocation itself isn't migrateable. So, after a single page is allocated through CMA allocation,
has_unmovable_pages()will return true for this pageblock. Then, futher CMA allocation request to this pageblock will fail because it requires isolating the pageblock.Hmm, does this mean that the CMA allocation path depends on
has_unmovable_pagesto return false here even though the memory is not movable? This sounds really strange to me and kind of abuse of thisQuoted 6 lines
Your understanding is correct. Perhaps, abuse or wrong function name.
Quoted 1 line
function. Which path is that? Can we do the migrate type test theres?
alloc_contig_range()->start_isolate_page_range()->set_migratetype_isolate()->has_unmovable_pages()I see. It seems that the CMA and memory hotplug have a very different view on what should happen during isolation.
Quoted 6 lines
Quoted 3 lines
We can add one argument, 'XXX' to
set_migratetype_isolate()and change it to check migrate type rather thanhas_unmovable_pages()if 'XXX' is specified.Can we use the migratetype argument and do the special thing for
MIGRATE_CMA? Like the following diff?And with the full changelog.
---
From8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.
Quoted 7 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Reported-by Joonsoo Kim <[email protected]>Signed-off-by Michal Hocko <[email protected]>
Quoted 97 lines
--- include/linux/page-isolation.h | 2 +- mm/page_alloc.c | 12 +++++++++++- mm/page_isolation.c | 10 +++++----- 3 files changed, 17 insertions(+), 7 deletions(-)include/linux/page-isolation.h +1
-1@@ -30,7 +30,7 @@ static inline bool is_migrate_isolate(int migratetype)#endif bool has_unmovable_pages (struct zone *zone,struct page *page,int count, -bool skip_hwpoisoned_pages); +int migratetype,bool skip_hwpoisoned_pages);void set_pageblock_migratetype (struct page *page,int migratetype);int move_freepages_block (struct zone *zone,struct page *page,int migratetype,int *num_movable);mm/page_alloc.c +11
-1@@ -7344,6 +7344,7 @@ void *__init alloc_large_system_hash(const char *tablename,* race condition. So you can't expect this function should be exact. */ bool has_unmovable_pages (struct zone *zone,struct page *page,int count, +int migratetype,bool skip_hwpoisoned_pages) {unsigned long pfn, iter, found;@@ -7356,6 +7357,15 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,if (zone_idx (zone) ==ZONE_MOVABLE )return false; +/* +* CMA allocations (alloc_contig_range) really need to mark isolate +* CMA pageblocks even when they are not movable in fact so consider +* them movable here. +*/ +if (is_migrate_cma (migratetype) && +is_migrate_cma (get_pageblock_migratetype (page))) +return false; + pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {unsigned long check = pfn + iter;@@ -7441,7 +7451,7 @@ bool is_pageblock_removable_nolock(struct page *page)if (!zone_spans_pfn (zone, pfn))return false; -return !has_unmovable_pages (zone, page,0 , true); +return !has_unmovable_pages (zone, page,0 ,MIGRATE_MOVABLE , true); }#if (defined(CONFIG_MEMORY_ISOLATION ) && defined(CONFIG_COMPACTION )) || defined(CONFIG_CMA )mm/page_isolation.c +4
-4@@ -14,7 +14,7 @@#define CREATE_TRACE_POINTS #include <trace/events/page_isolation.h> -static int set_migratetype_isolate (struct page *page, +static int set_migratetype_isolate (struct page *page,int migratetype,bool skip_hwpoisoned_pages) {struct zone *zone;@@ -51,7 +51,7 @@ static int set_migratetype_isolate(struct page *page,* FIXME: Now, memory hotplug doesn't call shrink_slab() by itself. * We just check MOVABLE pages. */ -if (!has_unmovable_pages (zone, page, arg.pages_found, +if (!has_unmovable_pages (zone, page, arg.pages_found, migratetype, skip_hwpoisoned_pages)) ret =0 ;@@ -63,14 +63,14 @@ static int set_migratetype_isolate(struct page *page, out:if (!ret) {unsigned long nr_pages; -int migratetype =get_pageblock_migratetype (page); +int mt =get_pageblock_migratetype (page);set_pageblock_migratetype (page,MIGRATE_ISOLATE ); zone->nr_isolate_pageblock++; nr_pages =move_freepages_block (zone, page,MIGRATE_ISOLATE ,NULL ); -__mod_zone_freepage_state (zone, -nr_pages, migratetype); +__mod_zone_freepage_state (zone, -nr_pages, mt); }spin_unlock_irqrestore (&zone->lock, flags);
mm/page_isolation.c int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, · line 188
Quoted 8 lines
mm/page_isolation.c +1
-1@@ -182,7 +182,7 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, pfn += pageblock_nr_pages) { page =__first_valid_page (pfn, pageblock_nr_pages);if (page && -set_migratetype_isolate (page, skip_hwpoisoned_pages)) { +set_migratetype_isolate (page, migratetype, skip_hwpoisoned_pages)) { undo_pfn = pfn; goto undo; }
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/2] mm: drop migrate type checks from has_unmovable_pages
In reply to Michal HockoOn Thu 19-10-17 14:21:18, Michal Hocko wrote:
[...]
Quoted 20 lines
From
8cbd811d741f5dd93d1b21bb3ef94482a4d0bd32Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Thu, 19 Oct 2017 14:14:02 +0200
Subject: [PATCH] mm: distinguish CMA and MOVABLE isolation in
has_unmovable_pagesJoonsoo has noticed that "mm: drop migrate type checks from
has_unmovable_pages" would break CMA allocator because it relies onhas_unmovable_pagesreturning false even for CMA pageblocks which in fact don't have to be movable:alloc_contig_range
start_isolate_page_range
set_migratetype_isolate
has_unmovable_pagesThis is a result of the code sharing between CMA and memory hotplug while each one has a different idea of what
has_unmovable_pagesshould return. This is unfortunate but fixing it properly would require a lot of code duplication.
Quoted 8 lines
Fix the issue by introducing the requested migrate type argument and special case
MIGRATE_CMAcase where CMA page blocks are handled properly. This will work for memory hotplug because it requiresMIGRATE_MOVABLE.Reported-by Joonsoo Kim <[email protected]>Signed-off-by Michal Hocko <[email protected]>---
Andrew,
could you add this one to the bundle as well? After mm-drop-migrate-type-checks-from-has_unmovable_pages.patch, please.
Joonsoo would like to see a larger change in this area [1] but I think we need to think those much more through [2] and Joonsoo agreed to take the simpler patch first [3].
Thanks!
[1] http://lkml.kernel.org/r/20171024044423.GA31424@js1304-P5Q-DELUXE
[2] http://lkml.kernel.org/r/[email protected]
[3] http://lkml.kernel.org/r/20171026024707.GA11791@js1304-P5Q-DELUXE
Quoted 109 lines
include/linux/page-isolation.h | 2 +- mm/page_alloc.c | 12 +++++++++++- mm/page_isolation.c | 10 +++++----- 3 files changed, 17 insertions(+), 7 deletions(-)include/linux/page-isolation.h +1
-1@@ -30,7 +30,7 @@ static inline bool is_migrate_isolate(int migratetype)#endif bool has_unmovable_pages (struct zone *zone,struct page *page,int count, -bool skip_hwpoisoned_pages); +int migratetype,bool skip_hwpoisoned_pages);void set_pageblock_migratetype (struct page *page,int migratetype);int move_freepages_block (struct zone *zone,struct page *page,int migratetype,int *num_movable);mm/page_alloc.c +11
-1@@ -7344,6 +7344,7 @@ void *__init alloc_large_system_hash(const char *tablename,* race condition. So you can't expect this function should be exact. */ bool has_unmovable_pages (struct zone *zone,struct page *page,int count, +int migratetype,bool skip_hwpoisoned_pages) {unsigned long pfn, iter, found;@@ -7356,6 +7357,15 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,if (zone_idx (zone) ==ZONE_MOVABLE )return false; +/* +* CMA allocations (alloc_contig_range) really need to mark isolate +* CMA pageblocks even when they are not movable in fact so consider +* them movable here. +*/ +if (is_migrate_cma (migratetype) && +is_migrate_cma (get_pageblock_migratetype (page))) +return false; + pfn =page_to_pfn (page);for (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {unsigned long check = pfn + iter;@@ -7441,7 +7451,7 @@ bool is_pageblock_removable_nolock(struct page *page)if (!zone_spans_pfn (zone, pfn))return false; -return !has_unmovable_pages (zone, page,0 , true); +return !has_unmovable_pages (zone, page,0 ,MIGRATE_MOVABLE , true); }#if (defined(CONFIG_MEMORY_ISOLATION ) && defined(CONFIG_COMPACTION )) || defined(CONFIG_CMA )mm/page_isolation.c +5
-5@@ -14,7 +14,7 @@#define CREATE_TRACE_POINTS #include <trace/events/page_isolation.h> -static int set_migratetype_isolate (struct page *page, +static int set_migratetype_isolate (struct page *page,int migratetype,bool skip_hwpoisoned_pages) {struct zone *zone;@@ -51,7 +51,7 @@ static int set_migratetype_isolate(struct page *page,* FIXME: Now, memory hotplug doesn't call shrink_slab() by itself. * We just check MOVABLE pages. */ -if (!has_unmovable_pages (zone, page, arg.pages_found, +if (!has_unmovable_pages (zone, page, arg.pages_found, migratetype, skip_hwpoisoned_pages)) ret =0 ;@@ -63,14 +63,14 @@ static int set_migratetype_isolate(struct page *page, out:if (!ret) {unsigned long nr_pages; -int migratetype =get_pageblock_migratetype (page); +int mt =get_pageblock_migratetype (page);set_pageblock_migratetype (page,MIGRATE_ISOLATE ); zone->nr_isolate_pageblock++; nr_pages =move_freepages_block (zone, page,MIGRATE_ISOLATE ,NULL ); -__mod_zone_freepage_state (zone, -nr_pages, migratetype); +__mod_zone_freepage_state (zone, -nr_pages, mt); }spin_unlock_irqrestore (&zone->lock, flags);@@ -182,7 +182,7 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, pfn += pageblock_nr_pages) { page =__first_valid_page (pfn, pageblock_nr_pages);if (page && -set_migratetype_isolate (page, skip_hwpoisoned_pages)) { +set_migratetype_isolate (page, migratetype, skip_hwpoisoned_pages)) { undo_pfn = pfn; goto undo; }Signature · 5 lines
2.14.2 -- Michal Hocko SUSE Labs
Signature · 2 lines
Michal Hocko SUSE Labs
PATCH v2 2/2 mm, memory_hotplug: remove timeout from __offline_memory
In reply to Michal HockoFrom: Michal Hocko <[email protected]>
We have a hardcoded 120s timeout after which the memory offline fails basically since the hot remove has been introduced. This is essentially a policy implemented in the kernel. Moreover there is no way to adjust the timeout and so we are sometimes facing memory offline failures if the system is under a heavy memory pressure or very intensive CPU workload on large machines.
It is not very clear what purpose the timeout actually serves. The offline operation is interruptible by a signal so if userspace wants some timeout based termination this can be done trivially by sending a signal.
If there is a strong usecase to do this from the kernel then we should do it properly and have a it tunable from the userspace with the timeout disabled by default along with the explanation who uses it and for what purporse.
--- mm/memory_hotplug.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
mm/memory_hotplug.c +3 -7
@@ -1593,9 +1593,9 @@ static void node_states_clear_node(int node, struct memory_notify *arg) }static int __ref __offline_pages (unsigned long start_pfn, -unsigned long end_pfn,unsigned long timeout) +unsigned long end_pfn) { -unsigned long pfn, nr_pages, expire; +unsigned long pfn, nr_pages;long offlined_pages;int ret, node;unsigned long flags;
@@ -1633,12 +1633,8 @@ static int __ref __offline_pages(unsigned long start_pfn, goto failed_removal; pfn = start_pfn; - expire = jiffies + timeout; repeat:/* start memory hot removal */ - ret = -EBUSY ; -if (time_after (jiffies, expire)) - goto failed_removal; ret = -EINTR ;if (signal_pending (current)) goto failed_removal;
@@ -1711,7 +1707,7 @@ static int __ref __offline_pages(unsigned long start_pfn,/* Must be protected by mem_hotplug_begin() or a device_lock */ int offline_pages (unsigned long start_pfn,unsigned long nr_pages) { -return __offline_pages (start_pfn, start_pfn + nr_pages,120 *HZ ); +return __offline_pages (start_pfn, start_pfn + nr_pages); }#endif /* CONFIG_MEMORY_HOTREMOVE */
Signature · 7 lines
2.14.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>