mm, compaction: allow compaction for GFP_NOFS requests
Subsystems (2)
RFC PATCH 1/1 mm, compaction: allow compaction for GFP_NOFS requests
From: Michal Hocko <[email protected]>
compaction has been disabled for GFP_NOFS and GFP_NOIO requests since the direct compaction was introduced by 56de7263fcf3 ("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in the GFP_NOFS context just fine. This might be a large portion of the memory in many/most workkloads.
Remove the GFP_NOFS restriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.
The effect of this patch will be probably very limited in many/most workloads because higher order GFP_NOFS requests are quite rare, although different configurations might lead to very different results as GFP_NOFS usage is rather unleashed (e.g. I had hard time to trigger any with my setup). But still there shouldn't be any strong reason to completely back off and do nothing in that context. In the worst case we just skip parts of the block with fs pages. This might be still sufficient to make a progress for small orders.
---
Hi,
I am sending this as an RFC because I am not completely sure this a) is really worth it and b) it is 100% correct. I couldn't find any problems when staring into the code but as mentioned in the changelog I wasn't really able to trigger high order GFP_NOFS requests in my setup.
Thoughts?
mm/compaction.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
mm/compaction.c +12 -3
@@ -834,6 +834,13 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, page_count(page) > page_mapcount(page)) goto isolate_fail; +/* +* Only allow to migrate anonymous pages in GFP_NOFS context +* because those do not depend on fs locks. +*/ +if (!(cc->gfp_mask & __GFP_FS) &&page_mapping (page)) + goto isolate_fail; +/* If we already hold the lock, we can skip some rechecking */ if (!locked) { locked = compact_trylock_irqsave(zone_lru_lock(zone),
@@ -1696,14 +1703,16 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, enum compact_priority prio) { - int may_enter_fs = gfp_mask & __GFP_FS; int may_perform_io = gfp_mask & __GFP_IO;struct zoneref *z;struct zone *zone;enum compact_result rc =COMPACT_SKIPPED ; -/* Check if the GFP flags allow compaction */ -if (!may_enter_fs || !may_perform_io) +/* +* Check if the GFP flags allow compaction - GFP_NOIO is really +* tricky context because the migration might require IO and +*/ +if (!may_perform_io)return COMPACT_SKIPPED ;trace_mm_compaction_try_to_compact_pages (order, gfp_mask, prio);
Signature · 7 lines
2.9.3 -- 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>
Quoted 11 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.
Quoted 7 lines
Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare,
You say they are rare only because you don't know how to trigger them easily. :/
Try this:
# mkfs.xfs -f -n size=64k <dev>
# mount <dev> /mnt/scratch
# time ./fs_mark -D 10000 -S0 -n 100000 -s 0 -L 32 \
-d /mnt/scratch/0 -d /mnt/scratch/1 \
-d /mnt/scratch/2 -d /mnt/scratch/3 \
-d /mnt/scratch/4 -d /mnt/scratch/5 \
-d /mnt/scratch/6 -d /mnt/scratch/7 \
-d /mnt/scratch/8 -d /mnt/scratch/9 \
-d /mnt/scratch/10 -d /mnt/scratch/11 \
-d /mnt/scratch/12 -d /mnt/scratch/13 \
-d /mnt/scratch/14 -d /mnt/scratch/15As soon as tail pushing on the journal starts (a few seconds in, most likely), you'll start to see lots of 65kB allocations being requested in GFP_NOFS context by the xfs-cil-worker context doing journal checkpoint formatting....
Cheers,
Dave.
Signature · 8 lines
Dave Chinner [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>
Quoted 17 lines · Dave Chinner
Quoted 16 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.
Quoted 5 lines
Quoted 2 lines
The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare,You say they are rare only because you don't know how to trigger them easily. :/
true
Quoted 13 lines
Try this:
# mkfs.xfs -f -n size=64k <dev> # mount <dev> /mnt/scratch # time ./fs_mark -D 10000 -S0 -n 100000 -s 0 -L 32 \ -d /mnt/scratch/0 -d /mnt/scratch/1 \ -d /mnt/scratch/2 -d /mnt/scratch/3 \ -d /mnt/scratch/4 -d /mnt/scratch/5 \ -d /mnt/scratch/6 -d /mnt/scratch/7 \ -d /mnt/scratch/8 -d /mnt/scratch/9 \ -d /mnt/scratch/10 -d /mnt/scratch/11 \ -d /mnt/scratch/12 -d /mnt/scratch/13 \ -d /mnt/scratch/14 -d /mnt/scratch/15
Does this simulate a standard or usual fs workload/configuration? I am not questioning that higher order NOFS allocations are non-existent - that's why I came with the patch in the first place ;). My observation was that they are so rare that the visible effect of this patch might be quite low or even hard to notice.
Anyway, thanks for a _useful_ testcase to play with! Let's see what numbers I get from this.
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>
Quoted 40 lines · Michal Hocko
Quoted 17 lines · Dave Chinner
Quoted 16 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.Quoted 5 lines
Quoted 2 lines
The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare,You say they are rare only because you don't know how to trigger them easily. :/
true
Quoted 13 lines
Try this:
# mkfs.xfs -f -n size=64k <dev> # mount <dev> /mnt/scratch # time ./fs_mark -D 10000 -S0 -n 100000 -s 0 -L 32 \ -d /mnt/scratch/0 -d /mnt/scratch/1 \ -d /mnt/scratch/2 -d /mnt/scratch/3 \ -d /mnt/scratch/4 -d /mnt/scratch/5 \ -d /mnt/scratch/6 -d /mnt/scratch/7 \ -d /mnt/scratch/8 -d /mnt/scratch/9 \ -d /mnt/scratch/10 -d /mnt/scratch/11 \ -d /mnt/scratch/12 -d /mnt/scratch/13 \ -d /mnt/scratch/14 -d /mnt/scratch/15
Quoted 1 line
Does this simulate a standard or usual fs workload/configuration? I am
Unfortunately, there was an era of cargo cult configuration tweaks in the Ceph community that has resulted in a large number of production machines with XFS filesystems configured this way. And a lot of them store large numbers of small files and run under significant sustained memory pressure.
I slowly working towards getting rid of these high order allocations and replacing them with the equivalent number of single page allocations, but I haven't got that (complex) change working yet.
Quoted 4 lines
not questioning that higher order NOFS allocations are non-existent - that's why I came with the patch in the first place ;). My observation was that they are so rare that the visible effect of this patch might be quite low or even hard to notice.
Yup, it's a valid observation that would hold true for the majority of users.
Cheers,
Dave.
Signature · 2 lines
Dave Chinner [email protected]
Quoted 41 lines · Dave Chinner
Quoted 40 lines · Michal Hocko
Quoted 17 lines · Dave Chinner
Quoted 16 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.Quoted 5 lines
Quoted 2 lines
The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare,You say they are rare only because you don't know how to trigger them easily. :/
true
Quoted 13 lines
Try this:
# mkfs.xfs -f -n size=64k <dev> # mount <dev> /mnt/scratch # time ./fs_mark -D 10000 -S0 -n 100000 -s 0 -L 32 \ -d /mnt/scratch/0 -d /mnt/scratch/1 \ -d /mnt/scratch/2 -d /mnt/scratch/3 \ -d /mnt/scratch/4 -d /mnt/scratch/5 \ -d /mnt/scratch/6 -d /mnt/scratch/7 \ -d /mnt/scratch/8 -d /mnt/scratch/9 \ -d /mnt/scratch/10 -d /mnt/scratch/11 \ -d /mnt/scratch/12 -d /mnt/scratch/13 \ -d /mnt/scratch/14 -d /mnt/scratch/15
Quoted 7 lines
Quoted 1 line
Does this simulate a standard or usual fs workload/configuration? I am
Unfortunately, there was an era of cargo cult configuration tweaks in the Ceph community that has resulted in a large number of production machines with XFS filesystems configured this way. And a lot of them store large numbers of small files and run under significant sustained memory pressure.
I see
Quoted 3 lines
I slowly working towards getting rid of these high order allocations and replacing them with the equivalent number of single page allocations, but I haven't got that (complex) change working yet.
Definitely a good plan!
Anyway I was playing with this in my virtual machine (4CPUs, 512MB of RAM split into two NUMA nodes). Started on a freshly created fs after boot, no other load in the guest. The performance numbers should be taken with grain of salt, though, because the host has 4CPUs as well and it wasn't completely idle, but should be OK enough to give us at least some picture. This is what fs_mark told me:
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016
# Sync method: NO SYNC: Test does not issue sync() or fsync() calls.
# Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory.
# File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name)
# Files info: size 0 bytes, written with an IO size of 16384 bytes per write
# App overhead is time in microseconds spent in the test not doing file writing related system calls.
#
FSUse% Count Size Files/sec App Overhead
1 1600000 0 4300.1 20745838
3 3200000 0 4239.9 23849857
5 4800000 0 4243.4 25939543
6 6400000 0 4248.4 19514050
8 8000000 0 4262.1 20796169
9 9600000 0 4257.6 21288675
11 11200000 0 4259.7 19375120
13 12800000 0 4220.7 22734141
14 14400000 0 4238.5 31936458
16 16000000 0 4231.5 23409901
18 17600000 0 4045.3 23577700
19 19200000 0 2783.4 58299526
21 20800000 0 2678.2 40616302
23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
For me it was much more interesting to see this in the log:
[ 2304.372647] XFS: fs_mark(3289) possible memory allocation deadlock size 65624 in kmem_alloc (mode:0x2408240) [ 2304.443323] XFS: fs_mark(3285) possible memory allocation deadlock size 65728 in kmem_alloc (mode:0x2408240) [ 4796.772477] XFS: fs_mark(3424) possible memory allocation deadlock size 46936 in kmem_alloc (mode:0x2408240) [ 4796.775329] XFS: fs_mark(3423) possible memory allocation deadlock size 51416 in kmem_alloc (mode:0x2408240) [ 4797.388808] XFS: fs_mark(3424) possible memory allocation deadlock size 65728 in kmem_alloc (mode:0x2408240)
It means that the allocation failed and xfs was looping while retrying to move on.
I hooked into page allocation tracepoint and collected all GFP_NOFS
allocations
echo '!(gfp_flags & 0x80) && (gfp_flags &0x400000)' > $TRACE_MNT/events/kmem/mm_page_alloc/filter
and the order distribution looks as follows
5287609 order=0
37 order=1
1594905 order=2
3048439 order=3
6699207 order=4
66645 order=5
so there is indeed a _huge_ high order GFP_NOFS pressure. So I've tried with this patch applied (with the follow up fix pointed by Vlastimil). I am not very familiar with the benchmark so I am not going to interpret those numbers but they seem to be very similar for large part of the run
# Version 3.3, 16 thread(s) starting at Fri Oct 7 12:58:03 2016
# Sync method: NO SYNC: Test does not issue sync() or fsync() calls.
# Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory.
# File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name)
# Files info: size 0 bytes, written with an IO size of 16384 bytes per write
# App overhead is time in microseconds spent in the test not doing file writing related system calls.
#
FSUse% Count Size Files/sec App Overhead
1 1600000 0 4289.1 19243934
3 3200000 0 4241.6 32828865
5 4800000 0 4248.7 32884693
6 6400000 0 4314.4 19608921
8 8000000 0 4269.9 24953292
9 9600000 0 4270.7 33235572
11 11200000 0 4346.4 40817101
13 12800000 0 4285.3 29972397
14 14400000 0 4297.2 20539765
16 16000000 0 4219.6 18596767
18 17600000 0 4273.8 49611187
19 19200000 0 4300.4 27944451
21 20800000 0 4270.6 22324585
22 22400000 0 4317.6 22650382
24 24000000 0 4065.2 22297964while it doesn't seem to drop the Files/sec numbers starting with Count=19200000. I also see only a single
[ 3063.815003] XFS: fs_mark(3272) possible memory allocation deadlock size 65624 in kmem_alloc (mode:0x2408240)
which happens much later during the load. So I've checked the tracing output and compared the same time period of the test (5730s - note that I've stopped the later one slightly later and didn't let any of them finish). This is not precise but it should give us at least some idea about how many allocations we could during the same workload during the same time so it shouldn't be completely bogus.
Unpatched kernel
all orders
begin:44.718798 end:5774.618736 allocs:15019288
order > 0
begin:44.718798 end:5773.587195 allocs:10438610
Patched kernel
all orders
begin:64.612804 end:5794.193619 allocs:16110081 [107.2%] order > 0
begin:64.612804 end:5794.193619 allocs:11741492 [112.5%]
which would suggest that diving into the compaction rather than backing off and waiting for kcompactd to make the work for us was indeed a better strategy and helped the throughput. All that with a rather limited amount of anonymous memory because there doesn't seem to be any large source of those pages during this workload. Quite contrary AFAIU. I haven't checked latencies of those allocations because we currently do not have a convenient way to do that. I could measure compaction latencies but that wouldn't be a full picture and it seems that the above should tell us that not restricting the compaction is a good thing to do.
So unless I have grossly misinterpreted something here I can add this to the changelog to show the effect of the patch on a really heavy NOFS highorder workload.
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>
Quoted 87 lines · Michal Hocko
Quoted 41 lines · Dave Chinner
Quoted 40 lines · Michal Hocko
Quoted 17 lines · Dave Chinner
Quoted 16 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.Quoted 5 lines
Quoted 2 lines
The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare,You say they are rare only because you don't know how to trigger them easily. :/
true
Quoted 13 lines
Try this:
# mkfs.xfs -f -n size=64k <dev> # mount <dev> /mnt/scratch # time ./fs_mark -D 10000 -S0 -n 100000 -s 0 -L 32 \ -d /mnt/scratch/0 -d /mnt/scratch/1 \ -d /mnt/scratch/2 -d /mnt/scratch/3 \ -d /mnt/scratch/4 -d /mnt/scratch/5 \ -d /mnt/scratch/6 -d /mnt/scratch/7 \ -d /mnt/scratch/8 -d /mnt/scratch/9 \ -d /mnt/scratch/10 -d /mnt/scratch/11 \ -d /mnt/scratch/12 -d /mnt/scratch/13 \ -d /mnt/scratch/14 -d /mnt/scratch/15Quoted 7 lines
Quoted 1 line
Does this simulate a standard or usual fs workload/configuration? I am
Unfortunately, there was an era of cargo cult configuration tweaks in the Ceph community that has resulted in a large number of production machines with XFS filesystems configured this way. And a lot of them store large numbers of small files and run under significant sustained memory pressure.
I see
Quoted 3 lines
I slowly working towards getting rid of these high order allocations and replacing them with the equivalent number of single page allocations, but I haven't got that (complex) change working yet.
Definitely a good plan!
Anyway I was playing with this in my virtual machine (4CPUs, 512MB of RAM split into two NUMA nodes). Started on a freshly created fs after boot, no other load in the guest. The performance numbers should be taken with grain of salt, though, because the host has 4CPUs as well and it wasn't completely idle, but should be OK enough to give us at least some picture. This is what
fs_marktold me:
Unpatched kernel:# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996
Quoted 1 line
Ctrl+C because it just took too long.
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Quoted 4 lines
while it doesn't seem to drop the Files/sec numbers starting with Count=19200000. I also see only a single
[ 3063.815003] XFS: fs_mark(3272) possible memory allocation deadlock size 65624 in kmem_alloc (mode:0x2408240)
Remember that this is emitted only after /100/ consecutive allocation failures. So the fact it is still being emitted means that the situation is not drastically better....
Quoted 12 lines
Unpatched kernel
all orders
begin:44.718798 end:5774.618736 allocs:15019288
order > 0
begin:44.718798 end:5773.587195 allocs:10438610Patched kernel
all orders
begin:64.612804 end:5794.193619 allocs:16110081 [107.2%] order > 0
begin:64.612804 end:5794.193619 allocs:11741492 [112.5%]
Quoted 3 lines
which would suggest that diving into the compaction rather than backing off and waiting for kcompactd to make the work for us was indeed a better strategy and helped the throughput.
Well, without a success/failure ratio being calculated it's hard to tell what improvement it made. Did it increase the success rate, or reduce failure latency so retries happened faster?
Cheers,
Dave.
Signature · 8 lines
Dave Chinner [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>
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 23 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Quoted 1 line
Ctrl+C because it just took too long.
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
Quoted 8 lines
Quoted 4 lines
while it doesn't seem to drop the Files/sec numbers starting with Count=19200000. I also see only a single
[ 3063.815003] XFS: fs_mark(3272) possible memory allocation deadlock size 65624 in kmem_alloc (mode:0x2408240)Remember that this is emitted only after /100/ consecutive allocation failures. So the fact it is still being emitted means that the situation is not drastically better....
yes, but we also should consider that with this particular workload which doesn't have a lot of anonymous memory there is simply not all that much to migrate so we eventually have to wait for the reclaim to free up fs bound memory. This patch should put some relief but it is not a general remedy.
Quoted 12 lines
Quoted 12 lines
Unpatched kernel
all orders
begin:44.718798 end:5774.618736 allocs:15019288
order > 0
begin:44.718798 end:5773.587195 allocs:10438610Patched kernel
all orders
begin:64.612804 end:5794.193619 allocs:16110081 [107.2%] order > 0
begin:64.612804 end:5794.193619 allocs:11741492 [112.5%]
Quoted 7 lines
Quoted 3 lines
which would suggest that diving into the compaction rather than backing off and waiting for kcompactd to make the work for us was indeed a better strategy and helped the throughput.
Well, without a success/failure ratio being calculated it's hard to tell what improvement it made. Did it increase the success rate, or reduce failure latency so retries happened faster?
I have just noticed that the tracepoint also reports allocation failures (page==(null) and pfn==0) so I actually can calculate that. Note that only order > 3 fail with the current page allocator so I have filtered only those
Unpatched
begin:44.718798 end:5773.587195 allocs:6162244 fail:145
Patched
begin:64.612804 end:5794.193574 allocs:6869496 fail:104
So the success rate is slightly higher but this is negligible but we seem to manage perform ~10% more allocations so I assume this helped the throughput and in turn recycle memory better.
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>
Quoted 28 lines · Michal Hocko
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 24 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
Quoted 8 lines
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
increasing the memory to 1G didn't help. So I've tried to add -dagcount=24 -l size=512m and that didn't help much either. I am at 5k files/s so nowhere close to your 55k. I thought this is more about CPUs count than about the amount of memory. So I've tried a larger machine with 24 CPUs (no dagcount etc...), this one doesn't have a fast storage so I've backed the fs image by ramdisk but even then I am getting very similar results. No idea what is wrong with my kvm setup.
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>
Quoted 38 lines · Michal Hocko
Quoted 28 lines · Michal Hocko
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 24 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
Quoted 8 lines
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
Quoted 7 lines
increasing the memory to 1G didn't help. So I've tried to add -dagcount=24 -l size=512m and that didn't help much either. I am at 5k files/s so nowhere close to your 55k. I thought this is more about CPUs count than about the amount of memory. So I've tried a larger machine with 24 CPUs (no dagcount etc...), this one doesn't have a fast storage so I've backed the fs image by ramdisk but even then I am getting very similar results. No idea what is wrong with my kvm setup.
What's the backing storage? I use an image file in an XFS filesystem, configured with virtio,cache=none so it's concurrency model matches that of a real disk...
Cheers,
Dave.
Signature · 8 lines
Dave Chinner [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>
Quoted 47 lines · Dave Chinner
Quoted 38 lines · Michal Hocko
Quoted 28 lines · Michal Hocko
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 24 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
Quoted 8 lines
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
Quoted 7 lines
increasing the memory to 1G didn't help. So I've tried to add -dagcount=24 -l size=512m and that didn't help much either. I am at 5k files/s so nowhere close to your 55k. I thought this is more about CPUs count than about the amount of memory. So I've tried a larger machine with 24 CPUs (no dagcount etc...), this one doesn't have a fast storage so I've backed the fs image by ramdisk but even then I am getting very similar results. No idea what is wrong with my kvm setup.
Quoted 3 lines
What's the backing storage? I use an image file in an XFS filesystem, configured with virtio,cache=none so it's concurrency model matches that of a real disk...
I am using qcow qemu image exported to qemu by
-drive file=storage.img,if=ide,index=1,cache=none
parameter.
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>
Quoted 48 lines · Michal Hocko
Quoted 47 lines · Dave Chinner
Quoted 45 lines · Michal Hocko
Quoted 28 lines · Michal Hocko
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 24 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
Quoted 8 lines
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
increasing the memory to 1G didn't help. So I've tried to add -dagcount=24 -l size=512m and that didn't help much either. I am at 5k files/s so nowhere close to your 55k. I thought this is more about CPUs count than about the amount of memory. So I've tried a larger machine with 24 CPUs (no dagcount etc...), this one doesn't have a fast storage so I've backed the fs image by ramdisk but even then I am getting very similar results. No idea what is wrong with my kvm setup.
Quoted 7 lines
Quoted 3 lines
What's the backing storage? I use an image file in an XFS filesystem, configured with virtio,cache=none so it's concurrency model matches that of a real disk...
I am using qcow qemu image exported to qemu by
-drive file=storage.img,if=ide,index=1,cache=none
parameter.
storage.img is on what type of filesystem? Only XFs will give you proper IO concurrency with direct IO, and you really need to use a raw image file rather than qcow2. If you're not using the special capabilities of qcow2 (e.g. snapshots), there's no reason to use it...
Cheers,
Dave.
Signature · 8 lines
Dave Chinner [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>
Quoted 53 lines · Dave Chinner
Quoted 52 lines · Michal Hocko
Quoted 50 lines · Dave Chinner
Quoted 38 lines · Michal Hocko
Quoted 28 lines · Michal Hocko
Quoted 1 line · Dave Chinner
On Fri, Oct 07, 2016 at 03:18:14PM +0200, Michal Hocko wrote:
[...]
Quoted 25 lines
Quoted 24 lines
Unpatched kernel:
# Version 3.3, 16 thread(s) starting at Fri Oct 7 09:55:05 2016 # Sync method: NO SYNC: Test does not issue sync() or fsync() calls. # Directories: Time based hash between directories across 10000 subdirectories with 180 seconds per subdirectory. # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 0 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # FSUse% Count Size Files/sec App Overhead 1 1600000 0 4300.1 20745838 3 3200000 0 4239.9 23849857 5 4800000 0 4243.4 25939543 6 6400000 0 4248.4 19514050 8 8000000 0 4262.1 20796169 9 9600000 0 4257.6 21288675 11 11200000 0 4259.7 19375120 13 12800000 0 4220.7 22734141 14 14400000 0 4238.5 31936458 16 16000000 0 4231.5 23409901 18 17600000 0 4045.3 23577700 19 19200000 0 2783.4 58299526 21 20800000 0 2678.2 40616302 23 22400000 0 2693.5 83973996Ctrl+C because it just took too long.
Quoted 8 lines
Quoted 6 lines
Try running it on a larger filesystem, or configure the fs with more AGs and a larger log (i.e. mkfs.xfs -f -dagcount=24 -l size=512m <dev>). That will speed up modifications and increase concurrency. This test should be able to run 5-10x faster than this (it sustains 55,000 files/s @ 300MB/s write on my test fs on a cheap SSD).
Will add more memory to the machine. Will report back on that.
Quoted 7 lines
increasing the memory to 1G didn't help. So I've tried to add -dagcount=24 -l size=512m and that didn't help much either. I am at 5k files/s so nowhere close to your 55k. I thought this is more about CPUs count than about the amount of memory. So I've tried a larger machine with 24 CPUs (no dagcount etc...), this one doesn't have a fast storage so I've backed the fs image by ramdisk but even then I am getting very similar results. No idea what is wrong with my kvm setup.
What's the backing storage? I use an image file in an XFS filesystem, configured with virtio,cache=none so it's concurrency model matches that of a real disk...
Quoted 5 lines
Quoted 3 lines
I am using qcow qemu image exported to qemu by
-drive file=storage.img,if=ide,index=1,cache=none
parameter.storage.img is on what type of filesystem?
ext3 on the host system
Quoted 5 lines
Only XFs will give you
proper IO concurrency with direct IO, and you really need to use a raw image file rather than qcow2. If you're not using the special capabilities of qcow2 (e.g. snapshots), there's no reason to use it...
OK, I will try with the raw image as soon as I have some more time (hopefully this week).
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>
Quoted 44 lines · Michal Hocko
From: Michal Hocko <[email protected]>
compaction has been disabled for
GFP_NOFSandGFP_NOIOrequests since the direct compaction was introduced by56de7263fcf3("mm: compaction:
direct compact when a high-order allocation fails"). The main reason is that the migration of page cache pages might recurse back to fs/io layer and we could potentially deadlock. This is overly conservative because all the anonymous memory is migrateable in theGFP_NOFScontext just fine. This might be a large portion of the memory in many/most workkloads.Remove the
GFP_NOFSrestriction and make sure that we skip all fs pages (those with a mapping) while isolating pages to be migrated. We cannot consider clean fs pages because they might need a metadata update so only isolate pages without any mapping for nofs requests.The effect of this patch will be probably very limited in many/most workloads because higher order
GFP_NOFSrequests are quite rare, although different configurations might lead to very different results asGFP_NOFSusage is rather unleashed (e.g. I had hard time to trigger any with my setup). But still there shouldn't be any strong reason to completely back off and do nothing in that context. In the worst case we just skip parts of the block with fs pages. This might be still sufficient to make a progress for small orders.Signed-off-by Michal Hocko <[email protected]>---
Hi,
I am sending this as an RFC because I am not completely sure this a) is really worth it and b) it is 100% correct. I couldn't find any problems when staring into the code but as mentioned in the changelog I wasn't really able to trigger high orderGFP_NOFSrequests in my setup.Thoughts?
mm/compaction.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)mm/compaction.c +0
-0
mm/compaction.c isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, · line 842
Quoted 9 lines
mm/compaction.c +6
-0@@ -834,6 +834,13 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, page_count(page) > page_mapcount(page)) goto isolate_fail; +/* +* Only allow to migrate anonymous pages in GFP_NOFS context +* because those do not depend on fs locks. +*/ +if (!(cc->gfp_mask & __GFP_FS) &&page_mapping (page)) + goto isolate_fail;
Unless page can acquire a page_mapping between this check and migration, I don't see a problem with allowing this.
But make sure you don't break kcompactd and manual compaction from /proc, as they don't currently set cc->gfp_mask. Looks like until now it was only used to determine direct compactor's migratetype which is irrelevant in those contexts.
Quoted 15 lines
mm/compaction.c +1
-1+/* If we already hold the lock, we can skip some rechecking */ if (!locked) { locked = compact_trylock_irqsave(zone_lru_lock(zone),@@ -1696,14 +1703,16 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, enum compact_priority prio) { - int may_enter_fs = gfp_mask & __GFP_FS; int may_perform_io = gfp_mask & __GFP_IO;struct zoneref *z;struct zone *zone;enum compact_result rc =COMPACT_SKIPPED ;
mm/compaction.c enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, · line 1718
Quoted 10 lines
mm/compaction.c +5
-2-/* Check if the GFP flags allow compaction */ -if (!may_enter_fs || !may_perform_io) +/* +* Check if the GFP flags allow compaction - GFP_NOIO is really +* tricky context because the migration might require IO and +*/ +if (!may_perform_io)return COMPACT_SKIPPED ;trace_mm_compaction_try_to_compact_pages (order, gfp_mask, prio);
--
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>
On Fri 07-10-16 07:27:37, Vlastimil Babka wrote:
[...]
Quoted 8 lines
Quoted 8 lines
mm/compaction.c +0
-0@@ -834,6 +834,13 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, page_count(page) > page_mapcount(page)) goto isolate_fail;
Quoted 9 lines
mm/compaction.c isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, · line 842
Quoted 6 lines
mm/compaction.c +6
-0+/* +* Only allow to migrate anonymous pages in GFP_NOFS context +* because those do not depend on fs locks. +*/ +if (!(cc->gfp_mask & __GFP_FS) &&page_mapping (page)) + goto isolate_fail;Unless page can acquire a
page_mappingbetween this check and migration, I don't see a problem with allowing this.
It can be become swapcache but I guess this should be OK. We do not allow to get here with GFP_NOIO and migrating swapcache pages in NOFS mode should be OK AFAICS.
Quoted 4 lines
But make sure you don't break kcompactd and manual compaction from /proc, as they don't currently set
cc->gfp_mask. Looks like until now it was only used to determine direct compactor's migratetype which is irrelevant in those contexts.
OK, I see. This is really subtle. One way to go would be to provide a fake gfp_mask for them. How does the following look to you?
---
mm/compaction.c +2 -0
@@ -1779,6 +1779,7 @@ static void compact_node(int nid) .mode = MIGRATE_SYNC, .ignore_skip_hint = true, .whole_zone = true, + .gfp_mask = GFP_KERNEL, };
@@ -1904,6 +1905,7 @@ static void kcompactd_do_work(pg_data_t *pgdat) .classzone_idx = pgdat->kcompactd_classzone_idx, .mode = MIGRATE_SYNC_LIGHT, .ignore_skip_hint = true, + .gfp_mask = GFP_KERNEL, }; trace_mm_compaction_kcompactd_wake(pgdat->node_id, cc.order,
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>
Quoted 24 lines · Michal Hocko
On Fri 07-10-16 07:27:37, Vlastimil Babka wrote:
[...]Quoted 8 lines
Quoted 8 lines
mm/compaction.c +0
-0@@ -834,6 +834,13 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, page_count(page) > page_mapcount(page)) goto isolate_fail;Quoted 9 lines
mm/compaction.c isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, · line 842
Quoted 6 lines
mm/compaction.c +6
-0+/* +* Only allow to migrate anonymous pages in GFP_NOFS context +* because those do not depend on fs locks. +*/ +if (!(cc->gfp_mask & __GFP_FS) &&page_mapping (page)) + goto isolate_fail;Unless page can acquire a
page_mappingbetween this check and migration, I don't see a problem with allowing this.It can be become swapcache but I guess this should be OK. We do not allow to get here with
GFP_NOIOand migrating swapcache pages in NOFS mode should be OK AFAICS.
Quoted 7 lines
Quoted 4 lines
But make sure you don't break kcompactd and manual compaction from /proc, as they don't currently set
cc->gfp_mask. Looks like until now it was only used to determine direct compactor's migratetype which is irrelevant in those contexts.OK, I see. This is really subtle. One way to go would be to provide a fake
gfp_maskfor them. How does the following look to you?
Looks OK. I'll have to think about the kcompactd case, as gfp mask implying unmovable migratetype might restrict it without good reason. But that would be separate patch anyway, yours doesn't change that (empty gfp_mask also means unmovable migratetype) and that's good.
Quoted 15 lines
---
mm/compaction.c +1
-0@@ -1779,6 +1779,7 @@ static void compact_node(int nid) .mode = MIGRATE_SYNC, .ignore_skip_hint = true, .whole_zone = true, + .gfp_mask = GFP_KERNEL, };
mm/compaction.c static void kcompactd_do_work(pg_data_t *pgdat) · line 1911
Quoted 7 lines
mm/compaction.c +1
-0@@ -1904,6 +1905,7 @@ static void kcompactd_do_work(pg_data_t *pgdat) .classzone_idx = pgdat->kcompactd_classzone_idx, .mode = MIGRATE_SYNC_LIGHT, .ignore_skip_hint = true, + .gfp_mask = GFP_KERNEL, }; trace_mm_compaction_kcompactd_wake(pgdat->node_id, cc.order,
--
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>
Quoted 2 lines · Vlastimil Babka
Quoted 1 line · Michal Hocko
On Fri 07-10-16 07:27:37, Vlastimil Babka wrote:
[...]
Quoted 5 lines
Quoted 5 lines
Quoted 4 lines
But make sure you don't break kcompactd and manual compaction from /proc, as they don't currently set
cc->gfp_mask. Looks like until now it was only used to determine direct compactor's migratetype which is irrelevant in those contexts.
Quoted 7 lines
Quoted 2 lines
OK, I see. This is really subtle. One way to go would be to provide a fake
gfp_maskfor them. How does the following look to you?Looks OK. I'll have to think about the kcompactd case, as gfp mask implying unmovable migratetype might restrict it without good reason. But that would be separate patch anyway, yours doesn't change that (empty
gfp_maskalso means unmovable migratetype) and that's good.
OK, I see. A follow up patch would be really trivial AFAICS. Just add __GFP_MOVABLE to the mask. But I am not familiar with all these details enough to propose a patch with full description.
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>
Quoted 12 lines · Michal Hocko
Quoted 2 lines · Vlastimil Babka
Quoted 1 line · Michal Hocko
On Fri 07-10-16 07:27:37, Vlastimil Babka wrote:
[...]
Quoted 8 lines
Quoted 7 lines
Quoted 4 lines
But make sure you don't break kcompactd and manual compaction from /proc, as they don't currently set
cc->gfp_mask. Looks like until now it was only used to determine direct compactor's migratetype which is irrelevant in those contexts.OK, I see. This is really subtle. One way to go would be to provide a fake
gfp_maskfor them. How does the following look to you?
Quoted 8 lines
Quoted 4 lines
Looks OK. I'll have to think about the kcompactd case, as gfp mask implying unmovable migratetype might restrict it without good reason. But that would be separate patch anyway, yours doesn't change that (empty
gfp_maskalso means unmovable migratetype) and that's good.OK, I see. A follow up patch would be really trivial AFAICS. Just add
__GFP_MOVABLEto the mask. But I am not familiar with all these details enough to propose a patch with full description.
Hm, actually the migratetype only matters for async compaction, and kcompactd uses sync_light, so __GFP_MOVABLE will have no effect right now.
--
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>