FAILED: patch "[PATCH] drm/amdgpu: fix visible VRAM handling during faults" failed to apply to 6.8-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.8-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.8.y
git checkout FETCH_HEAD
git cherry-pick -x a6ff969fe9cbf369e3cd0ac54261fec1122682ec
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024042327-wagon-superman-e888@gregkh' --subject-prefix 'PATCH 6.8.y' HEAD^..
Possible dependencies:
a6ff969fe9cb ("drm/amdgpu: fix visible VRAM handling during faults") ba1a58d5b907 ("drm/amdgpu: add shared fdinfo stats")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a6ff969fe9cbf369e3cd0ac54261fec1122682ec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <[email protected]>
Date: Thu, 4 Apr 2024 16:25:40 +0200
Subject: [PATCH] drm/amdgpu: fix visible VRAM handling during faults
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When we removed the hacky start code check we actually didn't took into account that *all* VRAM pages needs to be CPU accessible.
Clean up the code and unify the handling into a single helper which checks if the whole resource is CPU accessible.
The only place where a partial check would make sense is during eviction, but that is neglitible.
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +1 -1
@@ -819,7 +819,7 @@ static int amdgpu_cs_bo_validate(void *param, struct amdgpu_bo *bo) p->bytes_moved += ctx.bytes_moved;if (!amdgpu_gmc_vram_full_visible (&adev->gmc) && -amdgpu_bo_in_cpu_visible_vram (bo)) +amdgpu_res_cpu_visible (adev, bo->tbo.resource)) p->bytes_moved_vis += ctx.bytes_moved;if (unlikely (r == -ENOMEM ) && domain != bo->allowed_domains) {
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +11 -11
@@ -617,8 +617,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,return r;if (!amdgpu_gmc_vram_full_visible (&adev->gmc) && - bo->tbo.resource->mem_type ==TTM_PL_VRAM && -amdgpu_bo_in_cpu_visible_vram (bo)) +amdgpu_res_cpu_visible (adev, bo->tbo.resource))amdgpu_cs_report_moved_bytes (adev, ctx.bytes_moved, ctx.bytes_moved);else
@@ -1272,23 +1271,25 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)void amdgpu_bo_get_memory (struct amdgpu_bo *bo,struct amdgpu_mem_stats *stats) { +struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev); +struct ttm_resource *res = bo->tbo.resource;uint64_t size =amdgpu_bo_size (bo);struct drm_gem_object *obj;unsigned int domain;bool shared;/* Abort if the BO doesn't currently have a backing store */ -if (!bo->tbo.resource) +if (!res)return ; obj = &bo->tbo.base; shared =drm_gem_object_is_shared_for_memory_stats (obj); - domain =amdgpu_mem_type_to_domain (bo->tbo.resource->mem_type); + domain =amdgpu_mem_type_to_domain (res->mem_type);switch (domain) {case AMDGPU_GEM_DOMAIN_VRAM : stats->vram += size; -if (amdgpu_bo_in_cpu_visible_vram (bo)) +if (amdgpu_res_cpu_visible (adev, bo->tbo.resource)) stats->visible_vram += size;if (shared) stats->vram_shared += size;
@@ -1389,10 +1390,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)/* Remember that this BO was accessed by the CPU */ abo->flags |=AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED ; -if (bo->resource->mem_type !=TTM_PL_VRAM ) -return 0 ; - -if (amdgpu_bo_in_cpu_visible_vram (abo)) +if (amdgpu_res_cpu_visible (adev, bo->resource))return 0 ;/* Can't move a pinned BO to visible VRAM */
@@ -1415,7 +1413,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)/* this should never happen */ if (bo->resource->mem_type ==TTM_PL_VRAM && - !amdgpu_bo_in_cpu_visible_vram (abo)) + !amdgpu_res_cpu_visible (adev, bo->resource))return VM_FAULT_SIGBUS ;ttm_bo_move_to_lru_tail_unlocked (bo);
@@ -1579,6 +1577,7 @@ uint32_t amdgpu_bo_get_preferred_domain(struct amdgpu_device *adev,*/ u64 amdgpu_bo_print_info (int id,struct amdgpu_bo *bo,struct seq_file *m) { +struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev);struct dma_buf_attachment *attachment;struct dma_buf *dma_buf;const char *placement;
@@ -1587,10 +1586,11 @@ u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m)if (dma_resv_trylock (bo->tbo.base.resv)) {unsigned int domain; + domain =amdgpu_mem_type_to_domain (bo->tbo.resource->mem_type);switch (domain) {case AMDGPU_GEM_DOMAIN_VRAM : -if (amdgpu_bo_in_cpu_visible_vram (bo)) +if (amdgpu_res_cpu_visible (adev, bo->tbo.resource)) placement ="VRAM VISIBLE" ;else placement ="VRAM" ;
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +0 -22
@@ -250,28 +250,6 @@ static inline u64 amdgpu_bo_mmap_offset(struct amdgpu_bo *bo)return drm_vma_node_offset_addr (&bo->tbo.base.vma_node); } -/** -* amdgpu_bo_in_cpu_visible_vram - check if BO is (partly) in visible VRAM -*/ -static inline bool amdgpu_bo_in_cpu_visible_vram (struct amdgpu_bo *bo) -{ -struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev); -struct amdgpu_res_cursor cursor; - -if (!bo->tbo.resource || bo->tbo.resource->mem_type !=TTM_PL_VRAM ) -return false; - -amdgpu_res_first (bo->tbo.resource,0 ,amdgpu_bo_size (bo), &cursor); -while (cursor.remaining) { -if (cursor.start < adev->gmc.visible_vram_size) -return true; - -amdgpu_res_next (&cursor, cursor.size); - } - -return false; -} -/** * amdgpu_bo_explicit_sync - return whether the bo is explicitly synced */
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +44 -29
99 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +3 -0
@@ -139,6 +139,9 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr,int amdgpu_vram_mgr_query_page_status (struct amdgpu_vram_mgr *mgr,uint64_t start); +bool amdgpu_res_cpu_visible (struct amdgpu_device *adev, +struct ttm_resource *res); +int amdgpu_ttm_init (struct amdgpu_device *adev);void amdgpu_ttm_fini (struct amdgpu_device *adev); void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev,