On 7/10/26 22:16, 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.
> 
> Reviewed-by: Pedro Falcato <[email protected]>
> Reviewed-by: Gregory Price <[email protected]>
> Signed-off-by: Lorenzo Stoakes <[email protected]>

Reviewed-by: Vlastimil Babka (SUSE) <[email protected]>

> ---
>  mm/vma.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 47 insertions(+), 4 deletions(-)
> 
> diff --git a/mm/vma.c b/mm/vma.c
> index 084afdf37385..7265a054cfa3 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;
> +             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;
>       }
> 

Reply via email to