compaction: check lock contention first before taking lock
Subsystems (2)
PATCH 2/2 compaction: check lock contention first before taking lock
isolate_migratepages_range will take zone->lru_lock first and check if the lock is contented, if yes, it will release the lock. This isn't efficient. If the lock is truly contented, a lock/unlock pair will increase the lock contention. We'd better check if the lock is contended first. compact_trylock_irqsave perfectly meets the requirement.
--- mm/compaction.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
mm/compaction.c +4 -3
@@ -295,9 +295,9 @@ isolate_migratepages_range(struct zone * }/* Time to isolate some pages for migration */ -cond_resched (); -spin_lock_irqsave (&zone->lru_lock, flags); - locked = true; + locked =compact_trylock_irqsave (&zone->lru_lock, &flags, cc); +if (!locked) + goto skip;for (; low_pfn < end_pfn; low_pfn++) {struct page *page;
@@ -400,6 +400,7 @@ isolate_migratepages_range(struct zone *if (locked)spin_unlock_irqrestore (&zone->lru_lock, flags); +skip:trace_mm_compaction_isolate_migratepages (nr_scanned, nr_isolated);if (!nr_isolated)
--
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 16 lines · Shaohua Li
isolate_migratepages_rangewill takezone->lru_lockfirst and check if the lock is contented, if yes, it will release the lock. This isn't efficient. If the lock is truly contented, a lock/unlock pair will increase the lock contention. We'd better check if the lock is contended first.compact_trylock_irqsaveperfectly meets the requirement.Signed-off-by Shaohua Li <[email protected]>--- mm/compaction.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)Index:
linux/mm/compaction.c
===================================================================
mm/compaction.c isolate_migratepages_range(struct zone * · line 298
Quoted 4 lines
mm/compaction.c +0
-1@@ -295,9 +295,9 @@ isolate_migratepages_range(struct zone * }/* Time to isolate some pages for migration */ -cond_resched ();
Why did you remove the cond_resched()? I expect it's because compact_checklock_irqsave() does a need_resched() check and if it is true will either call cond_resched() or abort compaction. If it is aborting it will not call cond_resched() but there is a reasonable expectation that the caller will schedule soon. If this is the reasoning then it should be included in the changelog. If it's an accident then leave the cond_resched() where it is.
mm/compaction.c isolate_migratepages_range(struct zone * · line 300
Quoted 5 lines
mm/compaction.c +3
-2-spin_lock_irqsave (&zone->lru_lock, flags); - locked = true; + locked =compact_trylock_irqsave (&zone->lru_lock, &flags, cc); +if (!locked) + goto skip;
There is no need for the goto. No useful work has taken place at this point and there is no need to even trigger the tracepoint. Just return 0.
Quoted 11 lines
mm/compaction.c +1
-0for (; low_pfn < end_pfn; low_pfn++) {struct page *page;@@ -400,6 +400,7 @@ isolate_migratepages_range(struct zone *if (locked)spin_unlock_irqrestore (&zone->lru_lock, flags); +skip:trace_mm_compaction_isolate_migratepages (nr_scanned, nr_isolated);if (!nr_isolated)
Signature · 8 lines
Mel Gorman 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 19 lines · Mel Gorman
Quoted 18 lines · Shaohua Li
isolate_migratepages_rangewill takezone->lru_lockfirst and check if the lock is contented, if yes, it will release the lock. This isn't efficient. If the lock is truly contented, a lock/unlock pair will increase the lock contention. We'd better check if the lock is contended first.compact_trylock_irqsaveperfectly meets the requirement.Signed-off-by Shaohua Li <[email protected]>--- mm/compaction.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)Index:
linux/mm/compaction.c
===================================================================mm/compaction.c +0
-0@@ -295,9 +295,9 @@ isolate_migratepages_range(struct zone * }
Quoted 10 lines
mm/compaction.c isolate_migratepages_range(struct zone * · line 298
Quoted 2 lines
mm/compaction.c +0
-1/* Time to isolate some pages for migration */ -cond_resched ();Why did you remove the
cond_resched()? I expect it's becausecompact_checklock_irqsave()does aneed_resched()check and if it is true will either callcond_resched()or abort compaction. If it is aborting it will not callcond_resched()but there is a reasonable expectation that the caller will schedule soon. If this is the reasoning then it should be included in the changelog. If it's an accident then leave thecond_resched()where it is.
Ok, looks I overlooked at it, will change it in next post.
Quoted 9 lines
mm/compaction.c isolate_migratepages_range(struct zone * · line 300
Quoted 5 lines
mm/compaction.c +3
-2-spin_lock_irqsave (&zone->lru_lock, flags); - locked = true; + locked =compact_trylock_irqsave (&zone->lru_lock, &flags, cc); +if (!locked) + goto skip;There is no need for the goto. No useful work has taken place at this point and there is no need to even trigger the tracepoint. Just return 0.
Just want to print out something in trace, but that's fine, I'll fix this.
--
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>