From: Tomas Elf <tomas.elf@intel.com>
To: "John.C.Harrison@Intel.com" <John.C.Harrison@Intel.com>,
"Intel-GFX@Lists.FreeDesktop.Org"
<Intel-GFX@Lists.FreeDesktop.Org>
Subject: Re: [PATCH 05/59] drm/i915: Reserve ring buffer space for i915_add_request() commands
Date: Tue, 31 Mar 2015 16:58:51 +0100 [thread overview]
Message-ID: <551AC43B.3050003@intel.com> (raw)
In-Reply-To: <1426768264-16996-6-git-send-email-John.C.Harrison@Intel.com>
Three comments in this one. The reason I mention it is because two are
at the bottom of the patch and one is crammed in the middle.
On 19/03/2015 12:30, John.C.Harrison@Intel.com wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
>
> It is a bad idea for i915_add_request() to fail. The work will already have been
> send to the ring and will be processed, but there will not be any tracking or
> management of that work.
>
> The only way the add request call can fail is if it can't write its epilogue
> commands to the ring (cache flushing, seqno updates, interrupt signalling). The
> reasons for that are mostly down to running out of ring buffer space and the
> problems associated with trying to get some more. This patch prevents that
> situation from happening in the first place.
>
> When a request is created, it marks sufficient space as reserved for the
> epilogue commands. Thus guaranteeing that by the time the epilogue is written,
> there will be plenty of space for it. Note that a ring_begin() call is required
> to actually reserve the space (and do any potential waiting). However, that is
> not currently done at request creation time. This is because the ring_begin()
> code can allocate a request. Hence calling begin() from the request allocation
> code would lead to infinite recursion! Later patches in this series remove the
> need for begin() to do the allocate. At that point, it becomes safe for the
> allocate to call begin() and really reserve the space.
>
> Until then, there is a potential for insufficient space to be available at the
> point of calling i915_add_request(). However, that would only be in the case
> where the request was created and immediately submitted without ever calling
> ring_begin() and adding any work to that request. Which should never happen. And
> even if it does, and if that request happens to fall down the tiny window of
> opportunity for failing due to being out of ring space then does it really
> matter because the request wasn't doing anything in the first place?
>
> For: VIZ-5115
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/i915_gem.c | 47 +++++++++++++++++++++++++++++
> drivers/gpu/drm/i915/intel_lrc.c | 12 ++++++++
> drivers/gpu/drm/i915/intel_ringbuffer.c | 50 +++++++++++++++++++++++++++++--
> drivers/gpu/drm/i915/intel_ringbuffer.h | 9 ++++++
> 5 files changed, 117 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 4ebd421..fe6446d 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2115,6 +2115,7 @@ struct drm_i915_gem_request {
>
> int i915_gem_request_alloc(struct intel_engine_cs *ring,
> struct intel_context *ctx);
> +void i915_gem_request_cancel(struct drm_i915_gem_request *req);
> void i915_gem_request_free(struct kref *req_ref);
>
> static inline uint32_t
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 4824adf..fc383fc 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2344,6 +2344,13 @@ int __i915_add_request(struct intel_engine_cs *ring,
> } else
> ringbuf = ring->buffer;
>
> + /*
> + * To ensure that this call will not fail, space for it's emissions
1. Nitpick: "space for it's emissions" : "it's" -> "its"
> + * should already have been reserved in the ring buffer. Let the ring
> + * know that it is time to use that space up.
> + */
> + intel_ring_reserved_space_use(ringbuf, MIN_SPACE_FOR_ADD_REQUEST);
> +
> request_start = intel_ring_get_tail(ringbuf);
> /*
> * Emit any outstanding flushes - execbuf can fail to emit the flush
> @@ -2426,6 +2433,9 @@ int __i915_add_request(struct intel_engine_cs *ring,
> round_jiffies_up_relative(HZ));
> intel_mark_busy(dev_priv->dev);
>
> + /* Sanity check that the reserved size was large enough. */
> + intel_ring_reserved_space_end(ringbuf);
> +
> return 0;
> }
>
> @@ -2551,10 +2561,47 @@ int i915_gem_request_alloc(struct intel_engine_cs *ring,
> return ret;
> }
>
> + /*
> + * Reserve space in the ring buffer for all the commands required to
> + * eventually emit this request. This is to guarantee that the
> + * i915_add_request() call can't fail. Note that the reserve may need
> + * to be redone if the request is not actually submitted straight
> + * away, e.g. because a GPU scheduler has deferred it.
> + *
> + * Note further that this call merely notes the reserve request. A
> + * subsequent call to *_ring_begin() is required to actually ensure
> + * that the reservation is available. Without the begin, if the
> + * request creator immediately submitted the request without adding
> + * any commands to it then there might not actually be sufficient
> + * room for the submission commands. Unfortunately, the current
> + * *_ring_begin() implementations potentially call back here to
> + * i915_gem_request_alloc(). Thus calling _begin() here would lead to
> + * infinite recursion! Until that back call path is removed, it is
> + * necessary to do a manual _begin() outside.
> + */
> + ret = intel_ring_reserved_space_reserve(request->ringbuf, MIN_SPACE_FOR_ADD_REQUEST);
> + if (ret) {
> + /*
> + * At this point, the request is fully allocated even if not
> + * fully prepared. Thus it can be cleaned up using the proper
> + * free code.
> + */
> + i915_gem_request_cancel(request);
> + return ret;
> + }
> +
> ring->outstanding_lazy_request = request;
> return 0;
> }
>
> +void i915_gem_request_cancel(struct drm_i915_gem_request *req)
> +{
> + intel_ring_reserved_space_use(req->ringbuf, MIN_SPACE_FOR_ADD_REQUEST);
> + intel_ring_reserved_space_end(req->ringbuf);
> +
> + i915_gem_request_unreference(req);
> +}
> +
> struct drm_i915_gem_request *
> i915_gem_find_active_request(struct intel_engine_cs *ring)
> {
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 1c3834fc..bdbdcae 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -636,6 +636,9 @@ static int logical_ring_wait_request(struct intel_ringbuffer *ringbuf,
> struct drm_i915_gem_request *request;
> int ret, new_space;
>
> + /* The whole point of reserving space is to not wait! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> if (intel_ring_space(ringbuf) >= bytes)
> return 0;
>
> @@ -704,6 +707,9 @@ static int logical_ring_wait_for_space(struct intel_ringbuffer *ringbuf,
> unsigned long end;
> int ret;
>
> + /* The whole point of reserving space is to not wait! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> ret = logical_ring_wait_request(ringbuf, bytes);
> if (ret != -ENOSPC)
> return ret;
> @@ -750,6 +756,9 @@ static int logical_ring_wrap_buffer(struct intel_ringbuffer *ringbuf,
> uint32_t __iomem *virt;
> int rem = ringbuf->size - ringbuf->tail;
>
> + /* Can't wrap if space has already been reserved! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> if (ringbuf->space < rem) {
> int ret = logical_ring_wait_for_space(ringbuf, ctx, rem);
>
> @@ -773,6 +782,9 @@ static int logical_ring_prepare(struct intel_ringbuffer *ringbuf,
> {
> int ret;
>
> + if (!ringbuf->reserved_in_use)
> + bytes += ringbuf->reserved_size;
> +
> if (unlikely(ringbuf->tail + bytes > ringbuf->effective_size)) {
> ret = logical_ring_wrap_buffer(ringbuf, ctx);
> if (unlikely(ret))
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index a26bdf8..9075008 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -2061,6 +2061,9 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
> struct drm_i915_gem_request *request;
> int ret, new_space;
>
> + /* The whole point of reserving space is to not wait! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> if (intel_ring_space(ringbuf) >= n)
> return 0;
>
> @@ -2093,6 +2096,9 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
> unsigned long end;
> int ret;
>
> + /* The whole point of reserving space is to not wait! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> ret = intel_ring_wait_request(ring, n);
> if (ret != -ENOSPC)
> return ret;
> @@ -2143,6 +2149,9 @@ static int intel_wrap_ring_buffer(struct intel_engine_cs *ring)
> struct intel_ringbuffer *ringbuf = ring->buffer;
> int rem = ringbuf->size - ringbuf->tail;
>
> + /* Can't wrap if space has already been reserved! */
> + WARN_ON(ringbuf->reserved_in_use);
> +
> if (ringbuf->space < rem) {
> int ret = ring_wait_for_space(ring, rem);
> if (ret)
> @@ -2190,12 +2199,49 @@ int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request)
> return 0;
> }
>
> -static int __intel_ring_prepare(struct intel_engine_cs *ring,
> - int bytes)
> +int intel_ring_reserved_space_reserve(struct intel_ringbuffer *ringbuf, int size)
> +{
> + /* NB: Until request management is fully tidied up and the OLR is
> + * removed, there are too many ways for get false hits on this
> + * anti-recursion check! */
> + /*WARN_ON(ringbuf->reserved_size);*/
> + WARN_ON(ringbuf->reserved_in_use);
> +
> + ringbuf->reserved_size = size;
> +
> + /*
> + * Really need to call _begin() here but that currently leads to
> + * recursion problems! So just return zero and hope for the best...
> + */
> + return 0;
> +}
> +
> +void intel_ring_reserved_space_use(struct intel_ringbuffer *ringbuf, int size)
> +{
> + WARN_ON(size > ringbuf->reserved_size);
> + WARN_ON(ringbuf->reserved_in_use);
> +
> + ringbuf->reserved_in_use = true;
> + ringbuf->reserved_tail = ringbuf->tail;
> +}
> +
> +void intel_ring_reserved_space_end(struct intel_ringbuffer *ringbuf)
> +{
> + WARN_ON(!ringbuf->reserved_in_use);
> + WARN_ON(ringbuf->tail > ringbuf->reserved_tail + ringbuf->reserved_size);
> +
> + ringbuf->reserved_size = 0;
> + ringbuf->reserved_in_use = false;
> +}
> +
> +static int __intel_ring_prepare(struct intel_engine_cs *ring, int bytes)
> {
> struct intel_ringbuffer *ringbuf = ring->buffer;
> int ret;
>
> + if (!ringbuf->reserved_in_use)
> + bytes += ringbuf->reserved_size;
> +
> if (unlikely(ringbuf->tail + bytes > ringbuf->effective_size)) {
> ret = intel_wrap_ring_buffer(ring);
> if (unlikely(ret))
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 6566dd4..b334459 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -104,6 +104,9 @@ struct intel_ringbuffer {
> int space;
> int size;
> int effective_size;
> + int reserved_size;
> + int reserved_tail;
> + bool reserved_in_use;
>
> /** We track the position of the requests in the ring buffer, and
> * when each is retired we increment last_retired_head as the GPU
> @@ -442,4 +445,10 @@ intel_ring_get_request(struct intel_engine_cs *ring)
> return ring->outstanding_lazy_request;
> }
>
> +#define MIN_SPACE_FOR_ADD_REQUEST 128
2. How was this value derived? How do we know that it works properly for
all platforms? Can be be sure that it's enough to make sure that
add_request does not fail later?
> +
> +int intel_ring_reserved_space_reserve(struct intel_ringbuffer *ringbuf, int size);
> +void intel_ring_reserved_space_use(struct intel_ringbuffer *ringbuf, int size);
> +void intel_ring_reserved_space_end(struct intel_ringbuffer *ringbuf);
> +
3. The relationship between these functions and where they belong on the
request submission timeline are not obvious here. These functions are
conceptually not that difficult to grasp once you read the code (and
read through all of the patches in this patch series) but it could be
made much easier by adding a decent description of a) The purpose of
each function and b) When each function should be used in relation to
the other functions.
Thanks,
Tomas
> #endif /* _INTEL_RINGBUFFER_H_ */
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-03-31 15:58 UTC|newest]
Thread overview: 122+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-19 12:30 [PATCH 00/59] Remove the outstanding_lazy_request John.C.Harrison
2015-03-19 12:30 ` [PATCH 01/59] drm/i915: Rename 'do_execbuf' to 'execbuf_submit' John.C.Harrison
2015-03-31 15:45 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 02/59] drm/i915: Make intel_logical_ring_begin() static John.C.Harrison
2015-03-31 15:47 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 03/59] drm/i915: Move common request allocation code into a common function John.C.Harrison
2015-03-31 15:48 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 04/59] drm/i915: Fix for ringbuf space wait in LRC mode John.C.Harrison
2015-03-19 14:56 ` Daniel, Thomas
2015-03-31 15:50 ` Tomas Elf
2015-04-01 5:56 ` Daniel Vetter
2015-04-01 12:00 ` John Harrison
2015-04-01 8:53 ` Chris Wilson
2015-03-19 12:30 ` [PATCH 05/59] drm/i915: Reserve ring buffer space for i915_add_request() commands John.C.Harrison
2015-03-20 15:13 ` Daniel Vetter
2015-03-20 15:55 ` John Harrison
2015-03-23 8:54 ` Daniel Vetter
2015-03-31 16:03 ` Chris Wilson
2015-03-20 16:19 ` John Harrison
2015-03-20 18:13 ` John Harrison
2015-03-31 15:58 ` Tomas Elf [this message]
2015-03-19 12:30 ` [PATCH 06/59] drm/i915: i915_add_request must not fail John.C.Harrison
2015-03-19 12:30 ` [PATCH 07/59] drm/i915: Early alloc request in execbuff John.C.Harrison
2015-03-31 16:09 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 08/59] drm/i915: Set context in request from creation even in legacy mode John.C.Harrison
2015-03-31 16:10 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 09/59] drm/i915: Merged the many do_execbuf() parameters into a structure John.C.Harrison
2015-03-31 16:16 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 10/59] drm/i915: Simplify i915_gem_execbuffer_retire_commands() parameters John.C.Harrison
2015-03-19 12:30 ` [PATCH 11/59] drm/i915: Update alloc_request to return the allocated request John.C.Harrison
2015-03-31 16:20 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 12/59] drm/i915: Add request to execbuf params and add explicit cleanup John.C.Harrison
2015-03-19 12:30 ` [PATCH 13/59] drm/i915: Update the dispatch tracepoint to use params->request John.C.Harrison
2015-03-19 12:30 ` [PATCH 14/59] drm/i915: Update move_to_gpu() to take a request structure John.C.Harrison
2015-03-19 12:30 ` [PATCH 15/59] drm/i915: Update execbuffer_move_to_active() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 16/59] drm/i915: Add flag to i915_add_request() to skip the cache flush John.C.Harrison
2015-03-31 16:32 ` Tomas Elf
2015-04-01 5:59 ` Daniel Vetter
2015-04-01 8:52 ` Chris Wilson
2015-03-19 12:30 ` [PATCH 17/59] drm/i915: Update i915_gpu_idle() to manage its own request John.C.Harrison
2015-03-19 12:30 ` [PATCH 18/59] drm/i915: Split i915_ppgtt_init_hw() in half - generic and per ring John.C.Harrison
2015-03-31 16:34 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 19/59] drm/i915: Moved the for_each_ring loop outside of i915_gem_context_enable() John.C.Harrison
2015-03-19 12:30 ` [PATCH 20/59] drm/i915: Don't tag kernel batches as user batches John.C.Harrison
2015-03-31 16:35 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 21/59] drm/i915: Add explicit request management to i915_gem_init_hw() John.C.Harrison
2015-03-31 16:38 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 22/59] drm/i915: Update ppgtt_init_ring() & context_enable() to take requests John.C.Harrison
2015-03-31 16:38 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 23/59] drm/i915: Update i915_switch_context() to take a request structure John.C.Harrison
2015-03-19 12:30 ` [PATCH 24/59] drm/i915: Update do_switch() " John.C.Harrison
2015-03-31 16:40 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 25/59] drm/i915: Update deferred context creation to do explicit request management John.C.Harrison
2015-03-31 16:43 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 26/59] drm/i915: Update init_context() to take a request structure John.C.Harrison
2015-03-19 12:30 ` [PATCH 27/59] drm/i915: Update render_state_init() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 28/59] drm/i915: Update i915_gem_object_sync() " John.C.Harrison
2015-03-31 16:53 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 29/59] drm/i915: Update overlay code to do explicit request management John.C.Harrison
2015-03-31 16:53 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 30/59] drm/i915: Update queue_flip() to take a request structure John.C.Harrison
2015-03-31 16:54 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 31/59] drm/i915: Update add_request() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 32/59] drm/i915: Update [vma|object]_move_to_active() to take request structures John.C.Harrison
2015-03-19 12:30 ` [PATCH 33/59] drm/i915: Update l3_remap to take a request structure John.C.Harrison
2015-03-19 12:30 ` [PATCH 34/59] drm/i915: Update mi_set_context() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 35/59] drm/i915: Update a bunch of execbuffer helpers to take request structures John.C.Harrison
2015-03-19 12:30 ` [PATCH 36/59] drm/i915: Update workarounds_emit() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 37/59] drm/i915: Update flush_all_caches() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 38/59] drm/i915: Update switch_mm() to take a request structure John.C.Harrison
2015-03-31 16:57 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 39/59] drm/i915: Update ring->flush() to take a requests structure John.C.Harrison
2015-03-31 16:59 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 40/59] drm/i915: Update some flush helpers to take request structures John.C.Harrison
2015-03-19 12:30 ` [PATCH 41/59] drm/i915: Update ring->emit_flush() to take a request structure John.C.Harrison
2015-03-19 12:30 ` [PATCH 42/59] drm/i915: Update ring->add_request() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 43/59] drm/i915: Update ring->emit_request() " John.C.Harrison
2015-03-31 17:01 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 44/59] drm/i915: Update ring->dispatch_execbuffer() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 45/59] drm/i915: Update ring->emit_bb_start() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 46/59] drm/i915: Update ring->sync_to() " John.C.Harrison
2015-03-31 17:03 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 47/59] drm/i915: Update ring->signal() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 48/59] drm/i915: Update cacheline_align() " John.C.Harrison
2015-03-19 12:30 ` [PATCH 49/59] drm/i915: Update intel_ring_begin() " John.C.Harrison
2015-03-31 17:04 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 50/59] drm/i915: Update intel_logical_ring_begin() " John.C.Harrison
2015-03-31 17:05 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 51/59] drm/i915: Add *_ring_begin() to request allocation John.C.Harrison
2015-03-20 15:23 ` Daniel Vetter
2015-03-20 15:30 ` Chris Wilson
2015-03-20 16:09 ` John Harrison
2015-03-23 9:10 ` Daniel Vetter
2015-03-31 17:17 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 52/59] drm/i915: Remove the now obsolete intel_ring_get_request() John.C.Harrison
2015-03-19 12:30 ` [PATCH 53/59] drm/i915: Remove the now obsolete 'outstanding_lazy_request' John.C.Harrison
2015-03-31 18:01 ` Tomas Elf
2015-03-19 12:30 ` [PATCH 54/59] drm/i915: Move the request/file and request/pid association to creation time John.C.Harrison
2015-03-31 18:07 ` Tomas Elf
2015-03-19 12:31 ` [PATCH 55/59] drm/i915: Remove fallback poll for ring buffer space John.C.Harrison
2015-03-19 15:00 ` Daniel, Thomas
2015-03-19 15:16 ` Jani Nikula
2015-03-19 16:33 ` John Harrison
2015-03-19 17:29 ` Daniel Vetter
2015-03-31 18:13 ` Tomas Elf
2015-04-01 6:02 ` Daniel Vetter
2015-04-01 8:51 ` Chris Wilson
2015-03-19 12:31 ` [PATCH 56/59] drm/i915: Remove 'faked' request from LRC submission John.C.Harrison
2015-03-19 15:02 ` Daniel, Thomas
2015-03-31 18:14 ` Tomas Elf
2015-03-19 12:31 ` [PATCH 57/59] drm/i915: Update a bunch of LRC functions to take requests John.C.Harrison
2015-03-31 18:18 ` Tomas Elf
2015-03-19 12:31 ` [PATCH 58/59] drm/i915: Remove the now obsolete 'i915_gem_check_olr()' John.C.Harrison
2015-03-31 18:18 ` Tomas Elf
2015-03-19 12:31 ` [PATCH 59/59] drm/i915: Remove the almost obsolete i915_gem_object_flush_active() John.C.Harrison
2015-03-31 18:32 ` Tomas Elf
2015-04-01 6:06 ` Daniel Vetter
2015-05-28 20:02 ` [PATCH 00/59] Remove the outstanding_lazy_request Jesse Barnes
2015-05-28 21:20 ` Chris Wilson
2015-05-29 14:37 ` Jesse Barnes
2015-05-29 18:07 ` Chris Wilson
2015-05-29 11:00 ` John Harrison
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=551AC43B.3050003@intel.com \
--to=tomas.elf@intel.com \
--cc=Intel-GFX@Lists.FreeDesktop.Org \
--cc=John.C.Harrison@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox