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@xxxxxxx> Acked-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> 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@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx