I'm also still seeing VM faults in the eviction test even with my fix, and even with SDMA page table updates. There is still something else going wrong. :/ Thanks, Felix On 2019-03-12 5:13 p.m., Yang, Philip wrote: > 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