From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> As for the earlier ones, it simplifies the loop and enables entry colaescing. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem_dmabuf.c | 45 +++++++++++++++------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index 97c9d68b45df..5df1dfdeec66 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c @@ -40,11 +40,13 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme enum dma_data_direction dir) { struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf); - struct sg_table *st; - struct scatterlist *src, *dst; - int ret, i; + struct drm_device *dev = obj->base.dev; + struct i915_sg_create_state *state; + struct sgt_iter sgt_iter; + struct page *page; + int ret; - ret = i915_mutex_lock_interruptible(obj->base.dev); + ret = i915_mutex_lock_interruptible(dev); if (ret) goto err; @@ -55,40 +57,33 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme i915_gem_object_pin_pages(obj); /* Copy sg so that we make an independent mapping */ - st = kmalloc(sizeof(struct sg_table), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; + state = i915_sg_create(obj->pages->nents); + if (IS_ERR(state)) { + ret = PTR_ERR(state); goto err_unpin; } - ret = sg_alloc_table(st, obj->pages->nents, GFP_KERNEL); - if (ret) - goto err_free; - - src = obj->pages->sgl; - dst = st->sgl; - for (i = 0; i < obj->pages->nents; i++) { - sg_set_page(dst, sg_page(src), src->length, 0); - dst = sg_next(dst); - src = sg_next(src); - } + for_each_sgt_page(page, sgt_iter, obj->pages) + i915_sg_add_page(state, page); - if (!dma_map_sg(attachment->dev, st->sgl, st->nents, dir)) { + i915_sg_complete(state); + + if (!dma_map_sg(attachment->dev, + state->st->sgl, state->st->nents, dir)) { ret =-ENOMEM; goto err_free_sg; } - mutex_unlock(&obj->base.dev->struct_mutex); - return st; + mutex_unlock(&dev->struct_mutex); + + return state->st; err_free_sg: - sg_free_table(st); -err_free: - kfree(st); + i915_sg_abort(state); err_unpin: i915_gem_object_unpin_pages(obj); err_unlock: - mutex_unlock(&obj->base.dev->struct_mutex); + mutex_unlock(&dev->struct_mutex); err: return ERR_PTR(ret); } -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx