[PATCH 04/14] drm/i915: use the max sg->length if the dma_map fails
Matthew Auld
matthew.auld at intel.com
Tue Apr 25 13:03:33 UTC 2017
If the dma_map fails it would make more sense to consider the max
sg->length rather than the max_segment when deciding if it's worthwhile
rebuilding the sg table with a smaller max_segment.
Signed-off-by: Matthew Auld <matthew.auld at intel.com>
---
drivers/gpu/drm/i915/i915_gem.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index e16fc8ec3361..65fbb823ab0a 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2337,6 +2337,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
struct page *page;
unsigned long last_pfn = 0; /* suppress gcc warning */
unsigned int max_segment;
+ unsigned int max_sg_length;
int ret;
gfp_t gfp;
@@ -2351,6 +2352,8 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
if (!max_segment)
max_segment = rounddown(UINT_MAX, PAGE_SIZE);
+ max_sg_length = PAGE_SIZE;
+
st = kmalloc(sizeof(*st), GFP_KERNEL);
if (st == NULL)
return ERR_PTR(-ENOMEM);
@@ -2404,8 +2407,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
if (!i ||
sg->length >= max_segment ||
page_to_pfn(page) != last_pfn + 1) {
- if (i)
+ if (i) {
+ max_sg_length = max(max_sg_length, sg->length);
sg = sg_next(sg);
+ }
st->nents++;
sg_set_page(sg, page, PAGE_SIZE, 0);
} else {
@@ -2428,7 +2433,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
* it could not reserve enough large entries, asking
* for PAGE_SIZE chunks instead may be helpful.
*/
- if (max_segment > PAGE_SIZE) {
+ if (max_sg_length > PAGE_SIZE) {
for_each_sgt_page(page, sgt_iter, st)
put_page(page);
sg_free_table(st);
--
2.9.3
More information about the Intel-gfx-trybot
mailing list