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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 \
+17 −0
Original line number Diff line number Diff line
// 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);
	}
}
+13 −0
Original line number Diff line number Diff line
/* 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 */
+3 −0
Original line number Diff line number Diff line
@@ -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);

+3 −5
Original line number Diff line number Diff line
@@ -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;
}