| From 38a62306c4266bcb3cd89e33c7111ee33096ebb3 Mon Sep 17 00:00:00 2001 |
| From: Zhenhao Wan <whi4ed0g@gmail.com> |
| Date: Tue, 11 Aug 2026 16:46:30 +0800 |
| Subject: drm/nouveau/uvmm: clear the dirty flag when unwinding an OP_UNMAP_SPARSE |
| |
| From: Zhenhao Wan <whi4ed0g@gmail.com> |
| |
| commit 38a62306c4266bcb3cd89e33c7111ee33096ebb3 upstream. |
| |
| A successful OP_UNMAP_SPARSE marks its region dirty with |
| nouveau_uvma_region_dirty() and defers the teardown to |
| nouveau_uvmm_bind_job_cleanup(); it does not remove the region from |
| uvmm->region_mt. |
| |
| If a later op in the job fails, the unwind path never clears reg->dirty |
| (set in one place, cleared nowhere) and sets op->reg = NULL, so cleanup |
| skips the teardown. The region is left in the tree with dirty set and its |
| completion never signalled. Later binds over that range then fail |
| permanently -- -ENOENT or -EINVAL from the dirty checks, or an unkillable |
| wait_for_completion() in bind_validate_region() -- for the lifetime of |
| the uvmm. |
| |
| Clear reg->dirty when the unwind reverts the sparse unmap, restoring the |
| region to the state it was found in. |
| |
| Fixes: b88baab82871 ("drm/nouveau: implement new VM_BIND uAPI") |
| Reported-by: Yuhao Jiang <danisjiang@gmail.com> |
| Assisted-by: Claude:claude-opus-5 |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Zhenhao Wan <whi4ed0g@gmail.com> |
| Reviewed-by: Lyude Paul <lyude@redhat.com> |
| Link: https://patch.msgid.link/20260811-nouveau-uvmm-vmbind-fixes-v2-3-aaee4b395d04@gmail.com |
| Signed-off-by: Danilo Krummrich <dakr@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/nouveau/nouveau_uvmm.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/gpu/drm/nouveau/nouveau_uvmm.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_uvmm.c |
| @@ -1407,6 +1407,7 @@ unwind: |
| op->va.range); |
| break; |
| case OP_UNMAP_SPARSE: |
| + op->reg->dirty = false; |
| __nouveau_uvma_region_insert(uvmm, op->reg); |
| nouveau_uvmm_sm_unmap_prepare_unwind(uvmm, &op->new, |
| op->ops); |