On Mon, Jun 29, 2026 at 01:23:24PM +0100, Lorenzo Stoakes wrote:
> Add comments with ASCII diagrams to describe what we're doing, avoid
> dubious use of PHYS_PFN(), and use vma_start_pgoff().
>
> The most complicated scenario represented here is vmg->__adjust_next_start
> - when this is set, vmg->[start, end] actually indicate the range to be
> retained, so take special care to describe this accurately.
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes <[email protected]>
> ---
> mm/vma.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 47 insertions(+), 4 deletions(-)
>
> diff --git a/mm/vma.c b/mm/vma.c
> index 6296acecf3b7..1e99fe8aa6ef 100644
> --- a/mm/vma.c
> +++ b/mm/vma.c
> @@ -704,11 +704,54 @@ static void vmg_adjust_set_range(struct
> vma_merge_struct *vmg)
> pgoff_t pgoff;
>
> if (vmg->__adjust_middle_start) {
> - adjust = vmg->middle;
> - pgoff = adjust->vm_pgoff + PHYS_PFN(vmg->end -
> adjust->vm_start);
> + /*
> + * vmg->start vmg->end
> + * | |
> + * v merge v
> + * <------------->
> + * delta
> + * <------>
> + * |------|----------------|
> + * | prev | middle |
> + * |------|----------------|
> + * ^
> + * |
> + * middle->vm_start
> + */
> + struct vm_area_struct *middle = vmg->middle;
FWIW this can be simplified to
adjust = middle;
const unsigned long delta = vmg->end - adjust->vm_start;
But I guess you're looking for explicitness here?
> + const unsigned long delta = vmg->end - middle->vm_start;
> +
> + pgoff = vma_start_pgoff(middle) + (delta >> PAGE_SHIFT);
> + adjust = middle;
> } else if (vmg->__adjust_next_start) {
> - adjust = vmg->next;
> - pgoff = adjust->vm_pgoff - PHYS_PFN(adjust->vm_start -
> vmg->end);
> + /*
> + * Originally:
> + *
> + * vmg->start vmg->end
> + * | |
> + * v merge v
> + * <------------>
> + * . .
> + * merge_existing_range() updates to:
> + * . .
> + * vmg->start vmg->end .
> + * | | .
> + * v retain v .
> + * <----------> .
> + * delta .
> + * <-----> .
> + * |----------------|------|
> + * | middle | next |
> + * |----------------|------|
> + * ^
> + * |
> + * next->vm_start
> + */
> + struct vm_area_struct *next = vmg->next;
> + const unsigned long delta = next->vm_start - vmg->end;
> +
> + pgoff = vma_start_pgoff(next) - (delta >> PAGE_SHIFT);
> + adjust = next;
> } else {
> return;
> }
Reviewed-by: Pedro Falcato <[email protected]>
--
Pedro