Linux Kernel Selftest development
 help / color / mirror / Atom feed
* [PATCH bpf v2 1/2] bpf: bound resizable hash map iteration
@ 2026-08-31 14:01 Hui Su
  2026-08-31 14:01 ` [PATCH bpf v2 2/2] selftests/bpf: add RHASH iteration stress test Hui Su
  2026-09-03 16:43 ` [PATCH bpf v2 1/2] bpf: bound resizable hash map iteration Mykyta Yatsenko
  0 siblings, 2 replies; 4+ messages in thread
From: Hui Su @ 2026-08-31 14:01 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, eddyz87, memxor, martin.lau, song,
	yonghong.song, jolsa, emil, ihor.solodrai, shuah, yatsenko,
	linux-kernel, linux-kselftest

rhashtable_next_key() provides a best-effort walk that may revisit
entries and is not guaranteed to terminate under sustained rehashing.
Callers performing a full iteration are expected to bound the walk
externally.

bpf_each_rhash_elem() currently loops until rhashtable_next_key()
returns NULL, leaving callback execution without a finite bound. Sample
rhashtable's current element count and use it as the iteration budget.
This keeps the bound proportional to current occupancy instead of the
potentially much larger map capacity.

Duplicate visits may consume the budget and cause the walk to stop before
all keys are observed, but RHASH iteration already permits missed
elements under concurrent mutation.

This is reproducible with concurrent updates and deletes triggering
rehash. With max_entries=4096, one walk invoked the callback 5239 times
on an unpatched kernel. With the bound in place, callback invocations did
not exceed 4096 in the same stress test.

Fixes: 818e00848227 ("bpf: Implement iteration ops for resizable hashtab")
Signed-off-by: Hui Su <sh_def@163.com>
---
Changes in v2:
- Bound the walk by the sampled rhashtable element count instead of
  map->max_entries, keeping the budget proportional to occupancy.

Link: https://lore.kernel.org/bpf/20260828183326.3330530-1-sh_def@163.com/
---
 kernel/bpf/hashtab.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index d40cb5dd446c..2cad67c90154 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -3198,7 +3198,8 @@ static long bpf_each_rhash_elem(struct bpf_map *map, bpf_callback_t callback_fn,
 	struct bpf_rhtab *rhtab = container_of(map, struct bpf_rhtab, map);
 	void *prev_key = NULL;
 	struct rhtab_elem *elem;
-	int num_elems = 0;
+	u32 visit_budget;
+	u32 num_elems = 0;
 	u64 ret = 0;
 
 	cant_migrate();
@@ -3212,7 +3213,9 @@ static long bpf_each_rhash_elem(struct bpf_map *map, bpf_callback_t callback_fn,
 	 * elements are deleted/inserted, there may be missed or duplicate
 	 * elements visited.
 	 */
-	while ((elem = rhashtable_next_key(&rhtab->ht, prev_key))) {
+	visit_budget = atomic_read(&rhtab->ht.nelems);
+	while (num_elems < visit_budget &&
+	       (elem = rhashtable_next_key(&rhtab->ht, prev_key))) {
 		if (IS_ERR(elem))
 			break;
 		num_elems++;

base-commit: c20313e98b04ce543936431b6122dd639d3a8346
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-09-04  3:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-31 14:01 [PATCH bpf v2 1/2] bpf: bound resizable hash map iteration Hui Su
2026-08-31 14:01 ` [PATCH bpf v2 2/2] selftests/bpf: add RHASH iteration stress test Hui Su
2026-09-03 16:43 ` [PATCH bpf v2 1/2] bpf: bound resizable hash map iteration Mykyta Yatsenko
2026-09-04  3:16   ` Hui Su

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox