[PATCH V2] drm/amdgpu: Fix VM clean check method

Kuehling, Felix Felix.Kuehling at amd.com
Wed May 1 20:44:29 UTC 2019


On 2019-04-30 10:48 a.m., Trigger Huang wrote:
> [CAUTION: External Email]
>
> amdgpu_vm_make_compute is used to turn a GFX VM into a compute VM,
> the prerequisite is this VM is clean. Let's check if some page tables
> are already filled , while not check if some mapping is already made.
>
> Signed-off-by: Trigger Huang <Trigger.Huang at amd.com>

Acked-by: Felix Kuehling <Felix.Kuehling at amd.com>

There is still a potential problem because the CSA is already in the VM. 
If KFD tries to map something at the same virtual address, it will fail. 
It's unlikely to happen with the CSA placed at the very end of the 
virtual address space. On GFXv9 it won't happen because KFD only uses 
the lower half of the virtual address space. On GFXv8 it may happen if a 
KFD process manages to fill up its entire virtual address space.

Regards,
   Felix

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 33 ++++++++++++++++++++++++++++++++-
>   1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 56d838f..bde8bcd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2755,6 +2755,37 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
>   }
>
>   /**
> + * amdgpu_vm_check_clean_reserved - check if a VM is clean
> + *
> + * @adev: amdgpu_device pointer
> + * @vm: the VM to check
> + *
> + * check all entries of the root PD, if any subsequent PDs are allocated,
> + * it means there are page table creating and filling, and is no a clean
> + * VM
> + *
> + * Returns:
> + *     0 if this VM is clean
> + */
> +static int amdgpu_vm_check_clean_reserved(struct amdgpu_device *adev,
> +       struct amdgpu_vm *vm)
> +{
> +       enum amdgpu_vm_level root = adev->vm_manager.root_level;
> +       unsigned int entries = amdgpu_vm_num_entries(adev, root);
> +       unsigned int i = 0;
> +
> +       if (!(vm->root.entries))
> +               return 0;
> +
> +       for (i = 0; i < entries; i++) {
> +               if (vm->root.entries[i].base.bo)
> +                       return -EINVAL;
> +       }
> +
> +       return 0;
> +}
> +
> +/**
>    * amdgpu_vm_make_compute - Turn a GFX VM into a compute VM
>    *
>    * @adev: amdgpu_device pointer
> @@ -2784,7 +2815,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, uns
>                  return r;
>
>          /* Sanity checks */
> -       if (!RB_EMPTY_ROOT(&vm->va.rb_root) || vm->root.entries) {
> +       if (amdgpu_vm_check_clean_reserved(adev, vm)) {
>                  r = -EINVAL;
>                  goto unreserve_bo;
>          }
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list