Re: [PATCH 1/2] drm/panthor: Extend VM locked region for remap case to be a superset

From: Boris Brezillon

Date: Tue Apr 07 2026 - 03:00:36 EST


On Fri, 3 Apr 2026 18:21:11 +0100
Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx> wrote:

> In the event of an sm_step_remap() that leads to a partial unmap of a
> transparent huge page, the new locked region required by an extended unmap
> might not be a superset of the original one. Then, if it leaves a portion
> of the initially requested one out, the ensuing map will trigger a warning.
>
> Signed-off-by: Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx>
> Fixes: 8e7460eac786 ("drm/panthor: Support partial unmaps of huge pages")

Reviewed-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>

One suggestion below.

> ---
> drivers/gpu/drm/panthor/panthor_mmu.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
> index fa8b31df85c9..2b96359d3b94 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -1709,6 +1709,19 @@ static int panthor_vm_lock_region(struct panthor_vm *vm, u64 start, u64 size)
> start + size <= vm->locked_region.start + vm->locked_region.size)
> return 0;
>
> + /* sm_step_remap() may need a locked region that isn't a strict superset
> + * of the original one because of having to extend unmap boundaries beyond
> + * it to deal with partial unmaps of transparent huge pages. What we want
> + * in those cases is to lock the union of both regions.
> + */
> + if (vm->locked_region.size) {
> + u64 end = start + size;
> +
> + start = min(start, vm->locked_region.start);
> + size = max(vm->locked_region.start +
> + vm->locked_region.size, end) - start;

I'd probably go:

u64 end = max(vm->locked_region.start + vm->locked_region.size,
start + size);

start = min(start, vm->locked_region.start);
size = end - start;

> + }
> +
> mutex_lock(&ptdev->mmu->as.slots_lock);
> if (vm->as.id >= 0 && size) {
> /* Lock the region that needs to be updated */
>
> base-commit: fb42964e2a76f68a5fb581d382b5d2be2d5bda9b