diff --git a/linux-tkg-patches/6.11/0003-glitched-base.patch b/linux-tkg-patches/6.11/0003-glitched-base.patch index e6351a58..8ef9b0df 100644 --- a/linux-tkg-patches/6.11/0003-glitched-base.patch +++ b/linux-tkg-patches/6.11/0003-glitched-base.patch @@ -648,83 +648,6 @@ index 5f1ae07d724b88..97cda629c9e909 100644 #endif /* CONFIG_HUGETLB_PAGE */ -From f22bc56be85e69c71c8e36041193856bb8b01525 Mon Sep 17 00:00:00 2001 -From: Sultan Alsawaf -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 ---- - 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 Date: Mon, 29 Aug 2022 16:47:26 +0000