Patch "dma-buf: make reservation_object_copy_fences rcu save" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dma-buf: make reservation_object_copy_fences rcu save
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dma-buf-make-reservation_object_copy_fences-rcu-save.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
39e16ba16c147e662bf9fbcee9a99d70d420382fMon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <[email protected]>
Date: Mon, 4 Sep 2017 21:02:45 +0200
Subject: dma-buf: make reservation_object_copy_fences rcu save
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Christian König <[email protected]>
commit 39e16ba16c147e662bf9fbcee9a99d70d420382f upstream.
Stop requiring that the src reservation object is locked for this operation.
--- drivers/dma-buf/reservation.c | 56 +++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 14 deletions(-)
drivers/dma-buf/reservation.c +42 -14
@@ -266,8 +266,7 @@ EXPORT_SYMBOL(reservation_object_add_exc* @dst: the destination reservation object * @src: the source reservation object * -* Copy all fences from src to dst. Both src->lock as well as dst-lock must be -* held. +* Copy all fences from src to dst. dst-lock must be held. */ int reservation_object_copy_fences (struct reservation_object *dst,struct reservation_object *src)
@@ -277,33 +276,62 @@ int reservation_object_copy_fences(strucsize_t size;unsigned i; - src_list =reservation_object_get_list (src); +rcu_read_lock (); + src_list =rcu_dereference (src->fence); +retry:if (src_list) { - size = offsetof(typeof(*src_list), - shared[src_list->shared_count]); +unsigned shared_count = src_list->shared_count; + + size = offsetof(typeof(*src_list), shared[shared_count]); +rcu_read_unlock (); + dst_list =kmalloc (size,GFP_KERNEL );if (!dst_list)return -ENOMEM ; - dst_list->shared_count = src_list->shared_count; - dst_list->shared_max = src_list->shared_count; -for (i =0 ; i < src_list->shared_count; ++i) - dst_list->shared[i] = -dma_fence_get (src_list->shared[i]); +rcu_read_lock (); + src_list =rcu_dereference (src->fence); +if (!src_list || src_list->shared_count > shared_count) { +kfree (dst_list); + goto retry; + } + + dst_list->shared_count =0 ; + dst_list->shared_max = shared_count; +for (i =0 ; i < src_list->shared_count; ++i) { +struct dma_fence *fence; + + fence =rcu_dereference (src_list->shared[i]); +if (test_bit (DMA_FENCE_FLAG_SIGNALED_BIT , + &fence->flags)) +continue ; + +if (!dma_fence_get_rcu (fence)) { +kfree (dst_list); + src_list =rcu_dereference (src->fence); + goto retry; + } + +if (dma_fence_is_signaled (fence)) { +dma_fence_put (fence); +continue ; + } + + dst_list->shared[dst_list->shared_count++] = fence; + } }else { dst_list =NULL ; } + new =dma_fence_get_rcu_safe (&src->fence_excl); +rcu_read_unlock (); +kfree (dst->staged); dst->staged =NULL ; src_list =reservation_object_get_list (dst); - old =reservation_object_get_excl (dst); - new =reservation_object_get_excl (src); - -dma_fence_get (new);preempt_disable ();write_seqcount_begin (&dst->seq);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/drm-ttm-fix-ttm_bo_cleanup_refs_or_queue-once-more.patch queue-4.14/drm-amdgpu-potential-uninitialized-variable-in-amdgpu_vce_ring_parse_cs.patch queue-4.14/drm-amdgpu-properly-allocate-vm-invalidate-eng-v2.patch queue-4.14/drm-amdgpu-potential-uninitialized-variable-in-amdgpu_vm_update_directories.patch queue-4.14/drm-amdgpu-fix-error-handling-in-amdgpu_bo_do_create.patch queue-4.14/dma-buf-make-reservation_object_copy_fences-rcu-save.patch