because this zone has only 4GB, it is easy to became bottleneck for huge normal zone.
Signed-off-by: Roger He <hongbo...@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 3 +++ drivers/gpu/drm/ttm/ttm_memory.c | 10 ++++++++-- include/drm/ttm/ttm_memory.h | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 95f9901..9f90022 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -75,6 +75,7 @@ static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref) static int amdgpu_ttm_global_init(struct amdgpu_device *adev) { struct drm_global_reference *global_ref; + struct ttm_mem_global *mem_glob; struct amdgpu_ring *ring; struct drm_sched_rq *rq; int r; @@ -91,6 +92,8 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev) "subsystem.\n"); goto error_mem; } + mem_glob = (struct ttm_mem_global *)global_ref->object; + mem_glob->bdev = &adev->mman.bdev; adev->mman.bo_global_ref.mem_glob = adev->mman.mem_global_ref.object; diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c index f5227a5..875e5b8 100644 --- a/drivers/gpu/drm/ttm/ttm_memory.c +++ b/drivers/gpu/drm/ttm/ttm_memory.c @@ -567,6 +567,7 @@ int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, bool in_pagefault) { struct ttm_mem_zone *zone = NULL; + struct ttm_bo_device *bdev = glob->bdev; /** * Page allocations may be registed in a single zone @@ -577,7 +578,9 @@ int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, if (PageHighMem(page) && glob->zone_highmem != NULL) zone = glob->zone_highmem; #else - if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) + if (bdev && !bdev->need_dma32) + zone = glob->zone_kernel; + else if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) zone = glob->zone_kernel; #endif return ttm_mem_global_alloc_zone(glob, zone, size, @@ -588,12 +591,15 @@ void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page, uint64_t size) { struct ttm_mem_zone *zone = NULL; + struct ttm_bo_device *bdev = glob->bdev; #ifdef CONFIG_HIGHMEM if (PageHighMem(page) && glob->zone_highmem != NULL) zone = glob->zone_highmem; #else - if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) + if (bdev && !bdev->need_dma32) + zone = glob->zone_kernel; + else if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL) zone = glob->zone_kernel; #endif ttm_mem_global_free_zone(glob, zone, size); diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h index 6c29b5c..0577475 100644 --- a/include/drm/ttm/ttm_memory.h +++ b/include/drm/ttm/ttm_memory.h @@ -79,6 +79,7 @@ struct ttm_mem_global { #else struct ttm_mem_zone *zone_dma32; #endif + struct ttm_bo_device *bdev; }; extern int ttm_mem_global_init(struct ttm_mem_global *glob); -- 2.7.4 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel