* [patch 2/2 v2]compaction: check lock contention first before taking lock @ 2012-09-10 1:18 Shaohua Li 2012-09-10 8:12 ` Mel Gorman ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Shaohua Li @ 2012-09-10 1:18 UTC (permalink / raw) To: linux-mm; +Cc: akpm, mgorman, aarcange 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. V2: leave cond_resched() pointed out by Mel. Signed-off-by: Shaohua Li <shli@fusionio.com> --- mm/compaction.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) Index: linux/mm/compaction.c =================================================================== --- linux.orig/mm/compaction.c 2012-09-10 08:49:40.377869710 +0800 +++ linux/mm/compaction.c 2012-09-10 08:53:10.295230575 +0800 @@ -295,8 +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) + return 0; for (; low_pfn < end_pfn; low_pfn++) { struct page *page; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-10 1:18 [patch 2/2 v2]compaction: check lock contention first before taking lock Shaohua Li @ 2012-09-10 8:12 ` Mel Gorman 2012-09-11 1:58 ` Minchan Kim 2012-09-11 23:43 ` Andrew Morton 2 siblings, 0 replies; 7+ messages in thread From: Mel Gorman @ 2012-09-10 8:12 UTC (permalink / raw) To: Shaohua Li; +Cc: linux-mm, akpm, aarcange On Mon, Sep 10, 2012 at 09:18:50AM +0800, Shaohua Li wrote: > 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. > > V2: > leave cond_resched() pointed out by Mel. > > Signed-off-by: Shaohua Li <shli@fusionio.com> Acked-by: Mel Gorman <mgorman@suse.de> -- Mel Gorman SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-10 1:18 [patch 2/2 v2]compaction: check lock contention first before taking lock Shaohua Li 2012-09-10 8:12 ` Mel Gorman @ 2012-09-11 1:58 ` Minchan Kim 2012-09-11 23:43 ` Andrew Morton 2 siblings, 0 replies; 7+ messages in thread From: Minchan Kim @ 2012-09-11 1:58 UTC (permalink / raw) To: Shaohua Li; +Cc: linux-mm, akpm, mgorman, aarcange On Mon, Sep 10, 2012 at 09:18:50AM +0800, Shaohua Li wrote: > 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. > > V2: > leave cond_resched() pointed out by Mel. > > Signed-off-by: Shaohua Li <shli@fusionio.com> Acked-by: Minchan Kim <minchan@kernel.org> -- Kind regards, Minchan Kim -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-10 1:18 [patch 2/2 v2]compaction: check lock contention first before taking lock Shaohua Li 2012-09-10 8:12 ` Mel Gorman 2012-09-11 1:58 ` Minchan Kim @ 2012-09-11 23:43 ` Andrew Morton 2012-09-12 10:55 ` Mel Gorman 2 siblings, 1 reply; 7+ messages in thread From: Andrew Morton @ 2012-09-11 23:43 UTC (permalink / raw) To: Shaohua Li; +Cc: linux-mm, mgorman, aarcange On Mon, 10 Sep 2012 09:18:50 +0800 Shaohua Li <shli@kernel.org> wrote: > 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. > > V2: > leave cond_resched() pointed out by Mel. > > Signed-off-by: Shaohua Li <shli@fusionio.com> > --- > mm/compaction.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > Index: linux/mm/compaction.c > =================================================================== > --- linux.orig/mm/compaction.c 2012-09-10 08:49:40.377869710 +0800 > +++ linux/mm/compaction.c 2012-09-10 08:53:10.295230575 +0800 > @@ -295,8 +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) > + return 0; > for (; low_pfn < end_pfn; low_pfn++) { > struct page *page; Geeze that compact_checklock_irqsave stuff is naaaasty. What happens if a process has need_resched set? It cannot perform compaction? There is no relationship between the concepts "user pressed ^C" and "this device driver or subsystem wants a high-order allocation". -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-11 23:43 ` Andrew Morton @ 2012-09-12 10:55 ` Mel Gorman 2012-09-12 21:59 ` Andrew Morton 0 siblings, 1 reply; 7+ messages in thread From: Mel Gorman @ 2012-09-12 10:55 UTC (permalink / raw) To: Andrew Morton; +Cc: Shaohua Li, linux-mm, aarcange On Tue, Sep 11, 2012 at 04:43:30PM -0700, Andrew Morton wrote: > On Mon, 10 Sep 2012 09:18:50 +0800 > Shaohua Li <shli@kernel.org> wrote: > > > 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. > > > > V2: > > leave cond_resched() pointed out by Mel. > > > > Signed-off-by: Shaohua Li <shli@fusionio.com> > > --- > > mm/compaction.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > Index: linux/mm/compaction.c > > =================================================================== > > --- linux.orig/mm/compaction.c 2012-09-10 08:49:40.377869710 +0800 > > +++ linux/mm/compaction.c 2012-09-10 08:53:10.295230575 +0800 > > @@ -295,8 +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) > > + return 0; > > for (; low_pfn < end_pfn; low_pfn++) { > > struct page *page; > > Geeze that compact_checklock_irqsave stuff is naaaasty. > The intention is to avoid THP allocations getting stuck in compaction.c for ages due to spinlock contention. It's always better for those to fail quickly. If compact_trylock_irqsave is improved it must still be able to do this. > What happens if a process has need_resched set? On async compaction, it will abort compaction and it's up to the caller to retry with sync compaction if necessary. Whether compaction is called again comes down to this check in the page allocator. /* * If compaction is deferred for high-order allocations, it is because * sync compaction recently failed. In this is the case and the caller * requested a movable allocation that does not heavily disrupt the * system then fail the allocation instead of entering direct * reclaim. */ if ((deferred_compaction || contended_compaction) && (gfp_mask & (__GFP_MOVABLE|__GFP_REPEAT)) == __GFP_MOVABLE) goto nopage; On sync compaction, it will call cond_resched() and continue compacting > It cannot perform > compaction? It can still use sync compaction. > There is no relationship between the concepts "user > pressed ^C" and "this device driver or subsystem wants a high-order > allocation". > hmm, I see your point. The fatal signal check is "hidden" but this was to preseve the existing behaviour prior to commit [c67fe375: mm: compaction: Abort async compaction if locks are contended or taking too long]. The fatal_signal_check could be deleted from compact_trylock_irqsave() but then it should be checked in the isolate_migratepages_range() at the very least. How about this? ---8<--- mm: compaction: Move fatal signal check out of compact_checklock_irqsave Commit [c67fe3752: mm: compaction: Abort async compaction if locks are contended or taking too long] addressed a lock contention problem in compaction by introducing compact_checklock_irqsave() that effecively aborting async compaction in the event of compaction. To preserve existing behaviour it also moved a fatal_signal_pending() check into compact_checklock_irqsave() but that is very misleading. It "hides" the check within a locking function but has nothing to do with locking as such. It just happens to work in a desirable fashion. This patch moves the fatal_signal_pending() check to isolate_migratepages_range() where it belongs. Arguably the same check should also happen when isolating pages for freeing but it's overkill. Signed-off-by: Mel Gorman <mgorman@suse.de> --- mm/compaction.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mm/compaction.c b/mm/compaction.c index 0fbc6b7..364e12f 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -76,8 +76,6 @@ static bool compact_checklock_irqsave(spinlock_t *lock, unsigned long *flags, } cond_resched(); - if (fatal_signal_pending(current)) - return false; } if (!locked) @@ -364,7 +362,7 @@ isolate_migratepages_range(struct zone *zone, struct compact_control *cc, /* Check if it is ok to still hold the lock */ locked = compact_checklock_irqsave(&zone->lru_lock, &flags, locked, cc); - if (!locked) + if (!locked || fatal_signal_pending(current)) break; /* -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-12 10:55 ` Mel Gorman @ 2012-09-12 21:59 ` Andrew Morton 2012-09-13 8:19 ` Mel Gorman 0 siblings, 1 reply; 7+ messages in thread From: Andrew Morton @ 2012-09-12 21:59 UTC (permalink / raw) To: Mel Gorman; +Cc: Shaohua Li, linux-mm, aarcange On Wed, 12 Sep 2012 11:55:35 +0100 Mel Gorman <mgorman@suse.de> wrote: > On Tue, Sep 11, 2012 at 04:43:30PM -0700, Andrew Morton wrote: > > On Mon, 10 Sep 2012 09:18:50 +0800 > > Shaohua Li <shli@kernel.org> wrote: > > > > > 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. > > > > > > V2: > > > leave cond_resched() pointed out by Mel. > > > > > > Signed-off-by: Shaohua Li <shli@fusionio.com> > > > --- > > > mm/compaction.c | 5 +++-- > > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > > > Index: linux/mm/compaction.c > > > =================================================================== > > > --- linux.orig/mm/compaction.c 2012-09-10 08:49:40.377869710 +0800 > > > +++ linux/mm/compaction.c 2012-09-10 08:53:10.295230575 +0800 > > > @@ -295,8 +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) > > > + return 0; > > > for (; low_pfn < end_pfn; low_pfn++) { > > > struct page *page; > > > > Geeze that compact_checklock_irqsave stuff is naaaasty. > > > > The intention is to avoid THP allocations getting stuck in compaction.c > for ages due to spinlock contention. It's always better for those to > fail quickly. If compact_trylock_irqsave is improved it must still be > able to do this. So there's an implicit two-level prioritization here. But between what and what? It all sounds a bit hack/bandaidy? > > > There is no relationship between the concepts "user > > pressed ^C" and "this device driver or subsystem wants a high-order > > allocation". > > > > hmm, I see your point. The fatal signal check is "hidden" but this was to > preseve the existing behaviour prior to commit [c67fe375: mm: compaction: > Abort async compaction if locks are contended or taking too long]. The > fatal_signal_check could be deleted from compact_trylock_irqsave() but > then it should be checked in the isolate_migratepages_range() at the > very least. How about this? hm, well, actually, I chose ^C as an example of something which might set need_resched(). How about `There is no relationship between the concepts "this process exceeded its timeslice" and "this device driver or subsystem wants a high-order allocation"'. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2/2 v2]compaction: check lock contention first before taking lock 2012-09-12 21:59 ` Andrew Morton @ 2012-09-13 8:19 ` Mel Gorman 0 siblings, 0 replies; 7+ messages in thread From: Mel Gorman @ 2012-09-13 8:19 UTC (permalink / raw) To: Andrew Morton; +Cc: Shaohua Li, linux-mm, aarcange On Wed, Sep 12, 2012 at 02:59:02PM -0700, Andrew Morton wrote: > On Wed, 12 Sep 2012 11:55:35 +0100 > Mel Gorman <mgorman@suse.de> wrote: > > > On Tue, Sep 11, 2012 at 04:43:30PM -0700, Andrew Morton wrote: > > > On Mon, 10 Sep 2012 09:18:50 +0800 > > > Shaohua Li <shli@kernel.org> wrote: > > > > > > > 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. > > > > > > > > V2: > > > > leave cond_resched() pointed out by Mel. > > > > > > > > Signed-off-by: Shaohua Li <shli@fusionio.com> > > > > --- > > > > mm/compaction.c | 5 +++-- > > > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > > > > > Index: linux/mm/compaction.c > > > > =================================================================== > > > > --- linux.orig/mm/compaction.c 2012-09-10 08:49:40.377869710 +0800 > > > > +++ linux/mm/compaction.c 2012-09-10 08:53:10.295230575 +0800 > > > > @@ -295,8 +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) > > > > + return 0; > > > > for (; low_pfn < end_pfn; low_pfn++) { > > > > struct page *page; > > > > > > Geeze that compact_checklock_irqsave stuff is naaaasty. > > > > > > > The intention is to avoid THP allocations getting stuck in compaction.c > > for ages due to spinlock contention. It's always better for those to > > fail quickly. If compact_trylock_irqsave is improved it must still be > > able to do this. > > So there's an implicit two-level prioritization here. But between what > and what? > Between two processes trying high-order allocations at the same time. In practice it is expected to be two processes trying to allocate a THP. > It all sounds a bit hack/bandaidy? > It is but excessive time spent in compaction.c offsets any advantage of using THP. The ideal would be that the zone lock or lru_lock could be fine-grained but I have not designed something suitable. Splitting lru_lock would be particularly problematic. > > > There is no relationship between the concepts "user > > > pressed ^C" and "this device driver or subsystem wants a high-order > > > allocation". > > > > > > > hmm, I see your point. The fatal signal check is "hidden" but this was to > > preseve the existing behaviour prior to commit [c67fe375: mm: compaction: > > Abort async compaction if locks are contended or taking too long]. The > > fatal_signal_check could be deleted from compact_trylock_irqsave() but > > then it should be checked in the isolate_migratepages_range() at the > > very least. How about this? > > hm, well, actually, I chose ^C as an example of something which might > set need_resched(). How about `There is no relationship between the > concepts "this process exceeded its timeslice" and "this device driver > or subsystem wants a high-order allocation"'. > A device driver or subsystem that wants a high-order allocation will not (or at least are very unlikely) to have specified __GFP_MOVABLE. These will retry with sync compaction and wait for the lock to be acquired. -- Mel Gorman SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-09-13 8:19 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-09-10 1:18 [patch 2/2 v2]compaction: check lock contention first before taking lock Shaohua Li 2012-09-10 8:12 ` Mel Gorman 2012-09-11 1:58 ` Minchan Kim 2012-09-11 23:43 ` Andrew Morton 2012-09-12 10:55 ` Mel Gorman 2012-09-12 21:59 ` Andrew Morton 2012-09-13 8:19 ` Mel Gorman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).