Skip to contentSkip to conversation

compaction: check lock contention first before taking lock

PATCH In review Shaohua Li 2 participants 3 messages Sep 6, 2012

Subsystems (2)
lore
Share & tools
lore

Shaohua Li

author
#0 lore raw

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
Index: linux/mm/compaction.c
===================================================================
@@ -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>

#1 lore raw
Quoted 16 lines · Shaohua Li

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(-)

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 -0
 	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)
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>
author
#2 lore raw
Quoted 19 lines · Mel Gorman
Quoted 18 lines · Shaohua Li

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(-)

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 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.

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>