On 02/22/24 at 01:52pm, Uladzislau Rezki wrote: > Hello, Rulinhuang! > > > Hi Uladzislau and Andrew, we have rebased it(Patch v4) on branch > > mm-unstable and remeasured it. Could you kindly help confirm if > > this is the right base to work on? > > Compared to the previous result at kernel v6.7 with a 5% performance > > gain on intel icelake(160 vcpu), we only had a 0.6% with this commit > > base. But we think our modification still has some significance. On > > the one hand, this does reduce a critical section. On the other hand, > > we have a 4% performance gain on intel sapphire rapids(224 vcpu), > > which suggests more performance improvement would likely be achieved > > when the core count of processors increases to hundreds or > > even thousands. > > Thank you again for your comments. > > > According to the patch that was a correct rebase. Right a small delta > on your 160 CPUs is because of removing a contention. As for bigger > systems it is bigger impact, like you point here on your 224 vcpu > results where you see %4 perf improvement. > > So we should fix it. But the way how it is fixed is not optimal from > my point of view, because the patch that is in question spreads the > internals from alloc_vmap_area(), like inserting busy area, across > many parts now. I happened to walk into this thread and come up with one draft patch. Please help check if it's ok. >From 0112e39b3a8454a288e1bcece220c4599bac5326 Mon Sep 17 00:00:00 2001 From: Baoquan He <bhe@xxxxxxxxxx> Date: Thu, 22 Feb 2024 23:26:59 +0800 Subject: [PATCH] mm/vmalloc.c: avoid repeatedly requiring lock unnecessarily Content-type: text/plain By moving setup_vmalloc_vm() into alloc_vmap_area(), we can reduce requiring lock one time in short time. Signed-off-by: Baoquan He <bhe@xxxxxxxxxx> --- mm/vmalloc.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index aeee71349157..6bda3c06b484 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1848,7 +1848,10 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, unsigned long align, unsigned long vstart, unsigned long vend, int node, gfp_t gfp_mask, - unsigned long va_flags) + unsigned long va_flags, + struct vm_struct *vm, + unsigned long vm_flags, + const void *caller) { struct vmap_node *vn; struct vmap_area *va; @@ -1915,6 +1918,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, spin_lock(&vn->busy.lock); insert_vmap_area(va, &vn->busy.root, &vn->busy.head); + if (!(va_flags & VMAP_RAM) && vm) + setup_vmalloc_vm(vm, va, vm_flags, caller); spin_unlock(&vn->busy.lock); BUG_ON(!IS_ALIGNED(va->va_start, align)); @@ -2947,7 +2952,7 @@ void __init vm_area_register_early(struct vm_struct *vm, size_t align) kasan_populate_early_vm_area_shadow(vm->addr, vm->size); } -static inline void setup_vmalloc_vm_locked(struct vm_struct *vm, +static inline void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, unsigned long flags, const void *caller) { vm->flags = flags; @@ -2957,16 +2962,6 @@ static inline void setup_vmalloc_vm_locked(struct vm_struct *vm, va->vm = vm; } -static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, - unsigned long flags, const void *caller) -{ - struct vmap_node *vn = addr_to_node(va->va_start); - - spin_lock(&vn->busy.lock); - setup_vmalloc_vm_locked(vm, va, flags, caller); - spin_unlock(&vn->busy.lock); -} - static void clear_vm_uninitialized_flag(struct vm_struct *vm) { /* @@ -3009,8 +3004,6 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, return NULL; } - setup_vmalloc_vm(area, va, flags, caller); - /* * Mark pages for non-VM_ALLOC mappings as accessible. Do it now as a * best-effort approach, as they can be mapped outside of vmalloc code. @@ -4586,7 +4579,7 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, spin_lock(&vn->busy.lock); insert_vmap_area(vas[area], &vn->busy.root, &vn->busy.head); - setup_vmalloc_vm_locked(vms[area], vas[area], VM_ALLOC, + setup_vmalloc_vm(vms[area], vas[area], VM_ALLOC, pcpu_get_vm_areas); spin_unlock(&vn->busy.lock); } -- 2.41.0