Re: [PATCH v2 12/14] mm/shmem: fix truncate loop after boundary swapin failure

From: Baolin Wang

Date: Wed Oct 28 2026 - 05:02:03 EST




On 10/28/26 4:21 PM, David Hildenbrand (Arm) wrote:
On 10/28/26 02:30, Baolin Wang wrote:


On 10/27/26 9:03 PM, David Hildenbrand (Arm) wrote:
If swapping in a large entry at the new EOF fails, shmem_undo_range()
leaves the entry in place. Its final scan skips the entry, then restarts
from the same start index and finds it again. Truncation can loop forever
while holding i_rwsem.

Right. But ...

Advance start past the skipped entry so that a restarted scan can finish,
as we already do for folios that cannot be split.

IIRC, we originally avoided advancing start because a concurrent swapin fault
could split the boundary large swap entry via shmem_split_large_entry(), leaving
small swap entries below the new start.

Sigh.

There doesn't seem to be a simple fix. We may need to swap in the large entry as
shmem_get_partial_folio() does, and then split the large folio. I'll work on
this as a follow-up.

Thanks!

So you are fine with the patch as is to fix the endless loop?

Yes, let's get this fixed first.

Reviewed-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>