-
-
Notifications
You must be signed in to change notification settings - Fork 170
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
6.11: base: Get rid of "ZEN: mm: Don't hog the CPU and zone lock in r…
…mqueue_bulk()" patch
- Loading branch information
Showing
1 changed file
with
0 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -648,83 +648,6 @@ index 5f1ae07d724b88..97cda629c9e909 100644 | |
#endif /* CONFIG_HUGETLB_PAGE */ | ||
|
||
|
||
From f22bc56be85e69c71c8e36041193856bb8b01525 Mon Sep 17 00:00:00 2001 | ||
From: Sultan Alsawaf <[email protected]> | ||
Date: Wed, 20 Oct 2021 20:50:32 -0700 | ||
Subject: [PATCH] ZEN: mm: Don't hog the CPU and zone lock in rmqueue_bulk() | ||
|
||
There is noticeable scheduling latency and heavy zone lock contention | ||
stemming from rmqueue_bulk's single hold of the zone lock while doing | ||
its work, as seen with the preemptoff tracer. There's no actual need for | ||
rmqueue_bulk() to hold the zone lock the entire time; it only does so | ||
for supposed efficiency. As such, we can relax the zone lock and even | ||
reschedule when IRQs are enabled in order to keep the scheduling delays | ||
and zone lock contention at bay. Forward progress is still guaranteed, | ||
as the zone lock can only be relaxed after page removal. | ||
|
||
With this change, rmqueue_bulk() no longer appears as a serious offender | ||
in the preemptoff tracer, and system latency is noticeably improved. | ||
|
||
Signed-off-by: Sultan Alsawaf <[email protected]> | ||
--- | ||
mm/page_alloc.c | 23 ++++++++++++++++++----- | ||
1 file changed, 18 insertions(+), 5 deletions(-) | ||
|
||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
index a0b0397e29ee4c..87a983a356530c 100644 | ||
--- a/mm/page_alloc.c | ||
+++ b/mm/page_alloc.c | ||
@@ -3118,15 +3119,16 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype, | ||
} | ||
|
||
/* | ||
- * Obtain a specified number of elements from the buddy allocator, all under | ||
- * a single hold of the lock, for efficiency. Add them to the supplied list. | ||
- * Returns the number of new pages which were placed at *list. | ||
+ * Obtain a specified number of elements from the buddy allocator, and relax the | ||
+ * zone lock when needed. Add them to the supplied list. Returns the number of | ||
+ * new pages which were placed at *list. | ||
*/ | ||
static int rmqueue_bulk(struct zone *zone, unsigned int order, | ||
unsigned long count, struct list_head *list, | ||
int migratetype, unsigned int alloc_flags) | ||
{ | ||
unsigned long flags; | ||
- int i; | ||
+ const bool can_resched = !preempt_count() && !irqs_disabled(); | ||
+ int i, allocated = 0, last_mod = 0; | ||
|
||
/* Caller must hold IRQ-safe pcp->lock so IRQs are disabled. */ | ||
spin_lock(&zone->lock); | ||
@@ -3137,6 +3138,18 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, | ||
if (unlikely(page == NULL)) | ||
break; | ||
|
||
+ /* Reschedule and ease the contention on the lock if needed */ | ||
+ if (i + 1 < count && ((can_resched && need_resched()) || | ||
+ spin_needbreak(&zone->lock))) { | ||
+ __mod_zone_page_state(zone, NR_FREE_PAGES, | ||
+ -((i + 1 - last_mod) << order)); | ||
+ last_mod = i + 1; | ||
+ spin_unlock(&zone->lock); | ||
+ if (can_resched) | ||
+ cond_resched(); | ||
+ spin_lock(&zone->lock); | ||
+ } | ||
+ | ||
if (unlikely(check_pcp_refill(page, order))) | ||
continue; | ||
|
||
@@ -3163,7 +3176,7 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, | ||
* on i. Do not confuse with 'allocated' which is the number of | ||
* pages added to the pcp list. | ||
*/ | ||
- __mod_zone_page_state(zone, NR_FREE_PAGES, -(i << order)); | ||
+ __mod_zone_page_state(zone, NR_FREE_PAGES, -((i - last_mod) << order)); | ||
spin_unlock(&zone->lock); | ||
return allocated; | ||
} | ||
|
||
From 6329525a0fa10cd13f39b76948b1296150f75c95 Mon Sep 17 00:00:00 2001 | ||
From: Alexandre Frade <[email protected]> | ||
Date: Mon, 29 Aug 2022 16:47:26 +0000 | ||
|