From: Pranjal Arya <pranjal.arya@oss.qualcomm.com>
To: Andrew Morton <akpm@linux-foundation.org>,
Uladzislau Rezki <urezki@gmail.com>,
"Liam R. Howlett" <liam@infradead.org>,
Alice Ryhl <aliceryhl@google.com>,
Andrew Ballance <andrewjballance@gmail.com>
Cc: linux-arm-msm@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, maple-tree@lists.infradead.org,
Lorenzo Stoakes <ljs@kernel.org>,
Pranjal Shrivastava <praan@google.com>,
Will Deacon <will@kernel.org>,
Suzuki K Poulose <Suzuki.Poulose@arm.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Mostafa Saleh <smostafa@google.com>,
Balbir Singh <balbirs@nvidia.com>,
Suren Baghdasaryan <surenb@google.com>,
Marco Elver <elver@google.com>,
Dmitry Vyukov <dvyukov@google.com>,
Alexander Potapenko <glider@google.com>,
Shuah Khan <shuah@kernel.org>, Dev Jain <dev.jain@arm.com>,
Brendan Jackman <jackmanb@google.com>,
Puranjay Mohan <puranjay@kernel.org>,
Santosh Shukla <santosh.shukla@amd.com>,
Wyes Karny <wkarny@gmail.com>,
Pranjal Arya <pranjal.arya@oss.qualcomm.com>,
Sudeep Holla <sudeep.holla@kernel.org>
Subject: [PATCH RFC 06/12] mm/vmalloc: tighten alloc/free hot paths
Date: Sat, 13 Jun 2026 22:49:48 +0530 [thread overview]
Message-ID: <20260613-vmalloc_maple-v1-6-0aa740bb944b@oss.qualcomm.com> (raw)
In-Reply-To: <20260613-vmalloc_maple-v1-0-0aa740bb944b@oss.qualcomm.com>
Three small refinements that follow from using maple_tree more
idiomatically on the alloc and free walkers:
- Carry the MA_STATE through the alloc walker instead of dropping
and re-positioning it between the gap query, the candidate
classify step, and the post-clip publish. The walker is already
pointing at the chosen range; reuse it.
- When the gap query is satisfied by an entry whose start is not
yet aligned, ask for a gap of (size + align - 1) so the first
match is guaranteed alignable. This matches the effective
behaviour of the augmented rb_tree's gap traversal.
- When va_clip narrows an existing free entry, store NULL on just
the consumed sub-range instead of erasing the whole entry and
re-storing the surviving prefix/suffix. mas_store(NULL,
[start, end]) leaves the un-trimmed sub-range of the original
entry intact, so the re-store is unnecessary.
- Walk the address-keyed occupied tree with mas_find on the rare
decay path so the per-node free-area scan can prune ranges that
are already aligned out.
No semantic change to the allocator policy, the free-area shape, or
the addresses returned.
Signed-off-by: Pranjal Arya <pranjal.arya@oss.qualcomm.com>
---
mm/vmalloc.c | 338 +++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 283 insertions(+), 55 deletions(-)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 7feb1b182cfa..5bc1e47c456a 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -899,6 +899,7 @@ static struct maple_tree occupied_vmap_area_mt =
free_vmap_area_lock);
static bool occupied_vmap_area_mt_enabled;
static bool occupied_vmap_area_mt_init_tried;
+static bool occupied_vmap_area_perf_mode;
/*
* Preload a CPU with one object for "no edge" split case. The
@@ -1073,12 +1074,13 @@ static __always_inline bool free_mt_store_va_locked(struct vmap_area *va)
if (!err) {
mas_store_prealloc(&mas, va);
mas_destroy(&mas);
- } else {
- err = mas_store_gfp(&mas, va, GFP_ATOMIC | __GFP_NOWARN);
- if (WARN_ON_ONCE(err))
- return false;
+ return true;
}
+ err = mas_store_gfp(&mas, va, GFP_ATOMIC | __GFP_NOWARN);
+ if (WARN_ON_ONCE(err))
+ return false;
+
return true;
}
@@ -1119,6 +1121,31 @@ free_mt_update_va_locked(struct vmap_area *va, unsigned long old_start,
return true;
}
+/*
+ * Trim a stored range entry by clearing a sub-range from one end.
+ * Used by LE_FIT and RE_FIT in va_clip(): the original [old_start,
+ * old_end-1]->@va entry survives intact at the un-trimmed sub-range,
+ * so a single mas_store NULL replaces the explicit erase + restore-at-
+ * shrunk-range pair, halving maple-tree work for edge clips. NE_FIT
+ * uses the same primitive after first inserting @lva, which trades 3
+ * stores (erase + store + lva) for 2 (lva + middle trim).
+ */
+static __always_inline bool
+free_mt_trim_range_locked(unsigned long trim_start, unsigned long trim_end)
+{
+ int err;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ if (trim_start >= trim_end)
+ return true;
+
+ MA_STATE(mas, &free_vmap_area_mt, trim_start, trim_end - 1);
+
+ err = mas_store_gfp(&mas, NULL, GFP_ATOMIC | __GFP_NOWARN);
+ return !WARN_ON_ONCE(err);
+}
+
static __always_inline void
retry_queue_add_va_locked(struct vmap_area *va)
{
@@ -1175,6 +1202,11 @@ static __always_inline void try_init_free_mt_locked(void)
}
static __always_inline bool occupied_mt_supported(void)
+{
+ return occupied_vmap_area_perf_mode && occupied_vmap_area_mt_enabled;
+}
+
+static __always_inline bool occupied_mt_enabled(void)
{
return occupied_vmap_area_mt_enabled;
}
@@ -1194,28 +1226,48 @@ static __always_inline void try_init_occupied_mt_locked(void)
}
static __always_inline bool
-occupied_mt_store_range_locked(unsigned long start, unsigned long end)
+occupied_mt_store_range_raw_locked(unsigned long start, unsigned long end)
{
int err;
lockdep_assert_held(&free_vmap_area_lock);
- if (WARN_ON_ONCE(!occupied_mt_supported()))
- return false;
+ if (!occupied_mt_enabled())
+ return true;
MA_STATE(mas, &occupied_vmap_area_mt, start, end - 1);
- err = mas_preallocate(&mas, XA_ZERO_ENTRY, GFP_NOWAIT | __GFP_NOWARN);
- if (!err) {
- mas_store_prealloc(&mas, XA_ZERO_ENTRY);
- mas_destroy(&mas);
+ err = mas_store_gfp(&mas, XA_ZERO_ENTRY, GFP_ATOMIC | __GFP_NOWARN);
+ return !WARN_ON_ONCE(err);
+}
+
+static __always_inline bool
+occupied_mt_erase_range_raw_locked(unsigned long start, unsigned long end)
+{
+ int err;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ if (!occupied_mt_enabled())
return true;
- }
- err = mas_store_gfp(&mas, XA_ZERO_ENTRY, GFP_ATOMIC | __GFP_NOWARN);
+ MA_STATE(mas, &occupied_vmap_area_mt, start, end - 1);
+
+ err = mas_store_gfp(&mas, NULL, GFP_ATOMIC | __GFP_NOWARN);
return !WARN_ON_ONCE(err);
}
+static __always_inline bool
+occupied_mt_store_range_locked(unsigned long start, unsigned long end)
+{
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ if (!occupied_mt_supported())
+ return true;
+
+ return occupied_mt_store_range_raw_locked(start, end);
+}
+
static __always_inline bool
occupied_mt_store_va_locked(struct vmap_area *va)
{
@@ -1227,17 +1279,12 @@ occupied_mt_store_va_locked(struct vmap_area *va)
static __always_inline bool
occupied_mt_erase_range_locked(unsigned long start, unsigned long end)
{
- int err;
-
lockdep_assert_held(&free_vmap_area_lock);
if (WARN_ON_ONCE(!occupied_mt_supported()))
return false;
- MA_STATE(mas, &occupied_vmap_area_mt, start, end - 1);
-
- err = mas_store_gfp(&mas, NULL, GFP_ATOMIC | __GFP_NOWARN);
- return !WARN_ON_ONCE(err);
+ return occupied_mt_erase_range_raw_locked(start, end);
}
static __always_inline bool
@@ -1303,6 +1350,24 @@ __find_vmap_area_enclose_addr_mt(unsigned long addr, struct maple_tree *tree)
return mas_find_rev(&mas, 0);
}
+static __always_inline bool
+find_vmap_area_insert_neighbors_mt_locked(struct maple_tree *tree,
+ unsigned long start,
+ unsigned long end,
+ struct vmap_area **left,
+ struct vmap_area **right)
+{
+ *left = __find_vmap_area_enclose_addr_mt(start, tree);
+ if (*left && WARN_ON_ONCE((*left)->va_end > start))
+ return false;
+
+ *right = __find_vmap_area_exceed_addr_mt(start, tree);
+ if (*right && WARN_ON_ONCE((*right)->va_start < end))
+ return false;
+
+ return true;
+}
+
static __always_inline bool
validate_vmap_area_range_insert_mt_locked(struct maple_tree *tree,
unsigned long start,
@@ -1310,12 +1375,8 @@ validate_vmap_area_range_insert_mt_locked(struct maple_tree *tree,
{
struct vmap_area *left, *right;
- left = __find_vmap_area_enclose_addr_mt(start, tree);
- if (left && WARN_ON_ONCE(left->va_end > start))
- return false;
-
- right = __find_vmap_area_exceed_addr_mt(start, tree);
- if (right && WARN_ON_ONCE(right->va_start < end))
+ if (!find_vmap_area_insert_neighbors_mt_locked(tree, start, end,
+ &left, &right))
return false;
return true;
@@ -1499,10 +1560,11 @@ unlink_vmap_area_lazy_locked(struct vmap_area *va, struct vmap_node *vn)
}
/*
- * Transition a VA into the lazy index and drop occupied tracking. On occupied
- * erase failure, attempt to roll back the lazy insertion; if rollback fails we
- * keep the lazy entry and let purge-side erase_occupied handling repair stale
- * occupied state.
+ * Transition a VA into the lazy index.
+ *
+ * In the default mode, occupied tracking is dropped while the VA is lazy.
+ * In occupied perf mode, lazy ranges stay occupied-indexed so hole search can
+ * avoid repeatedly probing unavailable gaps.
*
* Returns true when the VA remains lazy-indexed; false when it should be
* retried via non-index queue.
@@ -1518,6 +1580,11 @@ publish_vmap_area_lazy(struct vmap_area *va, struct vmap_node *vn)
return false;
}
+ if (occupied_mt_supported()) {
+ spin_unlock(&vn->lazy.lock);
+ return true;
+ }
+
/*
* Keep lazy.lock held while dropping occupied tracking so purge-side
* lazy extraction cannot move @va to purge_list during rollback.
@@ -1588,24 +1655,34 @@ move_lazy_vmap_areas_to_purge_locked(struct vmap_node *vn)
}
static __always_inline bool
-insert_vmap_area_free_locked(struct vmap_area *va)
+insert_vmap_area_free_nocheck_locked(struct vmap_area *va)
{
- struct vmap_area *prev, *next;
-
lockdep_assert_held(&free_vmap_area_lock);
- prev = __find_vmap_area_enclose_addr_mt(va->va_start, &free_vmap_area_mt);
- if (prev && WARN_ON_ONCE(prev->va_end > va->va_start))
- return false;
+ try_init_free_mt_locked();
- next = __find_vmap_area_exceed_addr_mt(va->va_start, &free_vmap_area_mt);
- if (next && WARN_ON_ONCE(next->va_start < va->va_end))
+ if (unlikely(!free_mt_supported()))
return false;
INIT_LIST_HEAD(&va->list);
return free_mt_store_va_locked(va);
}
+static __always_inline bool
+insert_vmap_area_free_locked(struct vmap_area *va)
+{
+ struct vmap_area *prev, *next;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ if (!find_vmap_area_insert_neighbors_mt_locked(&free_vmap_area_mt,
+ va->va_start, va->va_end,
+ &prev, &next))
+ return false;
+
+ return insert_vmap_area_free_nocheck_locked(va);
+}
+
static __always_inline void
unlink_vmap_area_free_locked(struct vmap_area *va)
{
@@ -1634,8 +1711,9 @@ merge_or_add_vmap_area_free_locked(struct vmap_area *va)
new_start = va->va_start;
new_end = va->va_end;
- left = __find_vmap_area_enclose_addr_mt(new_start, &free_vmap_area_mt);
- if (left && WARN_ON_ONCE(left->va_end > new_start))
+ if (!find_vmap_area_insert_neighbors_mt_locked(&free_vmap_area_mt,
+ new_start, new_end,
+ &left, &right))
return NULL;
right = __find_vmap_area_exceed_addr_mt(new_start, &free_vmap_area_mt);
@@ -1657,7 +1735,7 @@ merge_or_add_vmap_area_free_locked(struct vmap_area *va)
va->va_start = new_start;
va->va_end = new_end;
- if (!insert_vmap_area_free_locked(va))
+ if (!insert_vmap_area_free_nocheck_locked(va))
return NULL;
return va;
@@ -1690,6 +1768,10 @@ occupied_mt_find_hole_window_locked(unsigned long min, unsigned long max,
MA_STATE(mas, &occupied_vmap_area_mt, 0, 0);
unsigned long search = min;
unsigned long hole_end;
+ bool retry_empty;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+ retry_empty = list_empty(&vmap_retry_list);
while (search <= max) {
unsigned long candidate, candidate_end;
@@ -1709,7 +1791,8 @@ occupied_mt_find_hole_window_locked(unsigned long min, unsigned long max,
while (candidate >= search && candidate_end <= hole_end) {
unsigned long blocked_end = 0;
- if (!retry_queue_overlap_locked(candidate, candidate_end,
+ if (retry_empty ||
+ !retry_queue_overlap_locked(candidate, candidate_end,
&blocked_end)) {
*addr = candidate;
return true;
@@ -1751,6 +1834,70 @@ occupied_mt_find_hole_lowest_locked(unsigned long size, unsigned long align,
return -ENOENT;
}
+static __always_inline struct vmap_area *
+free_mt_find_enclose_range_locked(unsigned long start, unsigned long end)
+{
+ struct vmap_area *va;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ va = __find_vmap_area_mt(start, &free_vmap_area_mt);
+ if (!va)
+ return NULL;
+
+ if (va->va_start > start || va->va_end < end)
+ return NULL;
+
+ return va;
+}
+
+static __always_inline void
+occupied_mt_cache_gap_miss_locked(unsigned long candidate, unsigned long vend)
+{
+ struct vmap_area *prev, *next;
+ unsigned long blocked_end;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ if (!occupied_mt_supported())
+ return;
+
+ prev = __find_vmap_area_enclose_addr_mt(candidate, &free_vmap_area_mt);
+ if (prev && prev->va_start <= candidate && candidate < prev->va_end)
+ return;
+
+ next = __find_vmap_area_exceed_addr_mt(candidate, &free_vmap_area_mt);
+ blocked_end = next ? next->va_start : vend;
+ if (blocked_end <= candidate)
+ return;
+
+ WARN_ON_ONCE(!occupied_mt_store_range_raw_locked(candidate, blocked_end));
+}
+
+static __always_inline bool occupied_mt_seed_from_free_locked(void)
+{
+ MA_STATE(mas, &free_vmap_area_mt, 0, 0);
+ struct vmap_area *va;
+ unsigned long search = VMALLOC_START;
+
+ lockdep_assert_held(&free_vmap_area_lock);
+
+ mas_for_each(&mas, va, VMALLOC_END - 1) {
+ if (search < va->va_start) {
+ if (!occupied_mt_store_range_raw_locked(search, va->va_start))
+ return false;
+ }
+
+ if (va->va_end > search)
+ search = va->va_end;
+ }
+
+ if (search < VMALLOC_END)
+ return occupied_mt_store_range_raw_locked(search, VMALLOC_END);
+
+ return true;
+}
+
/* Lowest-match scan directly on maple ordered traversal. */
static __always_inline struct vmap_area *
find_vmap_lowest_match_mt(struct maple_tree *tree, unsigned long size,
@@ -1939,11 +2086,39 @@ va_clip(struct vmap_area *va, unsigned long nva_start_addr,
}
if (type != FL_FIT_TYPE) {
- if (free_mt_supported() &&
- !free_mt_update_va_locked(va, old_start, old_end))
- return -ENOMEM;
-
- if (lva && !insert_vmap_area_free_locked(lva)) {
+ if (free_mt_supported()) {
+ /*
+ * Drop only the consumed sub-range from the original
+ * free entry instead of erase-then-store. The maple
+ * tree leaves @va at the surviving sub-range intact,
+ * so a single mas_store per clip side suffices.
+ *
+ * For NE_FIT, insert @lva at the original entry's
+ * left portion first: mas_store overwrites the old
+ * [old_start, old_end-1]->va entry only across
+ * [old_start, lva->va_end-1], leaving the right side
+ * still pointing to @va. The subsequent middle trim
+ * carves out the consumed gap. Trades 3 stores
+ * (erase + restore + lva) for 2.
+ */
+ if (type == LE_FIT_TYPE) {
+ if (!free_mt_trim_range_locked(old_start,
+ va->va_start))
+ return -ENOMEM;
+ } else if (type == RE_FIT_TYPE) {
+ if (!free_mt_trim_range_locked(va->va_end,
+ old_end))
+ return -ENOMEM;
+ } else { /* NE_FIT_TYPE */
+ if (!insert_vmap_area_free_nocheck_locked(lva)) {
+ kmem_cache_free(vmap_area_cachep, lva);
+ return -ENOMEM;
+ }
+ if (!free_mt_trim_range_locked(nva_start_addr,
+ nva_start_addr + size))
+ return -ENOMEM;
+ }
+ } else if (lva && !insert_vmap_area_free_nocheck_locked(lva)) {
kmem_cache_free(vmap_area_cachep, lva);
return -ENOMEM;
}
@@ -1965,7 +2140,7 @@ restore_allocated_vmap_range_free_locked(unsigned long start, unsigned long end)
va->va_start = start;
va->va_end = end;
- if (!insert_vmap_area_free_locked(va)) {
+ if (!insert_vmap_area_free_nocheck_locked(va)) {
kmem_cache_free(vmap_area_cachep, va);
return false;
}
@@ -2048,6 +2223,7 @@ __alloc_vmap_area(unsigned long size, unsigned long align,
int ret;
unsigned long nva_start_addr;
unsigned long nva_end_addr;
+ unsigned long search_len = size;
struct vmap_area *va;
MA_STATE(mas, &free_vmap_area_mt, 0, 0);
@@ -2059,6 +2235,28 @@ __alloc_vmap_area(unsigned long size, unsigned long align,
return -EINVAL;
if (size > vend - vstart)
return -ENOENT;
+ if (align > PAGE_SIZE && (vend - vstart) != size) {
+ if (check_add_overflow(size, align - 1, &search_len))
+ return -ERANGE;
+ }
+
+ if (occupied_mt_supported() && align <= PAGE_SIZE) {
+ unsigned long candidate;
+
+ if (occupied_mt_find_hole_window_locked(vstart, vend - 1, size,
+ align, &candidate)) {
+ if (check_add_overflow(candidate, size, &nva_end_addr))
+ return -ERANGE;
+
+ va = free_mt_find_enclose_range_locked(candidate, nva_end_addr);
+ if (likely(va)) {
+ nva_start_addr = candidate;
+ goto found;
+ }
+
+ occupied_mt_cache_gap_miss_locked(candidate, vend);
+ }
+ }
/*
* Free maple index is authoritative for allocatable ranges; lazy and
@@ -2067,26 +2265,37 @@ __alloc_vmap_area(unsigned long size, unsigned long align,
mas_set(&mas, vstart);
va = mas_find(&mas, vend - 1);
while (va) {
- unsigned long search_start = max(va->va_start, vstart);
- unsigned long candidate_end;
+ unsigned long search_start, limit_end;
+
+ search_start = va->va_start;
+ if (search_start < vstart)
+ search_start = vstart;
+
+ limit_end = va->va_end;
+ if (limit_end > vend)
+ limit_end = vend;
+
+ if (unlikely(limit_end <= search_start))
+ goto next;
+ if (unlikely(limit_end - search_start < search_len))
+ goto next;
nva_start_addr = ALIGN(search_start, align);
if (nva_start_addr < search_start)
return -ERANGE;
- if (check_add_overflow(nva_start_addr, size - 1, &candidate_end))
+ if (check_add_overflow(nva_start_addr, size, &nva_end_addr))
return -ERANGE;
-
- if (candidate_end < vend && candidate_end < va->va_end) {
- nva_end_addr = candidate_end + 1;
+ if (nva_end_addr <= limit_end)
break;
- }
+next:
va = mas_next(&mas, vend - 1);
}
if (!va)
return -ENOENT;
+found:
ret = va_clip(va, nva_start_addr, size);
if (WARN_ON_ONCE(ret))
return ret;
@@ -2571,7 +2780,8 @@ decay_va_pool_node(struct vmap_node *vn, bool full_decay)
}
}
- WARN_ON_ONCE(!reclaim_list_global(&decay_list, false, &decay_failed));
+ WARN_ON_ONCE(!reclaim_list_global(&decay_list, occupied_mt_supported(),
+ &decay_failed));
list_for_each_entry_safe(va, nva, &decay_failed, list) {
list_del_init(&va->list);
WARN_ON_ONCE(!node_pool_add_va(vn, va));
@@ -6043,3 +6253,21 @@ void __init vmalloc_init(void)
vmap_node_shrinker->scan_objects = vmap_node_shrink_scan;
shrinker_register(vmap_node_shrinker);
}
+
+static int __init vmap_enable_occupied_perf_mode(void)
+{
+ bool seeded = false;
+
+ spin_lock(&free_vmap_area_lock);
+ try_init_occupied_mt_locked();
+ if (occupied_mt_enabled())
+ seeded = occupied_mt_seed_from_free_locked();
+ occupied_vmap_area_perf_mode = seeded;
+ spin_unlock(&free_vmap_area_lock);
+
+ if (!seeded)
+ pr_warn("vmalloc: occupied perf mode disabled (seed failure)\n");
+
+ return 0;
+}
+late_initcall(vmap_enable_occupied_perf_mode);
--
2.34.1
next prev parent reply other threads:[~2026-06-13 17:21 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-13 17:19 [PATCH RFC 00/12] mm/vmalloc: migrate vmap_area indexing from rb-tree to maple-tree Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 01/12] mm/vmalloc: introduce maple_tree-based indexing for vmap_area Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 02/12] mm/vmalloc: convert allocation-side gap finding and insertion to maple_tree Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 03/12] mm/vmalloc: convert free, purge, and pcpu paths " Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 04/12] mm/vmalloc: finalize maple-only indexing and shrink struct vmap_area Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 05/12] mm/vmalloc: tighten failure handling under memory pressure Pranjal Arya
2026-06-13 17:19 ` Pranjal Arya [this message]
2026-06-13 17:19 ` [PATCH RFC 07/12] mm/vmalloc: consolidate occupied tree as authoritative index on hot path Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 08/12] mm/vmalloc: track lazy-purge queue as a list_head Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 09/12] mm/vmalloc: collapse busy-tree find-then-unlink into a single mas_erase Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 10/12] mm/vmalloc: per-CPU caching of free ranges from the maple_tree allocator Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 11/12] mm/vmalloc: O(1) lookup of cached vmap_areas with bounded fast-reject Pranjal Arya
2026-06-13 17:19 ` [PATCH RFC 12/12] mm/vmalloc: harden bump-allocator alloc/free against UBSAN array bounds Pranjal Arya
2026-06-13 23:15 ` [PATCH RFC 00/12] mm/vmalloc: migrate vmap_area indexing from rb-tree to maple-tree Matthew Wilcox
2026-06-14 6:35 ` [syzbot ci] " syzbot ci
2026-06-14 6:58 ` [PATCH RFC 00/12] " Uladzislau Rezki
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=20260613-vmalloc_maple-v1-6-0aa740bb944b@oss.qualcomm.com \
--to=pranjal.arya@oss.qualcomm.com \
--cc=Suzuki.Poulose@arm.com \
--cc=akpm@linux-foundation.org \
--cc=aliceryhl@google.com \
--cc=andrewjballance@gmail.com \
--cc=balbirs@nvidia.com \
--cc=dev.jain@arm.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=glider@google.com \
--cc=jackmanb@google.com \
--cc=liam@infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=maple-tree@lists.infradead.org \
--cc=neil.armstrong@linaro.org \
--cc=praan@google.com \
--cc=puranjay@kernel.org \
--cc=santosh.shukla@amd.com \
--cc=shuah@kernel.org \
--cc=smostafa@google.com \
--cc=sudeep.holla@kernel.org \
--cc=surenb@google.com \
--cc=urezki@gmail.com \
--cc=will@kernel.org \
--cc=wkarny@gmail.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.