[PATCH 11/11] drm/i915: Use sg_trim_table

Tvrtko Ursulin tursulin at ursulin.net
Fri Feb 16 16:56:21 UTC 2018


From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c              | 28 +--------------------------
 drivers/gpu/drm/i915/selftests/scatterlist.c | 29 ++++++++++++++--------------
 2 files changed, 16 insertions(+), 41 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index fc68b35854df..b42d7a31ead2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2345,32 +2345,6 @@ void __i915_gem_object_put_pages(struct drm_i915_gem_object *obj,
 	mutex_unlock(&obj->mm.lock);
 }
 
-static bool i915_sg_trim(struct sg_table *orig_st)
-{
-	struct sg_table new_st;
-	struct scatterlist *sg, *new_sg;
-	unsigned int i;
-
-	if (orig_st->nents == orig_st->orig_nents)
-		return false;
-
-	if (sg_alloc_table(&new_st, orig_st->nents, GFP_KERNEL | __GFP_NOWARN))
-		return false;
-
-	new_sg = new_st.sgl;
-	for_each_sg(orig_st->sgl, sg, orig_st->nents, i) {
-		sg_set_page(new_sg, sg_page(sg), sg->length, 0);
-		/* called before being DMA mapped, no need to copy sg->dma_* */
-		new_sg = sg_next(new_sg);
-	}
-	GEM_BUG_ON(new_sg); /* Should walk exactly nents and hit the end */
-
-	sg_free_table(orig_st);
-
-	*orig_st = new_st;
-	return true;
-}
-
 static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
 {
 	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
@@ -2488,7 +2462,7 @@ static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
 	}
 
 	/* Trim unused sg entries to avoid wasting memory. */
-	i915_sg_trim(st);
+	sg_trim_table(st, GFP_KERNEL | __GFP_NOWARN);
 
 	ret = i915_gem_gtt_prepare_pages(obj, st);
 	if (ret) {
diff --git a/drivers/gpu/drm/i915/selftests/scatterlist.c b/drivers/gpu/drm/i915/selftests/scatterlist.c
index cd6d2a16071f..b0e20534099e 100644
--- a/drivers/gpu/drm/i915/selftests/scatterlist.c
+++ b/drivers/gpu/drm/i915/selftests/scatterlist.c
@@ -340,20 +340,21 @@ static int igt_sg_trim(void *ignored)
 			if (err)
 				return err;
 
-			if (i915_sg_trim(&pt.st)) {
-				if (pt.st.orig_nents != prime ||
-				    pt.st.nents != prime) {
-					pr_err("i915_sg_trim failed (nents %u, orig_nents %u), expected %lu\n",
-					       pt.st.nents, pt.st.orig_nents, prime);
-					err = -EINVAL;
-				} else {
-					prandom_seed_state(&prng,
-							   i915_selftest.random_seed);
-					err = expect_pfn_sgtable(&pt,
-								 *npages, &prng,
-								 "i915_sg_trim",
-								 end_time);
-				}
+			sg_trim_table(&pt.st, GFP_KERNEL | __GFP_NORETRY |
+				      __GFP_NOWARN);
+
+			if (pt.st.orig_nents != prime ||
+				pt.st.nents != prime) {
+				pr_err("sg_trim_table failed (nents %u, orig_nents %u), expected %lu\n",
+					pt.st.nents, pt.st.orig_nents, prime);
+				err = -EINVAL;
+			} else {
+				prandom_seed_state(&prng,
+							i915_selftest.random_seed);
+				err = expect_pfn_sgtable(&pt,
+								*npages, &prng,
+								"sg_trim_table",
+								end_time);
 			}
 			sg_free_table(&pt.st);
 			if (err)
-- 
2.14.1



More information about the Intel-gfx-trybot mailing list