[PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand
Russell, Kent
Kent.Russell at amd.com
Wed Mar 13 10:52:46 UTC 2019
Fantastic, I'm integrating it now. Fingers crossed!
Kent
> -----Original Message-----
> From: Kuehling, Felix
> Sent: Tuesday, March 12, 2019 7:31 PM
> To: Yang, Philip <Philip.Yang at amd.com>; Russell, Kent
> <Kent.Russell at amd.com>; Koenig, Christian <Christian.Koenig at amd.com>;
> amd-gfx at lists.freedesktop.org
> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand
>
> Never mind. I must have messed up my build. I can't reproduce the problem
> any more. The patch I sent out is still needed and valid. AFAICT it should be all
> that's needed to fix GPUVM for KFD.
>
> I have not seen any faults with KFDCWSRTest.BasicTest on my system with
> Fiji or Vega10 with that patch applied.
>
> Regards,
> Felix
>
> On 2019-03-12 5:19 p.m., Felix Kuehling wrote:
> > 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 at gmail.com>
> >>>> Sent: Tuesday, March 12, 2019 11:09 AM
> >>>> To: Russell, Kent <Kent.Russell at amd.com>; Koenig, Christian
> >>>> <Christian.Koenig at amd.com>; Kuehling, Felix
> >>>> <Felix.Kuehling at amd.com>; amd-gfx at lists.freedesktop.org
> >>>> 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 at amd.com>; Kuehling, Felix
> >>>>>> <Felix.Kuehling at amd.com>; amd-gfx at lists.freedesktop.org
> >>>>>> 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 at gmail.com>
> >>>>>>>> Sent: Tuesday, March 12, 2019 9:13 AM
> >>>>>>>> To: Russell, Kent <Kent.Russell at amd.com>; Kuehling, Felix
> >>>>>>>> <Felix.Kuehling at amd.com>; Koenig, Christian
> >>>>>>>> <Christian.Koenig at amd.com>; amd-gfx at lists.freedesktop.org
> >>>>>>>> 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 at amd.com>; Russell,
> >>>>>>>>>>> Kent <Kent.Russell at amd.com>; amd-
> gfx at lists.freedesktop.org
> >>>>>>>>>>> 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 at lists.freedesktop.org> On
> >>>> Behalf
> >>>>>> Of
> >>>>>>>>>>> Christian König
> >>>>>>>>>>> Sent: Friday, March 08, 2019 9:14 AM
> >>>>>>>>>>> To: Russell, Kent <Kent.Russell at amd.com>;
> >>>>>>>>>>> amd-gfx at lists.freedesktop.org
> >>>>>>>>>>> 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 at lists.freedesktop.org>
> On
> >>>>>> Behalf
> >>>>>>>> Of
> >>>>>>>>>>>>> Christian König
> >>>>>>>>>>>>> Sent: Tuesday, February 26, 2019 7:47 AM
> >>>>>>>>>>>>> To: amd-gfx at lists.freedesktop.org
> >>>>>>>>>>>>> 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 at amd.com>
> >>>>>>>>>>>>> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> >>>>>>>>>>>>> ---
> >>>>>>>>>>>>> .../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 at lists.freedesktop.org
> >>>>>>>>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> >>>>>>>>>>> _______________________________________________
> >>>>>>>>>>> amd-gfx mailing list
> >>>>>>>>>>> amd-gfx at lists.freedesktop.org
> >>>>>>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> >>>>>>>>>> _______________________________________________
> >>>>>>>>>> amd-gfx mailing list
> >>>>>>>>>> amd-gfx at lists.freedesktop.org
> >>>>>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> >>>>> _______________________________________________
> >>>>> amd-gfx mailing list
> >>>>> amd-gfx at lists.freedesktop.org
> >>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> >>> _______________________________________________
> >>> 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