From: xu.xin@linux.dev
To: akpm@linux-foundation.org, david@kernel.org
Cc: agordeev@linux.ibm.com, gerald.schaefer@linux.ibm.com,
hca@linux.ibm.com, gor@linux.ibm.com, borntraeger@linux.ibm.com,
svens@linux.ibm.com, ljs@kernel.org, liam@infradead.org,
vbabka@kernel.org, rppt@kernel.org, surenb@google.com,
mhocko@suse.com, mhiramat@kernel.org, oleg@redhat.com,
peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
namhyung@kernel.org, mark.rutland@arm.com,
alexander.shishkin@linux.intel.com, jolsa@kernel.org,
irogers@google.com, adrian.hunter@intel.com,
james.clark@linaro.org, ziy@nvidia.com,
baolin.wang@linux.alibaba.com, nico.pache@linux.dev,
ryan.roberts@arm.com, dev.jain@arm.com, baohua@kernel.org,
lance.yang@linux.dev, usama.arif@linux.dev, kas@kernel.org,
xu.xin@linux.dev, chengming.zhou@linux.dev,
matthew.brost@intel.com, joshua.hahnjy@gmail.com,
byungchul@sk.com, gourry@gourry.net,
ying.huang@linux.alibaba.com, apopple@nvidia.com,
riel@surriel.com, harry@kernel.org, jannh@google.com,
linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org
Subject: [PATCH v2 0/4] mm/ksm: use per-VMA locking to reduce mmap_lock contention
Date: Mon, 2 Nov 2026 21:24:16 +0800 [thread overview]
Message-ID: <20261102132416.300084-1-xu.xin@linux.dev> (raw)
From: Xu Xin <xu.xin@linux.dev>
KSM scans VM_MERGEABLE VMAs and currently protects each scan with
mmap_read_lock(). Per-VMA locking allows KSM to read-lock only the VMA
it is actually interested in, so that unrelated mmap()/munmap() activity
in the same mm no longer blocks ksmd.
This series is organized as follows:
Patch 1 removes an unused 'vma' member from struct folio_walk. It has
never been used since its introduction and is pure cleanup.
Patch 2 adds a 'walk_lock' member to struct folio_walk and extends
folio_walk_start() to assert the required locking mode. Existing
callers are converted to pass PGWALK_RDLOCK, so there is no functional
change. This prepares folio_walk_start() for callers that hold a
per-VMA read lock instead of mmap_read_lock(), which is needed by the
Patch 4. No functional change.
Patch 3 replaces the boolean 'lock_vma' argument of break_ksm() with a
KSM-local enum ksm_walk_lock and builds the mm_walk_ops on the stack,
so the function-pointer table stays const and there is no shared
mutable state. No functional change.
Patch 4 introduces find_mergeable_vma_locked(), which uses the
universal per-VMA locking helper vma_start_read_unlocked() to look up
and read-lock a VM_MERGEABLE VMA without taking mmap_read_lock(). All
KSM call sites that previously used find_mergeable_vma() under
mmap_read_lock() are converted to the new helper, and the locking in
get_mergeable_page() is switched to PGWALK_VMA_RDLOCK_VERIFY so that
folio_walk_start() can verify the per-VMA lock is held. Because ksmd
no longer holds mmap_read_lock() while walking, __ksm_exit() must also
write-lock every VMA (in addition to mmap_write_lock()) to keep
serializing against an in-flight ksmd walk before the page tables are
freed.
A microbenchmark was run to measure the time KSM takes to merge a
victim region under mmap_lock contention. Under interference from 4 churner
threads, the merge time of the per-VMA KSM-optimized kernel is
significantly reduced by 50%.
Changelog:
v2:
- Patch 1: rewrote the commit message to explain the introducing
commit, how the VMA is actually used, and the audit performed;
dropped the Fixes: tag.
- Patch 3:
* replaced the boolean 'lock_vma' with a KSM-local enum
ksm_walk_lock instead of exposing the internal enum page_walk_lock
as a parameter;
* build the mm_walk_ops on the stack rather than
mutating a global struct, so the function-pointer table stays const
and there is no shared mutable state; rewrote the commit message.
- Patch 4:
* Fixed a per-VMA read-lock leak in find_mergeable_vma_locked()
when the VMA is not mergeable;
made __ksm_exit() write-lock every VMA (vma_start_write()) in
addition to mmap_write_lock(), so that it still serializes against a
ksmd walk that holds only a per-VMA read lock.
Xu Xin (4):
mm/pagewalk: delete the unused member
mm: make folio_walk_start()'s locking asserts scalable
mm/ksm: make break_ksm() more scalable
ksm: add find_mergeable_vma_locked() to use per-VMA locking
arch/s390/mm/fault.c | 4 +-
include/linux/pagewalk.h | 2 +-
kernel/events/uprobes.c | 4 +-
mm/huge_memory.c | 4 +-
mm/ksm.c | 124 +++++++++++++++++++++++++++------------
mm/migrate.c | 8 ++-
mm/pagewalk.c | 10 +++-
mm/rmap.c | 4 +-
8 files changed, 116 insertions(+), 44 deletions(-)
--
2.34.1
next reply other threads:[~2026-11-02 13:24 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-02 13:24 xu.xin [this message]
2026-11-02 13:28 ` [PATCH v2 1/4] mm/pagewalk: delete the unused member xu.xin
2026-11-03 13:31 ` sashiko-bot
2026-11-02 13:29 ` [PATCH v2 2/4] mm: make folio_walk_start()'s locking asserts scalable xu.xin
2026-11-03 13:31 ` sashiko-bot
2026-11-02 13:29 ` [PATCH v2 3/4] mm/ksm: make break_ksm() more scalable xu.xin
2026-11-03 13:31 ` sashiko-bot
2026-11-02 13:31 ` [PATCH v2 4/4] ksm: add find_mergeable_vma_locked() to use per-VMA locking xu.xin
2026-11-03 13:31 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261102132416.300084-1-xu.xin@linux.dev \
--to=xu.xin@linux.dev \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=apopple@nvidia.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=borntraeger@linux.ibm.com \
--cc=byungchul@sk.com \
--cc=chengming.zhou@linux.dev \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=gourry@gourry.net \
--cc=harry@kernel.org \
--cc=hca@linux.ibm.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jannh@google.com \
--cc=jolsa@kernel.org \
--cc=joshua.hahnjy@gmail.com \
--cc=kas@kernel.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-s390@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=mark.rutland@arm.com \
--cc=matthew.brost@intel.com \
--cc=mhiramat@kernel.org \
--cc=mhocko@suse.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=nico.pache@linux.dev \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=riel@surriel.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=surenb@google.com \
--cc=svens@linux.ibm.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=ying.huang@linux.alibaba.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.