From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 15/41] drm/i915: Use radixtree to jump start intel_partial_pages()
Date: Fri, 14 Oct 2016 14:38:13 +0100 [thread overview]
Message-ID: <2579a55d-c20b-8463-eccd-ab27b0d27b94@linux.intel.com> (raw)
In-Reply-To: <20161014121833.439-16-chris@chris-wilson.co.uk>
On 14/10/2016 13:18, Chris Wilson wrote:
> We can use the radixtree index of the obj->pages to find the start
> position of the desired partial range.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 40 ++++++++++++++++++++++++-------------
> 1 file changed, 26 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 2bbbda191e93..b3f341fe77bf 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3584,35 +3584,47 @@ intel_partial_pages(const struct i915_ggtt_view *view,
> struct drm_i915_gem_object *obj)
> {
> struct sg_table *st;
> - struct scatterlist *sg;
> - struct sg_page_iter obj_sg_iter;
> + struct scatterlist *sg, *iter;
> + unsigned int count = view->params.partial.size;
> + unsigned int offset;
> int ret = -ENOMEM;
>
> st = kmalloc(sizeof(*st), GFP_KERNEL);
> if (!st)
> goto err_st_alloc;
>
> - ret = sg_alloc_table(st, view->params.partial.size, GFP_KERNEL);
> + ret = sg_alloc_table(st, count, GFP_KERNEL);
> if (ret)
> goto err_sg_alloc;
>
> + iter = i915_gem_object_get_sg(obj,
> + view->params.partial.offset,
> + &offset);
> + GEM_BUG_ON(!iter);
> +
> sg = st->sgl;
> st->nents = 0;
> - for_each_sg_page(obj->pages->sgl, &obj_sg_iter, obj->pages->nents,
> - view->params.partial.offset)
> - {
> - if (st->nents >= view->params.partial.size)
> - break;
> + do {
> + unsigned int len;
>
> - sg_set_page(sg, NULL, PAGE_SIZE, 0);
> - sg_dma_address(sg) = sg_page_iter_dma_address(&obj_sg_iter);
> - sg_dma_len(sg) = PAGE_SIZE;
> + len = min(iter->length - (offset << PAGE_SHIFT),
> + count << PAGE_SHIFT);
> + sg_set_page(sg, NULL, len, 0);
> + sg_dma_address(sg) =
> + sg_dma_address(iter) + (offset << PAGE_SHIFT);
> + sg_dma_len(sg) = len;
>
> - sg = sg_next(sg);
> st->nents++;
> - }
> + count -= len >> PAGE_SHIFT;
> + if (count == 0) {
> + sg_mark_end(sg);
> + return st;
> + }
>
> - return st;
> + sg = __sg_next(sg);
> + iter = __sg_next(iter);
> + offset = 0;
> + } while (1);
>
> err_sg_alloc:
> kfree(st);
Looks OK and I trust you when you say it is faster.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Regards,
Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-10-14 13:38 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-14 12:17 Fencing, fencing, fencing Chris Wilson
2016-10-14 12:17 ` [PATCH 01/41] drm/i915: Move user fault tracking to a separate list Chris Wilson
2016-10-14 12:17 ` [PATCH 02/41] drm/i915: Use RPM as the barrier for controlling user mmap access Chris Wilson
2016-10-14 12:17 ` [PATCH 03/41] drm/i915: Remove superfluous locking around userfault_list Chris Wilson
2016-10-14 12:17 ` [PATCH 04/41] drm/i915: Remove RPM sequence checking Chris Wilson
2016-10-14 12:17 ` [PATCH 05/41] drm/i915: Move fence cancellation to runtime suspend Chris Wilson
2016-10-14 12:17 ` [PATCH 06/41] drm/i915: Support asynchronous waits on struct fence from i915_gem_request Chris Wilson
2016-10-17 12:20 ` Joonas Lahtinen
2016-10-20 10:28 ` Chris Wilson
2016-10-14 12:17 ` [PATCH 07/41] drm/i915: Allow i915_sw_fence_await_sw_fence() to allocate Chris Wilson
2016-10-14 12:18 ` [PATCH 08/41] drm/i915: Rearrange i915_wait_request() accounting with callers Chris Wilson
2016-10-17 12:26 ` Joonas Lahtinen
2016-10-18 18:51 ` Matthew Auld
2016-10-19 10:39 ` Joonas Lahtinen
2016-10-14 12:18 ` [PATCH 09/41] drm/i915: Remove unused i915_gem_active_wait() in favour of _unlocked() Chris Wilson
2016-10-14 12:18 ` [PATCH 10/41] drm/i915: Defer active reference until required Chris Wilson
2016-10-14 12:18 ` [PATCH 11/41] drm/i915: Introduce an internal allocator for disposable private objects Chris Wilson
2016-10-14 12:42 ` Tvrtko Ursulin
2016-10-14 12:54 ` Chris Wilson
2016-10-14 13:44 ` Tvrtko Ursulin
2016-10-14 13:53 ` Chris Wilson
2016-10-14 14:35 ` Tvrtko Ursulin
2016-10-14 14:42 ` Chris Wilson
2016-10-17 9:47 ` Tvrtko Ursulin
2016-10-17 9:55 ` Chris Wilson
2016-10-14 12:18 ` [PATCH 12/41] drm/i915: Reuse the active golden render state batch Chris Wilson
2016-10-14 12:18 ` [PATCH 13/41] drm/i915: Markup GEM API with lockdep asserts Chris Wilson
2016-10-14 12:18 ` [PATCH 14/41] drm/i915: Use a radixtree for random access to the object's backing storage Chris Wilson
2016-10-14 13:32 ` Tvrtko Ursulin
2016-10-14 14:07 ` Chris Wilson
2016-10-17 9:56 ` Tvrtko Ursulin
2016-10-17 10:57 ` Chris Wilson
2016-10-14 12:18 ` [PATCH 15/41] drm/i915: Use radixtree to jump start intel_partial_pages() Chris Wilson
2016-10-14 13:38 ` Tvrtko Ursulin [this message]
2016-10-14 12:18 ` [PATCH 16/41] drm/i915: Refactor object page API Chris Wilson
2016-10-14 12:18 ` [PATCH 17/41] drm/i915: Pass around sg_table to get_pages/put_pages backend Chris Wilson
2016-10-17 10:55 ` Tvrtko Ursulin
2016-10-17 11:31 ` Chris Wilson
2016-10-17 13:51 ` Tvrtko Ursulin
2016-10-17 14:08 ` Chris Wilson
2016-10-14 12:18 ` [PATCH 18/41] drm/i915: Move object backing storage manipulation to its own locking Chris Wilson
2016-10-14 12:18 ` [PATCH 19/41] drm/i915/dmabuf: Acquire the backing storage outside of struct_mutex Chris Wilson
2016-10-14 12:18 ` [PATCH 20/41] drm/i915: Implement pread without struct-mutex Chris Wilson
2016-10-14 12:18 ` [PATCH 21/41] drm/i915: Implement pwrite " Chris Wilson
2016-10-14 12:18 ` [PATCH 22/41] drm/i915: Acquire the backing storage outside of struct_mutex in set-domain Chris Wilson
2016-10-14 12:18 ` [PATCH 23/41] drm/i915: Move object release to a freelist + worker Chris Wilson
2016-10-18 9:19 ` Joonas Lahtinen
2016-10-18 9:20 ` Joonas Lahtinen
2016-10-18 9:51 ` John Harrison
2016-10-20 9:38 ` Chris Wilson
2016-10-14 12:18 ` [PATCH 24/41] drm/i915: Use lockless object free Chris Wilson
2016-10-18 8:50 ` Joonas Lahtinen
2016-10-14 12:18 ` [PATCH 25/41] drm/i915: Move GEM activity tracking into a common struct reservation_object Chris Wilson
2016-10-17 12:14 ` Joonas Lahtinen
2016-10-14 12:18 ` [PATCH 26/41] drm: Add reference counting to drm_atomic_state Chris Wilson
2016-10-17 6:20 ` Daniel Vetter
2016-10-14 12:18 ` [PATCH 27/41] drm/i915: Restore nonblocking awaits for modesetting Chris Wilson
2016-10-14 12:18 ` [PATCH 28/41] drm/i915: Combine seqno + tracking into a global timeline struct Chris Wilson
2016-10-14 12:18 ` [PATCH 29/41] drm/i915: Queue the idling context switch after all other timelines Chris Wilson
2016-10-14 12:18 ` [PATCH 30/41] drm/i915: Wait first for submission, before waiting for request completion Chris Wilson
2016-10-14 12:18 ` [PATCH 31/41] drm/i915: Introduce a global_seqno for each request Chris Wilson
2016-10-14 12:18 ` [PATCH 32/41] drm/i915: Rename ->emit_request to ->emit_breadcrumb Chris Wilson
2016-10-17 12:09 ` Joonas Lahtinen
2016-10-14 12:18 ` [PATCH 33/41] drm/i915: Record space required for breadcrumb emission Chris Wilson
2016-10-14 12:18 ` [PATCH 34/41] drm/i915: Defer " Chris Wilson
2016-10-14 12:18 ` [PATCH 35/41] drm/i915: Move the global sync optimisation to the timeline Chris Wilson
2016-10-14 12:18 ` [PATCH 36/41] drm/i915: Create a unique name for the context Chris Wilson
2016-10-14 12:18 ` [PATCH 37/41] drm/i915: Reserve space in the global seqno during request allocation Chris Wilson
2016-10-14 12:18 ` [PATCH 38/41] drm/i915: Defer setting of global seqno on request to submission Chris Wilson
2016-10-17 12:12 ` Joonas Lahtinen
2016-10-14 12:18 ` [PATCH 39/41] drm/i915: Enable multiple timelines Chris Wilson
2016-10-20 15:26 ` Joonas Lahtinen
2016-10-20 15:40 ` Chris Wilson
2016-10-14 12:18 ` [PATCH 40/41] drm/i915: Enable userspace to opt-out of implicit fencing Chris Wilson
2016-10-14 12:18 ` [PATCH 41/41] drm/i915: Support explicit fencing for execbuf Chris Wilson
2016-10-14 13:58 ` ✗ Fi.CI.BAT: failure for series starting with [01/41] drm/i915: Move user fault tracking to a separate list Patchwork
2016-10-14 17:20 ` Saarinen, Jani
2016-10-14 17:38 ` Chris Wilson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2579a55d-c20b-8463-eccd-ab27b0d27b94@linux.intel.com \
--to=tvrtko.ursulin@linux.intel.com \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox