All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Gordon <david.s.gordon@intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>,
	Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	Intel-gfx@lists.freedesktop.org,
	Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Subject: Re: [PATCH v3 4/7] drm/i915: Cache LRC state page in the context
Date: Tue, 12 Jan 2016 16:45:02 +0000	[thread overview]
Message-ID: <56952D8E.2020508@intel.com> (raw)
In-Reply-To: <20160112131114.GB24672@nuc-i3427.alporthouse.com>

On 12/01/16 13:11, Chris Wilson wrote:
> On Tue, Jan 12, 2016 at 12:54:25PM +0000, Tvrtko Ursulin wrote:
>>
>> On 12/01/16 12:12, Chris Wilson wrote:
>>> On Tue, Jan 12, 2016 at 11:56:11AM +0000, Tvrtko Ursulin wrote:
>>>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>>>
>>>> LRC lifetime is well defined so we can cache the page pointing
>>>> to the object backing store in the context in order to avoid
>>>> walking over the object SG page list from the interrupt context
>>>> without the big lock held.
>>>>
>>>> v2: Also cache the mapping. (Chris Wilson)
>>>> v3: Unmap on the error path.
>>>
>>> Then we only use the lrc_state_page in the unmapping, hardly worth the
>>> cost of saving it.
>>
>> Ok.
>>
>> Do you also know if this would now require any flushing or something
>> if previously kunmap_atomic might have done something under the
>> covers?
>
> kmap_atomic only changes the PTE and the unmap would flush the TLB. In
> terms of our pointer access, using kmap/kmap_atomic is equivalent. (Just
> kmap_atomic is meant to be cheaper to set up and a limited resource
> which can only be used without preemption.)
>
>>> The reg_state is better associated with the ring (since it basically
>>> contains the analog of the RING_HEAD and friends).
>>
>> Hm, not sure. The page belongs to the object from that anonymous
>> struct in intel_context so I think it is best to keep them together.
>
> The page does sure, but the state does not.
>
> The result is that we get:
>
> ring->registers[CTX_RING_BUFFER_STATE+1] = ring->vma->node.state;
> ASSIGN_CTX_PDP(ppgtt, ring->registers, 3);
> ASSIGN_CTX_PDP(ppgtt, ring->registers, 2);
> ASSIGN_CTX_PDP(ppgtt, ring->registers, 1);
> ASSIGN_CTX_PDP(ppgtt, ring->registers, 0);
> ring->registers[CTX_RING_TAIL+1] = req->tail;
>
> which makes a lot more sense, to me, when viewed against the underlying
> architecture of the hardware and comparing against the legacy ringbuffer.
> -Chris

When you say "ring", do you mean "engine" or "ringbuffer"?

The register state can't be associated with the engine /per se/, because 
it has to be per-context as well as per-engine. It doesn't really belong 
with the ringbuffer; in particular I've seen code for allocating the 
ringbuffer in stolen memory and dropping it during hibernation, whereas 
this register state shouldn't be lost across hibernation. So the 
lifetime of a register state image and a ringbuffer are different, 
therefore they don't belong together.

The register state is pretty much the /definition/ of a context, in 
hardware terms. OK, it's got an HWSP and other bits, but the register 
save area is what the h/w really cares about. So it makes sense that the 
kmapping for that area is also part of (the CPU's idea of) the context. Yes,

	ctx.engine[engine_id].registers[regno] = ...

is a bit clumsy, but I'd expect to cache the register-image pointer in a 
local here, along the lines of:

	uint32_t *registers = ctx.engine[engine_id].registers;
	registers[CTX_RING_TAIL+1] = req->tail;

etc.

[aside]
Some of this would be much less clumsy if the anonymous engine[]
struct had a name, say, "engine_info", so we could just do
	struct engine_info *eip = &ctx.engines[engine->id];
once at the beginning of any per-engine function and then use
eip->ringbuf, eip->state, eip->registers, etc without continually 
repeating the 'ctx.' and 'engine->id' bits over and over ...
[/aside]

Apart from that, I think Tvrtko's patch has lost the dirtying from:

 > -	page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN);

in execlists_update_context(), so should add

	set_page_dirty(lrc_state_page)

instead (and that's the use for it, so you /do/ want to cache it).

.Dave.
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-01-12 16:45 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-11 14:08 [PATCH v3 0/7] Misc cleanups and locking fixes Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 1/7] drm/i915/bdw+: Replace list_del+list_add_tail with list_move_tail Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 2/7] drm/i915: Do not call API requiring struct_mutex where it is not available Tvrtko Ursulin
2016-01-11 14:35   ` Chris Wilson
2016-01-12 11:41   ` [PATCH v2 " Tvrtko Ursulin
2016-01-12 15:47     ` Dave Gordon
2016-01-13 16:16       ` [PATCH v3] " Tvrtko Ursulin
2016-01-13 19:34         ` Chris Wilson
2016-01-11 14:08 ` [PATCH 3/7] drm/i915: Cache ringbuffer GTT address Tvrtko Ursulin
2016-01-11 14:30   ` Chris Wilson
2016-01-11 14:31   ` Chris Wilson
2016-01-11 15:06     ` Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 4/7] drm/i915: Cache LRC state page in the context Tvrtko Ursulin
2016-01-11 14:29   ` Chris Wilson
2016-01-11 15:07     ` Tvrtko Ursulin
2016-01-12 11:43     ` [PATCH v2 " Tvrtko Ursulin
2016-01-12 11:56     ` [PATCH v3 " Tvrtko Ursulin
2016-01-12 12:12       ` Chris Wilson
2016-01-12 12:54         ` Tvrtko Ursulin
2016-01-12 13:11           ` Chris Wilson
2016-01-12 16:45             ` Dave Gordon [this message]
2016-01-13  1:37               ` Chris Wilson
2016-01-13 13:49               ` Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 5/7] drm/i915: Don't need a timer to wake us up Tvrtko Ursulin
2016-01-11 14:33   ` Chris Wilson
2016-01-12 10:20     ` Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 6/7] drm/i915: Only grab timestamps when needed Tvrtko Ursulin
2016-01-11 14:36   ` Chris Wilson
2016-01-11 15:04     ` Tvrtko Ursulin
2016-01-12 15:52       ` Dave Gordon
2016-01-12 17:14         ` Daniel Vetter
2016-01-13 13:54           ` [PATCH v2] " Tvrtko Ursulin
2016-01-11 14:08 ` [PATCH 7/7] drm/i915: GEM operations need to be done under the big lock Tvrtko Ursulin
2016-01-11 14:38   ` Chris Wilson
2016-01-11 14:47     ` Tvrtko Ursulin
2016-01-11 15:00       ` Chris Wilson
2016-01-11 15:04         ` Chris Wilson
2016-01-11 15:16           ` Tvrtko Ursulin
2016-01-11 15:36             ` Ville Syrjälä
2016-01-11 16:56               ` Chris Wilson
2016-01-13 12:46                 ` Tvrtko Ursulin
2016-01-13 13:36                   ` Imre Deak
2016-01-13 14:11                     ` Tvrtko Ursulin
2016-01-13 14:32                       ` Chris Wilson
2016-01-13 14:41                         ` Imre Deak
2016-01-13 14:53                           ` Tvrtko Ursulin
2016-01-13 15:25                             ` Imre Deak
2016-01-13 15:55                               ` Daniel Vetter

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=56952D8E.2020508@intel.com \
    --to=david.s.gordon@intel.com \
    --cc=Intel-gfx@lists.freedesktop.org \
    --cc=chris@chris-wilson.co.uk \
    --cc=tvrtko.ursulin@intel.com \
    --cc=tvrtko.ursulin@linux.intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.