Commit 6d393ef5 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Optimistically prune dma-resv from the shrinker.

As we shrink an object, also see if we can prune the dma-resv of idle
fences it is maintaining a reference to.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201223122051.4624-2-chris@chris-wilson.co.uk
parent d7d82f5d
...@@ -58,6 +58,7 @@ i915-y += i915_drv.o \ ...@@ -58,6 +58,7 @@ i915-y += i915_drv.o \
# core library code # core library code
i915-y += \ i915-y += \
dma_resv_utils.o \
i915_memcpy.o \ i915_memcpy.o \
i915_mm.o \ i915_mm.o \
i915_sw_fence.o \ i915_sw_fence.o \
......
// SPDX-License-Identifier: MIT
/*
* Copyright © 2020 Intel Corporation
*/
#include <linux/dma-resv.h>
#include "dma_resv_utils.h"
void dma_resv_prune(struct dma_resv *resv)
{
if (dma_resv_trylock(resv)) {
if (dma_resv_test_signaled_rcu(resv, true))
dma_resv_add_excl_fence(resv, NULL);
dma_resv_unlock(resv);
}
}
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef DMA_RESV_UTILS_H
#define DMA_RESV_UTILS_H
struct dma_resv;
void dma_resv_prune(struct dma_resv *resv);
#endif /* DMA_RESV_UTILS_H */
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "gt/intel_gt_requests.h" #include "gt/intel_gt_requests.h"
#include "dma_resv_utils.h"
#include "i915_trace.h" #include "i915_trace.h"
static bool swap_available(void) static bool swap_available(void)
...@@ -209,6 +210,8 @@ i915_gem_shrink(struct drm_i915_private *i915, ...@@ -209,6 +210,8 @@ i915_gem_shrink(struct drm_i915_private *i915,
mutex_unlock(&obj->mm.lock); mutex_unlock(&obj->mm.lock);
} }
dma_resv_prune(obj->base.resv);
scanned += obj->base.size >> PAGE_SHIFT; scanned += obj->base.size >> PAGE_SHIFT;
i915_gem_object_put(obj); i915_gem_object_put(obj);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "gt/intel_engine.h" #include "gt/intel_engine.h"
#include "dma_resv_utils.h"
#include "i915_gem_ioctls.h" #include "i915_gem_ioctls.h"
#include "i915_gem_object.h" #include "i915_gem_object.h"
...@@ -84,11 +85,8 @@ i915_gem_object_wait_reservation(struct dma_resv *resv, ...@@ -84,11 +85,8 @@ i915_gem_object_wait_reservation(struct dma_resv *resv,
* Opportunistically prune the fences iff we know they have *all* been * Opportunistically prune the fences iff we know they have *all* been
* signaled. * signaled.
*/ */
if (prune_fences && dma_resv_trylock(resv)) { if (prune_fences)
if (dma_resv_test_signaled_rcu(resv, true)) dma_resv_prune(resv);
dma_resv_add_excl_fence(resv, NULL);
dma_resv_unlock(resv);
}
return timeout; return timeout;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment