* [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM @ 2026-08-11 8:07 Yifan Zhang 2026-08-11 12:27 ` Christian König 0 siblings, 1 reply; 3+ messages in thread From: Yifan Zhang @ 2026-08-11 8:07 UTC (permalink / raw) To: amd-gfx Cc: Alexander.Deucher, Christian.Koenig, Perry.Yuan, Prerona Ghosh, Yifan Zhang From: Prerona Ghosh <Prerona.Ghosh@amd.com> An imported dma-buf with a dynamic attachment is not bound to GTT until it is validated. In a VM that is not a KFD compute context nothing does that: amdgpu_gem_object_open() only validates and fences imports for compute VMs, and clients submitting through HW queues never go through amdgpu_cs, so amdgpu_vm_validate() does not run either. AMDGPU_GEM_VA then maps the BO while its resource is still TTM_PL_SYSTEM. amdgpu_ttm_tt_pde_flags() drops AMDGPU_PTE_VALID and AMDGPU_PTE_SYSTEM for that memory type, so the range is programmed with PTE flags 0x60 (readable and writeable only) and the first GPU access to it faults: amdgpu 0000:26:00.0: [gfxhub0] retry page fault (src_id:0 ring:0 vmid:3 pasid:46) amdgpu 0000:26:00.0: in page starting at address 0x00007f142d6d8000 from IH client 0x1b (UTCL2) amdgpu 0000:26:00.0: VM_L2_PROTECTION_FAULT_STATUS:0x00301011 amdgpu 0000:26:00.0: Faulty UTCL2 client ID: TCP (0x8) amdgpu 0000:26:00.0: PERMISSION_FAULTS: 0x1 Validate imported BOs into their allowed domains before MAP and REPLACE so that the mapping is always created from a bound resource. Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com> Assisted-by: Claude:opus-5 --- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index f754a4a3a1c2..214ae2a95da2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -747,6 +747,27 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, return r; } +/** + * amdgpu_gem_va_make_resident - bind an imported BO before it gets mapped + * + * @bo: the BO about to be mapped into a VM + * + * Imported dma-bufs with a dynamic attachment stay unbound until they are + * validated. Mapping one while it is still in TTM_PL_SYSTEM would program + * PTEs without AMDGPU_PTE_VALID and any GPU access to them faults. + */ +static int amdgpu_gem_va_make_resident(struct amdgpu_bo *bo) +{ + struct ttm_operation_ctx ctx = { true, false }; + + if (bo->tbo.resource && + bo->tbo.resource->mem_type != TTM_PL_SYSTEM) + return 0; + + amdgpu_bo_placement_from_domain(bo, bo->allowed_domains); + return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); +} + /** * amdgpu_gem_va_update_vm -update the bo_va in its VM * @@ -962,6 +983,14 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, if (r) goto error; + if (abo && drm_gem_is_imported(&abo->tbo.base) && + (args->operation == AMDGPU_VA_OP_MAP || + args->operation == AMDGPU_VA_OP_REPLACE)) { + r = amdgpu_gem_va_make_resident(abo); + if (r) + goto error; + } + switch (args->operation) { case AMDGPU_VA_OP_MAP: r = amdgpu_vm_bo_map(adev, bo_va, args->va_address, -- 2.43.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM 2026-08-11 8:07 [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM Yifan Zhang @ 2026-08-11 12:27 ` Christian König 2026-08-12 7:16 ` Zhang, Yifan 0 siblings, 1 reply; 3+ messages in thread From: Christian König @ 2026-08-11 12:27 UTC (permalink / raw) To: Yifan Zhang, amd-gfx; +Cc: Alexander.Deucher, Perry.Yuan, Prerona Ghosh On 8/11/26 10:07, Yifan Zhang wrote: > From: Prerona Ghosh <Prerona.Ghosh@amd.com> > > An imported dma-buf with a dynamic attachment is not bound to GTT until > it is validated. In a VM that is not a KFD compute context nothing does > that: amdgpu_gem_object_open() only validates and fences imports for > compute VMs, and clients submitting through HW queues never go through > amdgpu_cs, so amdgpu_vm_validate() does not run either. Well that is a good catch, but clear NAK to this hacky workaround. I suggested a long time ago already to change this behavior and validate inside amdgpu_gem_object_open(), IIRC we even had patches for that on the mailing list. Did we accidentally dropped those? Regards, Christian. > > AMDGPU_GEM_VA then maps the BO while its resource is still > TTM_PL_SYSTEM. amdgpu_ttm_tt_pde_flags() drops AMDGPU_PTE_VALID and > AMDGPU_PTE_SYSTEM for that memory type, so the range is programmed with > PTE flags 0x60 (readable and writeable only) and the first GPU access to > it faults: > > amdgpu 0000:26:00.0: [gfxhub0] retry page fault (src_id:0 ring:0 vmid:3 pasid:46) > amdgpu 0000:26:00.0: in page starting at address 0x00007f142d6d8000 from IH client 0x1b (UTCL2) > amdgpu 0000:26:00.0: VM_L2_PROTECTION_FAULT_STATUS:0x00301011 > amdgpu 0000:26:00.0: Faulty UTCL2 client ID: TCP (0x8) > amdgpu 0000:26:00.0: PERMISSION_FAULTS: 0x1 > > Validate imported BOs into their allowed domains before MAP and REPLACE > so that the mapping is always created from a bound resource. > > Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com> > Assisted-by: Claude:opus-5 > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 29 +++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > index f754a4a3a1c2..214ae2a95da2 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > @@ -747,6 +747,27 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, > return r; > } > > +/** > + * amdgpu_gem_va_make_resident - bind an imported BO before it gets mapped > + * > + * @bo: the BO about to be mapped into a VM > + * > + * Imported dma-bufs with a dynamic attachment stay unbound until they are > + * validated. Mapping one while it is still in TTM_PL_SYSTEM would program > + * PTEs without AMDGPU_PTE_VALID and any GPU access to them faults. > + */ > +static int amdgpu_gem_va_make_resident(struct amdgpu_bo *bo) > +{ > + struct ttm_operation_ctx ctx = { true, false }; > + > + if (bo->tbo.resource && > + bo->tbo.resource->mem_type != TTM_PL_SYSTEM) > + return 0; > + > + amdgpu_bo_placement_from_domain(bo, bo->allowed_domains); > + return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); > +} > + > /** > * amdgpu_gem_va_update_vm -update the bo_va in its VM > * > @@ -962,6 +983,14 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, > if (r) > goto error; > > + if (abo && drm_gem_is_imported(&abo->tbo.base) && > + (args->operation == AMDGPU_VA_OP_MAP || > + args->operation == AMDGPU_VA_OP_REPLACE)) { > + r = amdgpu_gem_va_make_resident(abo); > + if (r) > + goto error; > + } > + > switch (args->operation) { > case AMDGPU_VA_OP_MAP: > r = amdgpu_vm_bo_map(adev, bo_va, args->va_address, ^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM 2026-08-11 12:27 ` Christian König @ 2026-08-12 7:16 ` Zhang, Yifan 0 siblings, 0 replies; 3+ messages in thread From: Zhang, Yifan @ 2026-08-12 7:16 UTC (permalink / raw) To: Koenig, Christian, amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander, Yuan, Perry, Ghosh, Prerona AMD General Hi Christian, v3 moves the validation into amdgpu_gem_object_open() as you suggested,so imports are bound once at open time and graphics and compute VMs follow the same rule. I couldn't find the earlier patches you mentioned on the list, so this is a fresh implementation. Please let me know if I missed them. Best Regards, Yifan -----Original Message----- From: Koenig, Christian <Christian.Koenig@amd.com> Sent: Tuesday, August 11, 2026 8:28 PM To: Zhang, Yifan <Yifan1.Zhang@amd.com>; amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander <Alexander.Deucher@amd.com>; Yuan, Perry <Perry.Yuan@amd.com>; Ghosh, Prerona <Prerona.Ghosh@amd.com> Subject: Re: [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM On 8/11/26 10:07, Yifan Zhang wrote: > From: Prerona Ghosh <Prerona.Ghosh@amd.com> > > An imported dma-buf with a dynamic attachment is not bound to GTT > until it is validated. In a VM that is not a KFD compute context > nothing does > that: amdgpu_gem_object_open() only validates and fences imports for > compute VMs, and clients submitting through HW queues never go through > amdgpu_cs, so amdgpu_vm_validate() does not run either. Well that is a good catch, but clear NAK to this hacky workaround. I suggested a long time ago already to change this behavior and validate inside amdgpu_gem_object_open(), IIRC we even had patches for that on the mailing list. Did we accidentally dropped those? Regards, Christian. > > AMDGPU_GEM_VA then maps the BO while its resource is still > TTM_PL_SYSTEM. amdgpu_ttm_tt_pde_flags() drops AMDGPU_PTE_VALID and > AMDGPU_PTE_SYSTEM for that memory type, so the range is programmed > with PTE flags 0x60 (readable and writeable only) and the first GPU > access to it faults: > > amdgpu 0000:26:00.0: [gfxhub0] retry page fault (src_id:0 ring:0 vmid:3 pasid:46) > amdgpu 0000:26:00.0: in page starting at address 0x00007f142d6d8000 from IH client 0x1b (UTCL2) > amdgpu 0000:26:00.0: VM_L2_PROTECTION_FAULT_STATUS:0x00301011 > amdgpu 0000:26:00.0: Faulty UTCL2 client ID: TCP (0x8) > amdgpu 0000:26:00.0: PERMISSION_FAULTS: 0x1 > > Validate imported BOs into their allowed domains before MAP and > REPLACE so that the mapping is always created from a bound resource. > > Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com> > Assisted-by: Claude:opus-5 > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 29 > +++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > index f754a4a3a1c2..214ae2a95da2 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c > @@ -747,6 +747,27 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, > return r; > } > > +/** > + * amdgpu_gem_va_make_resident - bind an imported BO before it gets > +mapped > + * > + * @bo: the BO about to be mapped into a VM > + * > + * Imported dma-bufs with a dynamic attachment stay unbound until > +they are > + * validated. Mapping one while it is still in TTM_PL_SYSTEM would > +program > + * PTEs without AMDGPU_PTE_VALID and any GPU access to them faults. > + */ > +static int amdgpu_gem_va_make_resident(struct amdgpu_bo *bo) { > + struct ttm_operation_ctx ctx = { true, false }; > + > + if (bo->tbo.resource && > + bo->tbo.resource->mem_type != TTM_PL_SYSTEM) > + return 0; > + > + amdgpu_bo_placement_from_domain(bo, bo->allowed_domains); > + return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); } > + > /** > * amdgpu_gem_va_update_vm -update the bo_va in its VM > * > @@ -962,6 +983,14 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, > if (r) > goto error; > > + if (abo && drm_gem_is_imported(&abo->tbo.base) && > + (args->operation == AMDGPU_VA_OP_MAP || > + args->operation == AMDGPU_VA_OP_REPLACE)) { > + r = amdgpu_gem_va_make_resident(abo); > + if (r) > + goto error; > + } > + > switch (args->operation) { > case AMDGPU_VA_OP_MAP: > r = amdgpu_vm_bo_map(adev, bo_va, args->va_address, ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-12 7:16 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-11 8:07 [PATCH v2] drm/amdgpu: bind imported BOs before mapping them into a VM Yifan Zhang 2026-08-11 12:27 ` Christian König 2026-08-12 7:16 ` Zhang, Yifan
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.