diff options
Diffstat (limited to 'system/easy-kernel/0400-reduce-pageblock-size-nonhugetlb.patch')
-rw-r--r-- | system/easy-kernel/0400-reduce-pageblock-size-nonhugetlb.patch | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/system/easy-kernel/0400-reduce-pageblock-size-nonhugetlb.patch b/system/easy-kernel/0400-reduce-pageblock-size-nonhugetlb.patch new file mode 100644 index 000000000..b32f4ba76 --- /dev/null +++ b/system/easy-kernel/0400-reduce-pageblock-size-nonhugetlb.patch @@ -0,0 +1,44 @@ +From: Sultan Alsawaf <sultan@kerneltoast.com> +Date: Wed, 20 Oct 2021 20:50:11 -0700 +Subject: [PATCH 02/16] ZEN: mm: Lower the non-hugetlbpage pageblock size to + reduce scheduling delays + +The page allocator processes free pages in groups of pageblocks, where +the size of a pageblock is typically quite large (1024 pages without +hugetlbpage support). Pageblocks are processed atomically with the zone +lock held, which can cause severe scheduling delays on both the CPU +going through the pageblock and any other CPUs waiting to acquire the +zone lock. A frequent offender is move_freepages_block(), which is used +by rmqueue() for page allocation. + +As it turns out, there's no requirement for pageblocks to be so large, +so the pageblock order can simply be reduced to ease the scheduling +delays and zone lock contention. PAGE_ALLOC_COSTLY_ORDER is used as a +reasonable setting to ensure non-costly page allocation requests can +still be serviced without always needing to free up more than one +pageblock's worth of pages at a time. + +This has a noticeable effect on overall system latency when memory +pressure is elevated. The various mm functions which operate on +pageblocks no longer appear in the preemptoff tracer, where previously +they would spend up to 100 ms on a mobile arm64 CPU processing a +pageblock with preemption disabled and the zone lock held. + +Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com> +--- + include/linux/pageblock-flags.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flags.h +index e83c4c095..21b8dfa5d 100644 +--- a/include/linux/pageblock-flags.h ++++ b/include/linux/pageblock-flags.h +@@ -48,7 +48,7 @@ extern unsigned int pageblock_order; + #else /* CONFIG_HUGETLB_PAGE */ + + /* If huge pages are not used, group by MAX_ORDER_NR_PAGES */ +-#define pageblock_order MAX_ORDER ++#define pageblock_order PAGE_ALLOC_COSTLY_ORDER + + #endif /* CONFIG_HUGETLB_PAGE */ + |