]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu: nuke amdgpu_userq_fence_slab v2
authorChristian König <christian.koenig@amd.com>
Mon, 13 Oct 2025 13:26:02 +0000 (15:26 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 5 May 2026 14:23:06 +0000 (10:23 -0400)
As preparation for independent fences remove the extra slab, kmalloc
should do just fine.

v2: use GFP_KERNEL instead of GFP_ATOMIC

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Prike Liang <Prike.Liang@amd.com>
Reviewed-by: Sunil Khatri <sunil.khatri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 0d831487b5be0ae59cac865a0aa87b0acc3dc717)

drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h

index 46aae3fad4bf6cdaf17464d1d43dbd0798551f79..60debd543e44eeabd856550beeb1bc1a288e6b34 100644 (file)
@@ -3149,11 +3149,7 @@ static int __init amdgpu_init(void)
 
        r = amdgpu_sync_init();
        if (r)
-               goto error_sync;
-
-       r = amdgpu_userq_fence_slab_init();
-       if (r)
-               goto error_fence;
+               return r;
 
        amdgpu_register_atpx_handler();
        amdgpu_acpi_detect();
@@ -3161,7 +3157,7 @@ static int __init amdgpu_init(void)
        /* Ignore KFD init failures when CONFIG_HSA_AMD is not set. */
        r = amdgpu_amdkfd_init();
        if (r && r != -ENOENT)
-               goto error_fence;
+               goto error_fini_sync;
 
        if (amdgpu_pp_feature_mask & PP_OVERDRIVE_MASK) {
                add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
@@ -3172,10 +3168,8 @@ static int __init amdgpu_init(void)
        /* let modprobe override vga console setting */
        return pci_register_driver(&amdgpu_kms_pci_driver);
 
-error_fence:
+error_fini_sync:
        amdgpu_sync_fini();
-
-error_sync:
        return r;
 }
 
@@ -3186,7 +3180,6 @@ static void __exit amdgpu_exit(void)
        amdgpu_unregister_atpx_handler();
        amdgpu_acpi_release();
        amdgpu_sync_fini();
-       amdgpu_userq_fence_slab_fini();
        mmu_notifier_synchronize();
        amdgpu_xcp_drv_release();
 }
index da39ac862f37cfde15d87dae31beb3a57d468e06..e2d5f04296e1c0d79f8b7c1b823c0397b04ae575 100644 (file)
 #include "amdgpu.h"
 #include "amdgpu_userq_fence.h"
 
-static const struct dma_fence_ops amdgpu_userq_fence_ops;
-static struct kmem_cache *amdgpu_userq_fence_slab;
-
 #define AMDGPU_USERQ_MAX_HANDLES       (1U << 16)
 
-int amdgpu_userq_fence_slab_init(void)
-{
-       amdgpu_userq_fence_slab = kmem_cache_create("amdgpu_userq_fence",
-                                                   sizeof(struct amdgpu_userq_fence),
-                                                   0,
-                                                   SLAB_HWCACHE_ALIGN,
-                                                   NULL);
-       if (!amdgpu_userq_fence_slab)
-               return -ENOMEM;
-
-       return 0;
-}
-
-void amdgpu_userq_fence_slab_fini(void)
-{
-       rcu_barrier();
-       kmem_cache_destroy(amdgpu_userq_fence_slab);
-}
+static const struct dma_fence_ops amdgpu_userq_fence_ops;
 
 static inline struct amdgpu_userq_fence *to_amdgpu_userq_fence(struct dma_fence *f)
 {
@@ -231,7 +211,7 @@ void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv)
 
 static int amdgpu_userq_fence_alloc(struct amdgpu_userq_fence **userq_fence)
 {
-       *userq_fence = kmem_cache_alloc(amdgpu_userq_fence_slab, GFP_ATOMIC);
+       *userq_fence = kmalloc(sizeof(**userq_fence), GFP_KERNEL);
        return *userq_fence ? 0 : -ENOMEM;
 }
 
@@ -342,7 +322,7 @@ static void amdgpu_userq_fence_free(struct rcu_head *rcu)
        amdgpu_userq_fence_driver_put(fence_drv);
 
        kvfree(userq_fence->fence_drv_array);
-       kmem_cache_free(amdgpu_userq_fence_slab, userq_fence);
+       kfree(userq_fence);
 }
 
 static void amdgpu_userq_fence_release(struct dma_fence *f)
@@ -545,7 +525,7 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
        r = amdgpu_userq_fence_create(queue, userq_fence, wptr, &fence);
        if (r) {
                mutex_unlock(&userq_mgr->userq_mutex);
-               kmem_cache_free(amdgpu_userq_fence_slab, userq_fence);
+               kfree(userq_fence);
                goto put_gobj_write;
        }
 
index d56246ad8c260b6e4823381862d33cae69682dea..d355a0eecc07fa6c4d5858e3b6e5c3cf9cfe4175 100644 (file)
@@ -58,9 +58,6 @@ struct amdgpu_userq_fence_driver {
        char timeline_name[TASK_COMM_LEN];
 };
 
-int amdgpu_userq_fence_slab_init(void);
-void amdgpu_userq_fence_slab_fini(void);
-
 void amdgpu_userq_fence_driver_get(struct amdgpu_userq_fence_driver *fence_drv);
 void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv);
 int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev,