[PATCH 4/4] drm/amdgpu: simplify huge page handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2018å¹´01æ??03æ?¥ 17:24, Christian König wrote:
> Am 03.01.2018 um 09:29 schrieb Chunming Zhou:
>>
>>
>> On 2018å¹´01æ??02æ?¥ 22:47, Christian König wrote:
>>> Update the PDEs after resetting the huge flag.
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 60 
>>> ++++++++++------------------------
>>>   1 file changed, 18 insertions(+), 42 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> index c1c5ccdee783..81505870eebc 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> @@ -946,54 +946,38 @@ static void amdgpu_vm_handle_huge_pages(struct 
>>> amdgpu_pte_update_params *p,
>>>                       unsigned nptes, uint64_t dst,
>>>                       uint64_t flags)
>>>   {
>>> -    bool use_cpu_update = (p->func == amdgpu_vm_cpu_set_ptes);
>>>       uint64_t pd_addr, pde;
>>>         /* In the case of a mixed PT the PDE must point to it*/
>>> -    if (p->adev->asic_type < CHIP_VEGA10 || p->src ||
>>> -        nptes != AMDGPU_VM_PTE_COUNT(p->adev)) {
>>> -        dst = amdgpu_bo_gpu_offset(entry->base.bo);
>>> -        flags = AMDGPU_PTE_VALID;
>>> -    } else {
>>> +    if (p->adev->asic_type >= CHIP_VEGA10 && !p->src &&
>>> +        nptes == AMDGPU_VM_PTE_COUNT(p->adev)) {
>>>           /* Set the huge page flag to stop scanning at this PDE */
>>>           flags |= AMDGPU_PDE_PTE;
>>>       }
>>>   -    if (!entry->huge && !(flags & AMDGPU_PDE_PTE))
>>> +    if (!(flags & AMDGPU_PDE_PTE)) {
>>> +        if (entry->huge) {
>>> +            /* Add the entry to the relocated list to update it. */
>>> +            entry->huge = false;
>>> +            spin_lock(&p->vm->status_lock);
>>> +            list_move(&entry->base.vm_status, &p->vm->relocated);
>>> +            spin_unlock(&p->vm->status_lock);
>>> +        }
>>>           return;
>>> -    entry->huge = !!(flags & AMDGPU_PDE_PTE);
>>> +    }
>>>   +    entry->huge = true;
>>>       amdgpu_gart_get_vm_pde(p->adev, AMDGPU_VM_PDB0,
>>>                      &dst, &flags);
>>>   -    if (use_cpu_update) {
>>> -        /* In case a huge page is replaced with a system
>>> -         * memory mapping, p->pages_addr != NULL and
>>> -         * amdgpu_vm_cpu_set_ptes would try to translate dst
>>> -         * through amdgpu_vm_map_gart. But dst is already a
>>> -         * GPU address (of the page table). Disable
>>> -         * amdgpu_vm_map_gart temporarily.
>>> -         */
>>> -        dma_addr_t *tmp;
>>> -
>>> -        tmp = p->pages_addr;
>>> -        p->pages_addr = NULL;
>>> -
>>> -        pd_addr = (unsigned long)amdgpu_bo_kptr(parent->base.bo);
>>> -        pde = pd_addr + (entry - parent->entries) * 8;
>>> -        amdgpu_vm_cpu_set_ptes(p, pde, dst, 1, 0, flags);
>>> -
>>> -        p->pages_addr = tmp;
>>> -    } else {
>>> -        if (parent->base.bo->shadow) {
>>> -            pd_addr = amdgpu_bo_gpu_offset(parent->base.bo->shadow);
>>> -            pde = pd_addr + (entry - parent->entries) * 8;
>>> -            amdgpu_vm_do_set_ptes(p, pde, dst, 1, 0, flags);
>>> -        }
>>> -        pd_addr = amdgpu_bo_gpu_offset(parent->base.bo);
>>> +    if (parent->base.bo->shadow) {
>>> +        pd_addr = amdgpu_bo_gpu_offset(parent->base.bo->shadow);
>>>           pde = pd_addr + (entry - parent->entries) * 8;
>>> -        amdgpu_vm_do_set_ptes(p, pde, dst, 1, 0, flags);
>>> +        p->func(p, pde, dst, 1, 0, flags);
>>>       }
>>> +    pd_addr = amdgpu_bo_gpu_offset(parent->base.bo);
>>> +    pde = pd_addr + (entry - parent->entries) * 8;
>>> +    p->func(p, pde, dst, 1, 0, flags);
>>>   }
>>>     /**
>>> @@ -1205,12 +1189,6 @@ static int amdgpu_vm_bo_update_mapping(struct 
>>> amdgpu_device *adev,
>>>       /* padding, etc. */
>>>       ndw = 64;
>>>   -    /* one PDE write for each huge page */
>>> -    if (vm->root.base.bo->shadow)
>>> -        ndw += ((nptes >> adev->vm_manager.block_size) + 1) * 6 * 2;
>>> -    else
>>> -        ndw += ((nptes >> adev->vm_manager.block_size) + 1) * 6;
>> I didn't get why removing this, although you put updating PDE after 
>> huge flag resets, for huge flag no-reset case, we still do huge page 
>> PDE update, don't we?
>
> Yeah, but we don't update the PTEs any more. So we have plenty of free 
> space in the IB for the PDE update.
OK, got it, thanks for explain.

patch#3 and #4 are Reviewed-by: Chunming Zhou <david1.zhou at amd.com>

>
> Regards,
> Christian.
>
>>
>> Regards,
>> David Zhou
>>> -
>>>       if (pages_addr) {
>>>           /* copy commands needed */
>>>           ndw += ncmds * 
>>> adev->vm_manager.vm_pte_funcs->copy_pte_num_dw;
>>> @@ -1285,8 +1263,6 @@ static int amdgpu_vm_bo_update_mapping(struct 
>>> amdgpu_device *adev,
>>>     error_free:
>>>       amdgpu_job_free(job);
>>> -    amdgpu_vm_invalidate_level(adev, vm, &vm->root,
>>> -                   adev->vm_manager.root_level);
>>>       return r;
>>>   }
>>
>



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux