Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add kmem cache for amdgpu fence

Change-Id: I5ad8dd156ccf27a6f18004aa0a215a0925b6e67b
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>

authored by

Chunming Zhou and committed by
Alex Deucher
b49c84a5 451f698b

+20 -2
+20 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
··· 47 47 * that the the relevant GPU caches have been flushed. 48 48 */ 49 49 50 + static struct kmem_cache *amdgpu_fence_slab; 51 + static atomic_t amdgpu_fence_slab_ref = ATOMIC_INIT(0); 52 + 50 53 /** 51 54 * amdgpu_fence_write - write a fence value 52 55 * ··· 103 100 struct amdgpu_device *adev = ring->adev; 104 101 105 102 /* we are protected by the ring emission mutex */ 106 - *fence = kmalloc(sizeof(struct amdgpu_fence), GFP_KERNEL); 103 + *fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL); 107 104 if ((*fence) == NULL) { 108 105 return -ENOMEM; 109 106 } ··· 525 522 */ 526 523 int amdgpu_fence_driver_init(struct amdgpu_device *adev) 527 524 { 525 + if (atomic_inc_return(&amdgpu_fence_slab_ref) == 1) { 526 + amdgpu_fence_slab = kmem_cache_create( 527 + "amdgpu_fence", sizeof(struct amdgpu_fence), 0, 528 + SLAB_HWCACHE_ALIGN, NULL); 529 + if (!amdgpu_fence_slab) 530 + return -ENOMEM; 531 + } 528 532 if (amdgpu_debugfs_fence_init(adev)) 529 533 dev_err(adev->dev, "fence debugfs file creation failed\n"); 530 534 ··· 550 540 { 551 541 int i, r; 552 542 543 + if (atomic_dec_and_test(&amdgpu_fence_slab_ref)) 544 + kmem_cache_destroy(amdgpu_fence_slab); 553 545 mutex_lock(&adev->ring_lock); 554 546 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 555 547 struct amdgpu_ring *ring = adev->rings[i]; ··· 757 745 return true; 758 746 } 759 747 748 + static void amdgpu_fence_release(struct fence *f) 749 + { 750 + struct amdgpu_fence *fence = to_amdgpu_fence(f); 751 + kmem_cache_free(amdgpu_fence_slab, fence); 752 + } 753 + 760 754 const struct fence_ops amdgpu_fence_ops = { 761 755 .get_driver_name = amdgpu_fence_get_driver_name, 762 756 .get_timeline_name = amdgpu_fence_get_timeline_name, 763 757 .enable_signaling = amdgpu_fence_enable_signaling, 764 758 .signaled = amdgpu_fence_is_signaled, 765 759 .wait = fence_default_wait, 766 - .release = NULL, 760 + .release = amdgpu_fence_release, 767 761 }; 768 762 769 763 /*