Quoting Chris Wilson (2019-08-21 15:55:08) > Quoting Christian König (2019-08-21 13:31:42) > > Add a new dma_resv_prune_fences() function to improve memory management. > > > > Signed-off-by: Christian König <christian.koenig@xxxxxxx> > > --- > > drivers/dma-buf/dma-resv.c | 37 ++++++++++++++++++++++ > > drivers/gpu/drm/i915/gem/i915_gem_wait.c | 3 +- > > drivers/gpu/drm/i915/i915_gem_batch_pool.c | 2 +- > > drivers/gpu/drm/i915/i915_vma.c | 3 +- > > drivers/gpu/drm/ttm/ttm_bo.c | 2 +- > > include/linux/dma-resv.h | 1 + > > 6 files changed, 42 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c > > index 42a8f3f11681..24adc32d36d4 100644 > > --- a/drivers/dma-buf/dma-resv.c > > +++ b/drivers/dma-buf/dma-resv.c > > @@ -301,6 +301,43 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence) > > } > > EXPORT_SYMBOL(dma_resv_add_excl_fence); > > > > +/** > > + * dma_resv_prune_fences - prune signaled fences from the resv object > > + * @obj: the reservation object to prune > > + * > > + * Prune all signaled fences from the reservation object. > > + */ > > +void dma_resv_prune_fences(struct dma_resv *obj) > > +{ > > + struct dma_resv_list *list; > > + struct dma_fence *fence; > > + unsigned int i; > > + > > + dma_resv_assert_held(obj); > > + > > + fence = dma_resv_get_excl(obj); > > + if (dma_fence_is_signaled(fence)) { > > + RCU_INIT_POINTER(obj->fence_excl, NULL); > > + dma_fence_put(fence); > > + } > > + > > + list = dma_resv_get_list(obj); > > + if (!list) > > + return; > > + > > + for (i = 0; i < list->shared_count; ++i) { > > + fence = rcu_dereference_protected(list->shared[i], > > + dma_resv_held(obj)); > > + > > + if (!dma_fence_is_signaled(fence)) > > + continue; > > + > > + RCU_INIT_POINTER(list->shared[i], dma_fence_get_stub()); > > + dma_fence_put(fence); > > Not worth reusing the compaction logic from add_shared_fence? Scratch that, you're going to rewrite the shared fence container. -Chris