[PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand

Kuehling, Felix Felix.Kuehling at amd.com
Tue Mar 12 23:30:40 UTC 2019


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