All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] xen/mm: Fix off-by-one for tail merge in reserve_offlined_page()
@ 2026-06-03 14:27 Bernhard Kaindl
  2026-06-03 14:27 ` [PATCH v2 1/2] xen/mm: Fix off-by-one preventing " Bernhard Kaindl
  2026-06-03 14:27 ` [PATCH v2 2/2] tools/tests: Add regression test for tail buddy growth Bernhard Kaindl
  0 siblings, 2 replies; 6+ messages in thread
From: Bernhard Kaindl @ 2026-06-03 14:27 UTC (permalink / raw)
  To: xen-devel
  Cc: Bernhard Kaindl, Andrew Cooper, Anthony PERARD, Michal Orzel,
	Jan Beulich, Julien Grall, Roger Pau Monné,
	Stefano Stabellini

After offlining pages, reserve_offlined_page() attempts to grow larger
buddies between the offlined pages, but due to an off-by-one, this
fails at the tail end of the span of pages of the containing buddy.

As requested for backporting the fix, the first patch fixes the
issue while the second patch adds the regression test for it.

Consider an order-2 buddy (4 pages) with the following layout:
+---------------+---------------+---------------+---------------+
| head page       tail page 1,    tail page 2     tail page 3   |
| PFN_ORDER(pg)   marked as to                                  |
| == 2            be offlined                                   |
+---------------+---------------+---------------+---------------+

The expected result after removing tail page 1 and returning the
remaining healthy pages to the free list would be:

+---------------+               +---------------+---------------+
| single page   | offlined page | head page       tail page     |
| PFN_ORDER(pg) | not returned  | PFN_ORDER(pg)                 |
| == 0          | to the heap   | == 1                          |
+---------------+               +---------------+---------------+

A trivial off-by-one error in the growth loop stops the growth loop
early before the tail end of the original buddy and we end up with:

+---------------+               +---------------+---------------+
| single page   | offlined page | single page   | single page   |
| PFN_ORDER(pg) | not returned  | PFN_ORDER(pg) | PFN_ORDER(pg) |
| == 0          | to the heap   | == 0          | == 0          |
+---------------+               +---------------+---------------+

You can pull this series with the regression test environment to run it:
$ git pull git@gitlab.com:bernhardkaindl/xen.git offline-merge-tail-v2
$ make -C tools/tests/native TARGETS=offline-merge-tail test

Fixes: e4865c2315 ('Page offline support in Xen side')
Signed-off-by: Bernhard Kaindl <bernhard.kaindl@citrix.com>

Bernhard Kaindl (2):
  xen/mm: Fix off-by-one preventing tail merge in
    reserve_offlined_page()
  tools/tests: Add regression test for tail buddy growth

 tools/tests/native/offline-merge-tail.c | 81 +++++++++++++++++++++++++
 xen/common/page_alloc.c                 |  4 +-
 2 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 tools/tests/native/offline-merge-tail.c

-- 
2.39.5



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

end of thread, other threads:[~2026-06-04  9:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-03 14:27 [PATCH v2 0/2] xen/mm: Fix off-by-one for tail merge in reserve_offlined_page() Bernhard Kaindl
2026-06-03 14:27 ` [PATCH v2 1/2] xen/mm: Fix off-by-one preventing " Bernhard Kaindl
2026-06-03 14:33   ` Jan Beulich
2026-06-04  9:43     ` Oleksii Kurochko
2026-06-04  9:55     ` Oleksii Kurochko
2026-06-03 14:27 ` [PATCH v2 2/2] tools/tests: Add regression test for tail buddy growth Bernhard Kaindl

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.