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: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20201223122051.4624-2-chris@chris-wilson.co.uk
This commit is contained in:
Родитель
d7d82f5d5c
Коммит
6d393ef5ff
|
@ -58,6 +58,7 @@ i915-y += i915_drv.o \
|
|||
|
||||
# core library code
|
||||
i915-y += \
|
||||
dma_resv_utils.o \
|
||||
i915_memcpy.o \
|
||||
i915_mm.o \
|
||||
i915_sw_fence.o \
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// 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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
/* 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 @@
|
|||
|
||||
#include "gt/intel_gt_requests.h"
|
||||
|
||||
#include "dma_resv_utils.h"
|
||||
#include "i915_trace.h"
|
||||
|
||||
static bool swap_available(void)
|
||||
|
@ -209,6 +210,8 @@ i915_gem_shrink(struct drm_i915_private *i915,
|
|||
mutex_unlock(&obj->mm.lock);
|
||||
}
|
||||
|
||||
dma_resv_prune(obj->base.resv);
|
||||
|
||||
scanned += obj->base.size >> PAGE_SHIFT;
|
||||
i915_gem_object_put(obj);
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "gt/intel_engine.h"
|
||||
|
||||
#include "dma_resv_utils.h"
|
||||
#include "i915_gem_ioctls.h"
|
||||
#include "i915_gem_object.h"
|
||||
|
||||
|
@ -84,11 +85,8 @@ i915_gem_object_wait_reservation(struct dma_resv *resv,
|
|||
* Opportunistically prune the fences iff we know they have *all* been
|
||||
* signaled.
|
||||
*/
|
||||
if (prune_fences && dma_resv_trylock(resv)) {
|
||||
if (dma_resv_test_signaled_rcu(resv, true))
|
||||
dma_resv_add_excl_fence(resv, NULL);
|
||||
dma_resv_unlock(resv);
|
||||
}
|
||||
if (prune_fences)
|
||||
dma_resv_prune(resv);
|
||||
|
||||
return timeout;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче