diff options
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.patch | 131 |
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 + |