aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch')
-rw-r--r--common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch b/common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch
new file mode 100644
index 00000000..21cbb42c
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0357-drm-amdgpu-add-slap-cache-for-sync-objects-as-well.patch
@@ -0,0 +1,131 @@
+From 1f797846d6a6f5734d9cb105fcd5a0b6cc4b3fc8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Tue, 16 Feb 2016 11:24:58 +0100
+Subject: [PATCH 0357/1110] drm/amdgpu: add slap cache for sync objects as well
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We need them all the time.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 36 ++++++++++++++++++++++++++++----
+ 3 files changed, 36 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 27b1dc3..866e790 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -594,6 +594,8 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
+ struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
+ int amdgpu_sync_wait(struct amdgpu_sync *sync);
+ void amdgpu_sync_free(struct amdgpu_sync *sync);
++int amdgpu_sync_init(void);
++void amdgpu_sync_fini(void);
+
+ /*
+ * GART structures, functions & helpers
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+index c1182ec..82cab2e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+@@ -547,6 +547,7 @@ static struct pci_driver amdgpu_kms_pci_driver = {
+
+ static int __init amdgpu_init(void)
+ {
++ amdgpu_sync_init();
+ #ifdef CONFIG_VGA_CONSOLE
+ if (vgacon_text_force()) {
+ DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
+@@ -571,6 +572,7 @@ static void __exit amdgpu_exit(void)
+ amdgpu_amdkfd_fini();
+ drm_pci_exit(driver, pdriver);
+ amdgpu_unregister_atpx_handler();
++ amdgpu_sync_fini();
+ }
+
+ module_init(amdgpu_init);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+index e367342..c48b4fc 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+@@ -37,6 +37,8 @@ struct amdgpu_sync_entry {
+ struct fence *fence;
+ };
+
++static struct kmem_cache *amdgpu_sync_slab;
++
+ /**
+ * amdgpu_sync_create - zero init sync object
+ *
+@@ -133,7 +135,7 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
+ return 0;
+ }
+
+- e = kmalloc(sizeof(struct amdgpu_sync_entry), GFP_KERNEL);
++ e = kmem_cache_alloc(amdgpu_sync_slab, GFP_KERNEL);
+ if (!e)
+ return -ENOMEM;
+
+@@ -214,7 +216,7 @@ struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync)
+ f = e->fence;
+
+ hash_del(&e->node);
+- kfree(e);
++ kmem_cache_free(amdgpu_sync_slab, e);
+
+ if (!fence_is_signaled(f))
+ return f;
+@@ -237,7 +239,7 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync)
+
+ hash_del(&e->node);
+ fence_put(e->fence);
+- kfree(e);
++ kmem_cache_free(amdgpu_sync_slab, e);
+ }
+
+ return 0;
+@@ -259,8 +261,34 @@ void amdgpu_sync_free(struct amdgpu_sync *sync)
+ hash_for_each_safe(sync->fences, i, tmp, e, node) {
+ hash_del(&e->node);
+ fence_put(e->fence);
+- kfree(e);
++ kmem_cache_free(amdgpu_sync_slab, e);
+ }
+
+ fence_put(sync->last_vm_update);
+ }
++
++/**
++ * amdgpu_sync_init - init sync object subsystem
++ *
++ * Allocate the slab allocator.
++ */
++int amdgpu_sync_init(void)
++{
++ amdgpu_sync_slab = kmem_cache_create(
++ "amdgpu_sync", sizeof(struct amdgpu_sync_entry), 0,
++ SLAB_HWCACHE_ALIGN, NULL);
++ if (!amdgpu_sync_slab)
++ return -ENOMEM;
++
++ return 0;
++}
++
++/**
++ * amdgpu_sync_fini - fini sync object subsystem
++ *
++ * Free the slab allocator.
++ */
++void amdgpu_sync_fini(void)
++{
++ kmem_cache_destroy(amdgpu_sync_slab);
++}
+--
+2.7.4
+