]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: Fix __rcu fence pointer accesses
authorAlex Hung <alex.hung@amd.com>
Thu, 9 Jul 2026 22:33:11 +0000 (16:33 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Jul 2026 23:59:22 +0000 (19:59 -0400)
Building for ARCH=um with W=1 C=1 makes sparse report "incompatible
types in comparison expression (different address spaces)" warnings in
the KFD code, exposed after UML builds were enabled:

- amdgpu_amdkfd_fence.c compares the __rcu-annotated dma_fence.ops
  pointer directly in to_amdgpu_amdkfd_fence().
- amdgpu_amdkfd_gpuvm.c compares the __rcu eviction fence pointer
  directly in amdgpu_amdkfd_gpuvm_restore_process_bos().

Fixes: af3f2f5db265 ("drm/amdgpu: Remove UML build exclusion from Kconfig")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202607091659.SHEscT0c-lkp@intel.com/
Cc: Harry Wentland <harry.wentland@amd.com>
Assisted-by: Copilot:Claude-Opus-4.8
Signed-off-by: Alex Hung <alex.hung@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 764f241ad227bb942e5b0b8b4d9898f1a4175605)

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

index 6a364357522b8a8c61d8da1952f0b4499b54dc74..b0299d8619038ebf80808045821443dd899123fb 100644 (file)
@@ -92,7 +92,7 @@ struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)
                return NULL;
 
        fence = container_of(f, struct amdgpu_amdkfd_fence, base);
-       if (f->ops == &amdkfd_fence_ops)
+       if (rcu_access_pointer(f->ops) == &amdkfd_fence_ops)
                return fence;
 
        return NULL;
index 35fe2c974699145568e19d2232c5e606fba56afc..f0f516a79424fedc11c7fcb6020b7f13bd47fead 100644 (file)
@@ -3096,7 +3096,7 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence __rcu *
                process_info->eviction_fence = new_fence;
                replace_eviction_fence(ef, dma_fence_get(&new_fence->base));
        } else {
-               WARN_ONCE(*ef != &process_info->eviction_fence->base,
+               WARN_ONCE(rcu_access_pointer(*ef) != &process_info->eviction_fence->base,
                          "KFD eviction fence doesn't match KGD process_info");
        }