mm-page_alloc-protect-pcp-lists-with-a-spinlock.patch removed from -mm tree
The quilt patch titled
Subject: mm/page_alloc: protect PCP lists with a spinlock
has been removed from the -mm tree. Its filename was
mm-page_alloc-protect-pcp-lists-with-a-spinlock.patch
This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Mel Gorman <[email protected]>
Subject: mm/page_alloc: protect PCP lists with a spinlock
Date: Fri, 24 Jun 2022 13:54:21 +0100
Currently the PCP lists are protected by using local_lock_irqsave to prevent migration and IRQ reentrancy but this is inconvenient. Remote draining of the lists is impossible and a workqueue is required and every task allocation/free must disable then enable interrupts which is expensive.
As preparation for dealing with both of those problems, protect the lists with a spinlock. The IRQ-unsafe version of the lock is used because IRQs are already disabled by local_lock_irqsave. spin_trylock is used in combination with local_lock_irqsave() but later will be replaced with a spin_trylock_irqsave when the local_lock is removed.
The per_cpu_pages still fits within the same number of cache lines after this patch relative to before the series.
struct per_cpu_pages {
spinlock_t lock; /* 0 4 */
int count; /* 4 4 */
int high; /* 8 4 */
int batch; /* 12 4 */
short int free_factor; /* 16 2 */
short int expire; /* 18 2 */ /* XXX 4 bytes hole, try to pack */
struct list_head lists[13]; /* 24 208 */
/* size: 256, cachelines: 4, members: 7 */
/* sum members: 228, holes: 1, sum holes: 4 */
/* padding: 24 */
} __attribute__((__aligned__(64)));There is overhead in the fast path due to acquiring the spinlock even though the spinlock is per-cpu and uncontended in the common case. Page Fault Test (PFT) running on a 1-socket reported the following results on a 1 socket machine.
5.19.0-rc3 5.19.0-rc3
vanilla mm-pcpspinirq-v5r16
Hmean faults/sec-1 869275.7381 ( 0.00%) 874597.5167 * 0.61%*
Hmean faults/sec-3 2370266.6681 ( 0.00%) 2379802.0362 * 0.40%*
Hmean faults/sec-5 2701099.7019 ( 0.00%) 2664889.7003 * -1.34%*
Hmean faults/sec-7 3517170.9157 ( 0.00%) 3491122.8242 * -0.74%*
Hmean faults/sec-8 3965729.6187 ( 0.00%) 3939727.0243 * -0.66%*There is a small hit in the number of faults per second but given that the results are more stable, it's borderline noise.
---
include/linux/mmzone.h | 1 mm/page_alloc.c | 119 ++++++++++++++++++++++++++++++++------- 2 files changed, 99 insertions(+), 21 deletions(-)
include/linux/mmzone.h renamed from include/linux/mmzone.h~mm-page_alloc-protect-pcp-lists-with-a-spinlock +1 -0
@@ -382,6 +382,7 @@ enum zone_watermarks {/* Fields and list protected by pagesets local_lock in page_alloc.c */ struct per_cpu_pages { +spinlock_t lock;/* Protects lists field */ int count;/* number of pages in the list */ int high;/* high watermark, emptying needed */ int batch;/* chunk size for buddy add/remove */
mm/page_alloc.c renamed from mm/page_alloc.c~mm-page_alloc-protect-pcp-lists-with-a-spinlock +98 -21
263 lines not on this page · raw message
_
Patches currently in -mm which might be from [email protected] are