vm fault happens about 1/10 for KFDCWSRTest.BasicTest for me. I am using SDMA for page table update. I don't try CPU page table update. Philip On 2019-03-12 11:12 a.m., Russell, Kent wrote: > Peculiar, I hit it immediately when I ran it . Can you try use --gtest_filter=KFDCWSRTest.BasicTest . That one hung every time for me. > > Kent > >> -----Original Message----- >> From: Christian König <ckoenig.leichtzumerken@xxxxxxxxx> >> Sent: Tuesday, March 12, 2019 11:09 AM >> To: Russell, Kent <Kent.Russell@xxxxxxx>; Koenig, Christian >> <Christian.Koenig@xxxxxxx>; Kuehling, Felix <Felix.Kuehling@xxxxxxx>; >> amd-gfx@xxxxxxxxxxxxxxxxxxxxx >> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand >> >> Yeah, same problem here. >> >> I removed libhsakmt package and installed it manually and now it seems to >> work. >> >> Doing some testing now, but at least of hand I can't seem to reproduce the >> VM fault on a Vega10. >> >> Christian. >> >> Am 12.03.19 um 16:01 schrieb Russell, Kent: >>> Oh right, I remember that issue. I had that happen to me once, where my >> installed libhsakmt didn't match up with the latest source code, so I ended up >> having to remove the libhsakmt package and pointing it to the folders >> instead. >>> >>> Kent >>> >>>> -----Original Message----- >>>> From: Koenig, Christian >>>> Sent: Tuesday, March 12, 2019 10:49 AM >>>> To: Russell, Kent <Kent.Russell@xxxxxxx>; Kuehling, Felix >>>> <Felix.Kuehling@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx >>>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand >>>> >>>> Yeah, the problem is I do have the libhsakmt installed. >>>> >>>> Going to give it a try to specify the directory directly. >>>> >>>> Christian. >>>> >>>> Am 12.03.19 um 15:47 schrieb Russell, Kent: >>>>> The README.txt file inside the tests/kfdtest folder has instructions >>>>> on how >>>> to do it if you don't have the libhsakmt package installed on your system: >>>>> export LIBHSAKMT_PATH=/*your local libhsakmt folder*/ With that, the >>>>> headers and libraries are searched under LIBHSAKMT_PATH/include and >>>>> LIBHSAKMT_PATH/lib respectively. >>>>> >>>>> So if you try export LIBHSAKMT_PATH as the root ROCT folder (the one >>>> containing include, src, tests, etc), then that should cover it. >>>>> Kent >>>>> >>>>> >>>>>> -----Original Message----- >>>>>> From: Christian König <ckoenig.leichtzumerken@xxxxxxxxx> >>>>>> Sent: Tuesday, March 12, 2019 9:13 AM >>>>>> To: Russell, Kent <Kent.Russell@xxxxxxx>; Kuehling, Felix >>>>>> <Felix.Kuehling@xxxxxxx>; Koenig, Christian >>>>>> <Christian.Koenig@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx >>>>>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on >> demand >>>>>> >>>>>> Hi guys, >>>>>> >>>>>> so found a few minutes today to compile kfdtest. >>>>>> >>>>>> Problem is that during the compile I get a lots of this: >>>>>>> CMakeFiles/kfdtest.dir/src/BaseQueue.cpp.o: In Funktion >>>>>>> »BaseQueue::Create(unsigned int, unsigned int, unsigned long*)«: >>>>>>> /usr/src/ROCT-Thunk-Interface/tests/kfdtest/src/BaseQueue.cpp:57: >>>>>>> Warnung: undefinierter Verweis auf »hsaKmtCreateQueue« >>>>>> Any idea? >>>>>> >>>>>> Christian. >>>>>> >>>>>> Am 11.03.19 um 17:55 schrieb Christian König: >>>>>>> Hi guys, >>>>>>> >>>>>>> well it's most likely some missing handling in the KFD, so I'm >>>>>>> rather reluctant to revert the change immediately. >>>>>>> >>>>>>> Problem is that I don't have time right now to look into it >>>>>>> immediately. So Kent can you continue to take a look? >>>>>>> >>>>>>> Sounds like its crashing immediately, so it should be something >> obvious. >>>>>>> >>>>>>> Christian. >>>>>>> >>>>>>> Am 11.03.19 um 10:49 schrieb Russell, Kent: >>>>>>>> From what I've been able to dig through, the VM Fault seems to >>>>>>>> occur right after a doorbell mmap, but that's as far as I got. I >>>>>>>> can try to revert it in today's merge and see how things go. >>>>>>>> >>>>>>>> Kent >>>>>>>> >>>>>>>>> -----Original Message----- >>>>>>>>> From: Kuehling, Felix >>>>>>>>> Sent: Friday, March 08, 2019 11:16 PM >>>>>>>>> To: Koenig, Christian <Christian.Koenig@xxxxxxx>; Russell, Kent >>>>>>>>> <Kent.Russell@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx >>>>>>>>> Subject: RE: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on >>>> demand >>>>>>>>> My concerns were related to eviction fence handing. It would >>>>>>>>> manifest by unnecessary eviction callbacks into KFD that aren't >>>>>>>>> cause by real evictions. I addressed that with a previous patch >>>>>>>>> series that removed the need to remove eviction fences and add >>>>>>>>> them back around page table updates in >> amdgpu_amdkfd_gpuvm.c. >>>>>>>>> >>>>>>>>> I don't know what's going on here. I can probably take a look on >>>>>>>>> Monday. I haven't considered what changed with respect to PD >>>>>>>>> updates. >>>>>>>>> >>>>>>>>> Kent, can we temporarily revert the offending change in >>>>>>>>> amd-kfd-staging just to unblock the merge? >>>>>>>>> >>>>>>>>> Christian, I think KFD is currently broken on amd-staging-drm-next. >>>>>>>>> If we're >>>>>>>>> serious about supporting KFD upstream, you may also want to >>>>>>>>> consider reverting your change there for now. Also consider >>>>>>>>> building the Thunk and kfdtest so you can do quick smoke tests >>>>>>>>> locally whenever you make amdgpu_vm changes that can affect >> KFD. >>>>>>>>> https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Felix >>>>>>>>> >>>>>>>>> -----Original Message----- >>>>>>>>> From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On >> Behalf >>>> Of >>>>>>>>> Christian König >>>>>>>>> Sent: Friday, March 08, 2019 9:14 AM >>>>>>>>> To: Russell, Kent <Kent.Russell@xxxxxxx>; >>>>>>>>> amd-gfx@xxxxxxxxxxxxxxxxxxxxx >>>>>>>>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on >>>> demand >>>>>>>>> My best guess is that we forget somewhere to update the PDs. >>>>>>>>> What hardware is that on? >>>>>>>>> >>>>>>>>> Felix already mentioned that this could be problematic for the KFD. >>>>>>>>> >>>>>>>>> Maybe he has an idea, >>>>>>>>> Christian. >>>>>>>>> >>>>>>>>> Am 08.03.19 um 15:04 schrieb Russell, Kent: >>>>>>>>>> Hi Christian, >>>>>>>>>> >>>>>>>>>> This patch ended up causing a VM Fault in KFDTest. Reverting >>>>>>>>>> just this >>>>>>>>> patch addressed the issue: >>>>>>>>>> [ 82.703503] amdgpu 0000:0c:00.0: GPU fault detected: 146 >>>>>>>>>> 0x0000480c for >>>>>>>>> process pid 0 thread pid 0 >>>>>>>>>> [ 82.703512] amdgpu 0000:0c:00.0: >>>>>>>>> VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x00001000 >>>>>>>>>> [ 82.703516] amdgpu 0000:0c:00.0: >>>>>>>>> VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x1004800C >>>>>>>>>> [ 82.703522] amdgpu 0000:0c:00.0: VM fault (0x0c, vmid 8, >>>>>>>>>> pasid >>>>>>>>>> 32769) at >>>>>>>>> page 4096, read from 'TC0' (0x54433000) (72) >>>>>>>>>> [ 82.703585] Evicting PASID 32769 queues >>>>>>>>>> >>>>>>>>>> I am looking into it, but if you have any insight that would be >>>>>>>>>> great in >>>>>>>>> helping to resolve it quickly. >>>>>>>>>> Kent >>>>>>>>>>> -----Original Message----- >>>>>>>>>>> From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On >>>> Behalf >>>>>> Of >>>>>>>>>>> Christian König >>>>>>>>>>> Sent: Tuesday, February 26, 2019 7:47 AM >>>>>>>>>>> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx >>>>>>>>>>> Subject: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on >>>> demand >>>>>>>>>>> Let's start to allocate VM PDs/PTs on demand instead of >>>>>>>>>>> pre-allocating them during mapping. >>>>>>>>>>> >>>>>>>>>>> Signed-off-by: Christian König <christian.koenig@xxxxxxx> >>>>>>>>>>> Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> >>>>>>>>>>> --- >>>>>>>>>>> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 10 >> +- >>>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c | 9 -- >>>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 10 -- >>>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 136 >>>>>>>>>>> +++++------------ >>>>>>>>> - >>>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 3 - >>>>>>>>>>> 5 files changed, 39 insertions(+), 129 deletions(-) >>>>>>>>>>> >>>>>>>>>>> diff --git >>>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >>>>>>>>>>> index 31e3953dcb6e..088e9b6b765b 100644 >>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >>>>>>>>>>> +++ >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c >>>>>>>>>>> @@ -410,15 +410,7 @@ static int add_bo_to_vm(struct >>>>>> amdgpu_device >>>>>>>>>>> *adev, struct kgd_mem *mem, >>>>>>>>>>> if (p_bo_va_entry) >>>>>>>>>>> *p_bo_va_entry = bo_va_entry; >>>>>>>>>>> >>>>>>>>>>> - /* Allocate new page tables if needed and validate >>>>>>>>>>> - * them. >>>>>>>>>>> - */ >>>>>>>>>>> - ret = amdgpu_vm_alloc_pts(adev, vm, va, >>>>>>>>>>> amdgpu_bo_size(bo)); >>>>>>>>>>> - if (ret) { >>>>>>>>>>> - pr_err("Failed to allocate pts, err=%d\n", ret); >>>>>>>>>>> - goto err_alloc_pts; >>>>>>>>>>> - } >>>>>>>>>>> - >>>>>>>>>>> + /* Allocate validate page tables if needed */ >>>>>>>>>>> ret = vm_validate_pt_pd_bos(vm); >>>>>>>>>>> if (ret) { >>>>>>>>>>> pr_err("validate_pt_pd_bos() failed\n"); diff >>>>>>>>>>> --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c >>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c >>>>>>>>>>> index 7e22be7ca68a..54dd02a898b9 100644 >>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c >>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c >>>>>>>>>>> @@ -92,15 +92,6 @@ int amdgpu_map_static_csa(struct >>>>>> amdgpu_device >>>>>>>>>>> *adev, struct amdgpu_vm *vm, >>>>>>>>>>> return -ENOMEM; >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> - r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, >>>>>>>>>>> csa_addr, >>>>>>>>>>> - size); >>>>>>>>>>> - if (r) { >>>>>>>>>>> - DRM_ERROR("failed to allocate pts for static CSA, >>>>>>>>>>> err=%d\n", r); >>>>>>>>>>> - amdgpu_vm_bo_rmv(adev, *bo_va); >>>>>>>>>>> - ttm_eu_backoff_reservation(&ticket, &list); >>>>>>>>>>> - return r; >>>>>>>>>>> - } >>>>>>>>>>> - >>>>>>>>>>> r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size, >>>>>>>>>>> AMDGPU_PTE_READABLE | >>>>>>>>>>> AMDGPU_PTE_WRITEABLE >>>>>>>>>>> | >>>>>>>>>>> AMDGPU_PTE_EXECUTABLE); diff --git >>>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c >>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c >>>>>>>>>>> index 555285e329ed..fcaaac30e84b 100644 >>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c >>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c >>>>>>>>>>> @@ -625,11 +625,6 @@ int amdgpu_gem_va_ioctl(struct >>>> drm_device >>>>>>>>> *dev, >>>>>>>>>>> void *data, >>>>>>>>>>> >>>>>>>>>>> switch (args->operation) { >>>>>>>>>>> case AMDGPU_VA_OP_MAP: >>>>>>>>>>> - r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args- >>>>>>>>>>>> va_address, >>>>>>>>>>> - args->map_size); >>>>>>>>>>> - if (r) >>>>>>>>>>> - goto error_backoff; >>>>>>>>>>> - >>>>>>>>>>> va_flags = amdgpu_gmc_get_pte_flags(adev, >>>>>>>>>>> args->flags); >>>>>>>>>>> r = amdgpu_vm_bo_map(adev, bo_va, args->va_address, >>>>>>>>>>> args->offset_in_bo, args->map_size, >>>>>>>>>>> @@ >>>>>>>>>>> - >>>>>>>>>>> 645,11 +640,6 @@ int amdgpu_gem_va_ioctl(struct drm_device >>>> *dev, >>>>>>>>> void >>>>>>>>>>> *data, >>>>>>>>>>> args->map_size); >>>>>>>>>>> break; >>>>>>>>>>> case AMDGPU_VA_OP_REPLACE: >>>>>>>>>>> - r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args- >>>>>>>>>>>> va_address, >>>>>>>>>>> - args->map_size); >>>>>>>>>>> - if (r) >>>>>>>>>>> - goto error_backoff; >>>>>>>>>>> - >>>>>>>>>>> va_flags = amdgpu_gmc_get_pte_flags(adev, >>>>>>>>>>> args->flags); >>>>>>>>>>> r = amdgpu_vm_bo_replace_map(adev, bo_va, args- >>>>>>>>>>>> va_address, >>>>>>>>>>> args->offset_in_bo, args- >>>>>>>>>>>> map_size, diff --git >>>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>>>>>>>>>> index 362436f4e856..dfad543fc000 100644 >>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c >>>>>>>>>>> @@ -504,47 +504,6 @@ static void amdgpu_vm_pt_next(struct >>>>>>>>>>> amdgpu_device *adev, >>>>>>>>>>> } >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> -/** >>>>>>>>>>> - * amdgpu_vm_pt_first_leaf - get first leaf PD/PT >>>>>>>>>>> - * >>>>>>>>>>> - * @adev: amdgpu_device pointer >>>>>>>>>>> - * @vm: amdgpu_vm structure >>>>>>>>>>> - * @start: start addr of the walk >>>>>>>>>>> - * @cursor: state to initialize >>>>>>>>>>> - * >>>>>>>>>>> - * Start a walk and go directly to the leaf node. >>>>>>>>>>> - */ >>>>>>>>>>> -static void amdgpu_vm_pt_first_leaf(struct amdgpu_device >>>> *adev, >>>>>>>>>>> - struct amdgpu_vm *vm, uint64_t start, >>>>>>>>>>> - struct amdgpu_vm_pt_cursor *cursor) -{ >>>>>>>>>>> - amdgpu_vm_pt_start(adev, vm, start, cursor); >>>>>>>>>>> - while (amdgpu_vm_pt_descendant(adev, cursor)); -} >>>>>>>>>>> - >>>>>>>>>>> -/** >>>>>>>>>>> - * amdgpu_vm_pt_next_leaf - get next leaf PD/PT >>>>>>>>>>> - * >>>>>>>>>>> - * @adev: amdgpu_device pointer >>>>>>>>>>> - * @cursor: current state >>>>>>>>>>> - * >>>>>>>>>>> - * Walk the PD/PT tree to the next leaf node. >>>>>>>>>>> - */ >>>>>>>>>>> -static void amdgpu_vm_pt_next_leaf(struct amdgpu_device >>>> *adev, >>>>>>>>>>> - struct amdgpu_vm_pt_cursor *cursor) -{ >>>>>>>>>>> - amdgpu_vm_pt_next(adev, cursor); >>>>>>>>>>> - if (cursor->pfn != ~0ll) >>>>>>>>>>> - while (amdgpu_vm_pt_descendant(adev, cursor)); -} >>>>>>>>>>> - >>>>>>>>>>> -/** >>>>>>>>>>> - * for_each_amdgpu_vm_pt_leaf - walk over all leaf PDs/PTs in >>>>>>>>>>> the hierarchy >>>>>>>>>>> - */ >>>>>>>>>>> -#define for_each_amdgpu_vm_pt_leaf(adev, vm, start, end, >>>>>>>>>>> cursor) >>>>>>>>>>> \ >>>>>>>>>>> - for (amdgpu_vm_pt_first_leaf((adev), (vm), (start), >>>>>>>>>>> &(cursor)); >>>>>>>>>>> \ >>>>>>>>>>> - (cursor).pfn <= end; amdgpu_vm_pt_next_leaf((adev), >>>>>>>>>>> &(cursor))) >>>>>>>>>>> - >>>>>>>>>>> /** >>>>>>>>>>> * amdgpu_vm_pt_first_dfs - start a deep first search >>>>>>>>>>> * >>>>>>>>>>> @@ -915,74 +874,51 @@ static void >> amdgpu_vm_bo_param(struct >>>>>>>>>>> amdgpu_device *adev, struct amdgpu_vm *vm, >>>>>>>>>>> * Returns: >>>>>>>>>>> * 0 on success, errno otherwise. >>>>>>>>>>> */ >>>>>>>>>>> -int amdgpu_vm_alloc_pts(struct amdgpu_device *adev, >>>>>>>>>>> - struct amdgpu_vm *vm, >>>>>>>>>>> - uint64_t saddr, uint64_t size) >>>>>>>>>>> +static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev, >>>>>>>>>>> + struct amdgpu_vm *vm, >>>>>>>>>>> + struct amdgpu_vm_pt_cursor *cursor) >>>>>>>>>>> { >>>>>>>>>>> - struct amdgpu_vm_pt_cursor cursor; >>>>>>>>>>> + struct amdgpu_vm_pt *entry = cursor->entry; >>>>>>>>>>> + struct amdgpu_bo_param bp; >>>>>>>>>>> struct amdgpu_bo *pt; >>>>>>>>>>> - uint64_t eaddr; >>>>>>>>>>> int r; >>>>>>>>>>> >>>>>>>>>>> - /* validate the parameters */ >>>>>>>>>>> - if (saddr & AMDGPU_GPU_PAGE_MASK || size & >>>>>>>>>>> AMDGPU_GPU_PAGE_MASK) >>>>>>>>>>> - return -EINVAL; >>>>>>>>>>> + if (cursor->level < AMDGPU_VM_PTB && !entry->entries) { >>>>>>>>>>> + unsigned num_entries; >>>>>>>>>>> >>>>>>>>>>> - eaddr = saddr + size - 1; >>>>>>>>>>> - >>>>>>>>>>> - saddr /= AMDGPU_GPU_PAGE_SIZE; >>>>>>>>>>> - eaddr /= AMDGPU_GPU_PAGE_SIZE; >>>>>>>>>>> - >>>>>>>>>>> - if (eaddr >= adev->vm_manager.max_pfn) { >>>>>>>>>>> - dev_err(adev->dev, "va above limit (0x%08llX >= >>>>>>>>>>> 0x%08llX)\n", >>>>>>>>>>> - eaddr, adev->vm_manager.max_pfn); >>>>>>>>>>> - return -EINVAL; >>>>>>>>>>> + num_entries = amdgpu_vm_num_entries(adev, cursor- >>>>>>>>>>>> level); >>>>>>>>>>> + entry->entries = kvmalloc_array(num_entries, >>>>>>>>>>> + sizeof(*entry->entries), >>>>>>>>>>> + GFP_KERNEL | __GFP_ZERO); >>>>>>>>>>> + if (!entry->entries) >>>>>>>>>>> + return -ENOMEM; >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> - for_each_amdgpu_vm_pt_leaf(adev, vm, saddr, eaddr, >>>>>>>>>>> cursor) { >>>>>>>>>>> - struct amdgpu_vm_pt *entry = cursor.entry; >>>>>>>>>>> - struct amdgpu_bo_param bp; >>>>>>>>>>> - >>>>>>>>>>> - if (cursor.level < AMDGPU_VM_PTB) { >>>>>>>>>>> - unsigned num_entries; >>>>>>>>>>> - >>>>>>>>>>> - num_entries = amdgpu_vm_num_entries(adev, >>>>>>>>>>> cursor.level); >>>>>>>>>>> - entry->entries = kvmalloc_array(num_entries, >>>>>>>>>>> - sizeof(*entry- >>>>>>>>>>>> entries), >>>>>>>>>>> - GFP_KERNEL | >>>>>>>>>>> - __GFP_ZERO); >>>>>>>>>>> - if (!entry->entries) >>>>>>>>>>> - return -ENOMEM; >>>>>>>>>>> - } >>>>>>>>>>> - >>>>>>>>>>> - >>>>>>>>>>> - if (entry->base.bo) >>>>>>>>>>> - continue; >>>>>>>>>>> - >>>>>>>>>>> - amdgpu_vm_bo_param(adev, vm, cursor.level, &bp); >>>>>>>>>>> - >>>>>>>>>>> - r = amdgpu_bo_create(adev, &bp, &pt); >>>>>>>>>>> - if (r) >>>>>>>>>>> - return r; >>>>>>>>>>> - >>>>>>>>>>> - if (vm->use_cpu_for_update) { >>>>>>>>>>> - r = amdgpu_bo_kmap(pt, NULL); >>>>>>>>>>> - if (r) >>>>>>>>>>> - goto error_free_pt; >>>>>>>>>>> - } >>>>>>>>>>> + if (entry->base.bo) >>>>>>>>>>> + return 0; >>>>>>>>>>> >>>>>>>>>>> - /* Keep a reference to the root directory to avoid >>>>>>>>>>> - * freeing them up in the wrong order. >>>>>>>>>>> - */ >>>>>>>>>>> - pt->parent = amdgpu_bo_ref(cursor.parent->base.bo); >>>>>>>>>>> + amdgpu_vm_bo_param(adev, vm, cursor->level, &bp); >>>>>>>>>>> >>>>>>>>>>> - amdgpu_vm_bo_base_init(&entry->base, vm, pt); >>>>>>>>>>> + r = amdgpu_bo_create(adev, &bp, &pt); >>>>>>>>>>> + if (r) >>>>>>>>>>> + return r; >>>>>>>>>>> >>>>>>>>>>> - r = amdgpu_vm_clear_bo(adev, vm, pt); >>>>>>>>>>> + if (vm->use_cpu_for_update) { >>>>>>>>>>> + r = amdgpu_bo_kmap(pt, NULL); >>>>>>>>>>> if (r) >>>>>>>>>>> goto error_free_pt; >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> + /* Keep a reference to the root directory to avoid >>>>>>>>>>> + * freeing them up in the wrong order. >>>>>>>>>>> + */ >>>>>>>>>>> + pt->parent = amdgpu_bo_ref(cursor->parent->base.bo); >>>>>>>>>>> + amdgpu_vm_bo_base_init(&entry->base, vm, pt); >>>>>>>>>>> + >>>>>>>>>>> + r = amdgpu_vm_clear_bo(adev, vm, pt); >>>>>>>>>>> + if (r) >>>>>>>>>>> + goto error_free_pt; >>>>>>>>>>> + >>>>>>>>>>> return 0; >>>>>>>>>>> >>>>>>>>>>> error_free_pt: >>>>>>>>>>> @@ -1627,6 +1563,7 @@ static int >>>> amdgpu_vm_update_ptes(struct >>>>>>>>>>> amdgpu_pte_update_params *params, >>>>>>>>>>> struct amdgpu_vm_pt_cursor cursor; >>>>>>>>>>> uint64_t frag_start = start, frag_end; >>>>>>>>>>> unsigned int frag; >>>>>>>>>>> + int r; >>>>>>>>>>> >>>>>>>>>>> /* figure out the initial fragment */ >>>>>>>>>>> amdgpu_vm_fragment(params, frag_start, end, flags, >>>>>>>>>>> &frag, &frag_end); @@ -1634,12 +1571,15 @@ static int >>>>>>>>>>> amdgpu_vm_update_ptes(struct amdgpu_pte_update_params >>>>>> *params, >>>>>>>>>>> /* walk over the address space and update the PTs */ >>>>>>>>>>> amdgpu_vm_pt_start(adev, params->vm, start, &cursor); >>>>>>>>>>> while (cursor.pfn < end) { >>>>>>>>>>> - struct amdgpu_bo *pt = cursor.entry->base.bo; >>>>>>>>>>> unsigned shift, parent_shift, mask; >>>>>>>>>>> uint64_t incr, entry_end, pe_start; >>>>>>>>>>> + struct amdgpu_bo *pt; >>>>>>>>>>> >>>>>>>>>>> - if (!pt) >>>>>>>>>>> - return -ENOENT; >>>>>>>>>>> + r = amdgpu_vm_alloc_pts(params->adev, params->vm, >>>>>>>>>>> &cursor); >>>>>>>>>>> + if (r) >>>>>>>>>>> + return r; >>>>>>>>>>> + >>>>>>>>>>> + pt = cursor.entry->base.bo; >>>>>>>>>>> >>>>>>>>>>> /* The root level can't be a huge page */ >>>>>>>>>>> if (cursor.level == adev->vm_manager.root_level) >>>>>>>>>>> { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h >>>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h >>>>>>>>>>> index 81ff8177f092..116605c038d2 100644 >>>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h >>>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h >>>>>>>>>>> @@ -303,9 +303,6 @@ bool amdgpu_vm_ready(struct >> amdgpu_vm >>>>>> *vm); >>>>>>>>> int >>>>>>>>>>> amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, >> struct >>>>>>>>>>> amdgpu_vm *vm, >>>>>>>>>>> int (*callback)(void *p, struct >>>>>>>>>>> amdgpu_bo *bo), >>>>>>>>>>> void *param); -int >>>>>>>>>>> amdgpu_vm_alloc_pts(struct amdgpu_device *adev, >>>>>>>>>>> - struct amdgpu_vm *vm, >>>>>>>>>>> - uint64_t saddr, uint64_t size); >>>>>>>>>>> int amdgpu_vm_flush(struct amdgpu_ring *ring, struct >>>>>>>>>>> amdgpu_job *job, bool need_pipe_sync); int >>>>>>>>>>> amdgpu_vm_update_directories(struct >>>>>>>>>>> amdgpu_device *adev, >>>>>>>>>>> struct amdgpu_vm *vm); >>>>>>>>>>> -- >>>>>>>>>>> 2.17.1 >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> 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 >>>>>>>> _______________________________________________ >>>>>>>> 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 > > _______________________________________________ > 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