From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
To: John Harrison <John.C.Harrison@Intel.com>,
Intel-GFX@Lists.FreeDesktop.Org
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: Re: [PATCH v4 07/38] drm/i915: Start of GPU scheduler
Date: Fri, 19 Feb 2016 12:13:43 +0200 [thread overview]
Message-ID: <1455876823.7321.33.camel@linux.intel.com> (raw)
In-Reply-To: <56C5D3C0.5070406@Intel.com>
Hi,
Adding Daniel as CC to comment below.
On to, 2016-02-18 at 14:22 +0000, John Harrison wrote:
> On 20/01/2016 13:18, Joonas Lahtinen wrote:
> > On Mon, 2016-01-11 at 18:42 +0000, John.C.Harrison@Intel.com wrote:
> > > From: John Harrison <John.C.Harrison@Intel.com>
> > >
<SNIP>
> > >
> > > + this = node->saved_objects + i;
> > > +
> > > + for (j = 0; j < test->num_objs; j++) {
> > > + that = test->saved_objects + j;
> > > +
> > > + if (this->obj != that->obj)
> > > + continue;
> > How about VMAs? There might be multiple mappings to an object, isn't it
> > enough to depend on the required VMA instead of the whole object?
> The object is what we get coming in from user land through the IOCTL. So
> why make things more complicated? If there are multiple VMAs referring
> to the same object then we can't just track an individual VMA as that
> would loose the dependency on all the other VMAs. Just because the
> object is mapped to someone else's address space doesn't mean that this
> batch buffer can't overwrite data they are reading.
>
Right, makes sense.
> > > +int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe)
> > > +{
> > > + struct drm_i915_private *dev_priv = qe->params.dev->dev_private;
> > > + struct i915_scheduler *scheduler = dev_priv->scheduler;
> > > + struct intel_engine_cs *ring = qe->params.ring;
> > > + struct i915_scheduler_queue_entry *node;
> > > + struct i915_scheduler_queue_entry *test;
> > > + unsigned long flags;
> > > + bool not_flying;
> > > + int i, r;
> > > + int incomplete = 0;
> > > +
> > > + WARN_ON(!scheduler);
> > > +
> > This kind of situations should have a be a BUG_ON, because scheduler
> > being zero is literally going to cause an OOPS in the next dereference
> > which is going to happen unconditionally. WARN + OOPS is kind of what
> > BUG_ON should be used avoid. But this should be removed anyway after
> > scheduler is made a data member of dev_priv.
>
> The WARNs were originally BUGs but Daniel Vetter had the opposite
> demand. His view was the driver should never BUG under any
> circumstances. A WARN followed by an oops is better than a BUG because
> maybe it won't actually oops.
>
WARN_ON is better than BUG_ON when there won't be an immediate OOPS.
But if you're doing a null pointer dereference like here if scheduler
is NULL, it is 100% sure it is going to either OOPS or cause horrible
undefined behaviour (on non-x86 platform).
Something like;
if (WARN_ON(!a))
return -ENODEV;
Could be what Daniel meant (if the error is propagated up and somehow
dealt with), but;
WARN_ON(!a);
a->foo = bar;
Should simply be BUG_ON(!a), because otherwise it'll just end up being
WARNING + OOPS right after each other.
>
> >
> > > + if (1/*i915.scheduler_override & i915_so_direct_submit*/) {
> > I assume this is going to be addressed in a future commit. Could have
> > been introduced in this patch, too.
> >
> > > + int ret;
> > > +
> > > + scheduler->flags[qe->params.ring->id] |= i915_sf_submitting;
> > > + ret = dev_priv->gt.execbuf_final(&qe->params);
> > > + scheduler->flags[qe->params.ring->id] &= ~i915_sf_submitting;
> > > +
> > The kerneldoc should mention locking requirements of this function.
> >
> > > + /*
> > > + * Don't do any clean up on failure because the caller will
> > > + * do it all anyway.
> > > + */
> > > + if (ret)
> > > + return ret;
> > > +
> > > + /* Free everything that is owned by the QE structure: */
> > > + kfree(qe->params.cliprects);
> > > + if (qe->params.dispatch_flags & I915_DISPATCH_SECURE)
> > > + i915_gem_execbuff_release_batch_obj(qe->params.batch_obj);
> > > +
> > > + return 0;
> > Above piece of code looks like its own function, so it should probably
> > be one.
> >
> > > + }
> > > +
> > > + node = kmalloc(sizeof(*node), GFP_KERNEL);
> > > + if (!node)
> > > + return -ENOMEM;
> > > +
> > > + *node = *qe;
> > Any reason we can't simply move ownership of qe? If not, I'd rather
> > make a clone function
>
> The qe pointer passed in is a reference to a stack local object in the
> execbuff code path. Thus ownership cannot be transferred. Doing it this
> way keeps the execbuff code nice and simple and all the dynamic memory
> management and list tracking is self contained within the scheduler.
>
I would indicate this with const qualifier in the function parameter.
> > > +
> > > +static int i915_scheduler_fly_node(struct i915_scheduler_queue_entry *node)
> > > +{
> > > + struct drm_i915_private *dev_priv = node->params.dev->dev_private;
> > > + struct i915_scheduler *scheduler = dev_priv->scheduler;
> > > + struct intel_engine_cs *ring;
> > > +
> > > + WARN_ON(!scheduler);
> > > + WARN_ON(!node);
> > > + WARN_ON(node->status != i915_sqs_popped);
> > Other states had their I915_SQS_IS_* macro, why some don't?
> The purpose of the macro is to allow the combining of individual states
> into classes. E.g. dead and complete can both be considered complete for
> the majority of cases. Only in certain situations do you need to know
> that it really was dead. Hence most places that don't really care just
> use the merged macros, whereas places like this that do care use the
> explicit enum value.
>
Right, just asking cause having a macro might increase consistency.
Also here, we have WARN_ON(!node), and then next line dereferencing
node, which again is surely better off as BUG_ON.
Although it's not unreasonable to expect function to OOPS if you pass
null pointer. I think only the higher calling level should have
if(WARN_ON(!node)) return ... or BUG_ON construct, before calling this
function.
Only calls coming from userland need to be treated with such care that
anything can be passed, not internal functions. We're not having
BUG_ON(!dev) or BUG_ON(!dev_priv) around either.
> > > + /*
> > > + * In the case where the system is idle, starting 'min_seqno' from a big
> > > + * number will cause all nodes to be removed as they are now back to
> > > + * being in-order. However, this will be a problem if the last one to
> > > + * complete was actually out-of-order as the ring seqno value will be
> > > + * lower than one or more completed buffers. Thus code looking for the
> > > + * completion of said buffers will wait forever.
> > > + * Instead, use the hardware seqno as the starting point. This means
> > > + * that some buffers might be kept around even in a completely idle
> > > + * system but it should guarantee that no-one ever gets confused when
> > > + * waiting for buffer completion.
> > > + */
> > > + min_seqno = ring->get_seqno(ring, true);
> > > +
> > > + list_for_each_entry(node, &scheduler->node_queue[ring->id], link) {
> > > + if (I915_SQS_IS_QUEUED(node))
> > > + queued++;
> > > + else if (I915_SQS_IS_FLYING(node))
> > > + flying++;
> > > + else if (I915_SQS_IS_COMPLETE(node))
> > > + continue;
> > > +
> > > + if (node->params.request->seqno == 0)
> > > + continue;
> > > +
> > > + if (!i915_seqno_passed(node->params.request->seqno, min_seqno))
> > > + min_seqno = node->params.request->seqno;
> > > + }
> > Couldn't these values be kept cached, instead of counting them at each
> > function?
> The 'queued' and flying totals could be kept cached but min_seqno is
> dependent upon the state of the hardware so needs to be recalculated. In
> which case calculating the totals here is trivial and avoids having
> extra code elsewhere to keep them up to date.
>
Ok.
Btw, for_each_scheduler_node or such would be a great macro. Those are
very much preferred for readability.
$ fgrep for_each_ drivers/gpu/drm/i915/* | wc -l
525
> >
> > > +
> > > + INIT_LIST_HEAD(&remove);
> > > + list_for_each_entry_safe(node, node_next, &scheduler->node_queue[ring->id], link) {
> > > + /*
> > > + * Only remove completed nodes which have a lower seqno than
> > > + * all pending nodes. While there is the possibility of the
> > > + * ring's seqno counting backwards, all higher buffers must
> > > + * be remembered so that the 'i915_seqno_passed()' test can
> > > + * report that they have in fact passed.
> > > + *
> > > + * NB: This is not true for 'dead' nodes. The GPU reset causes
> > > + * the software seqno to restart from its initial value. Thus
> > > + * the dead nodes must be removed even though their seqno values
> > > + * are potentially vastly greater than the current ring seqno.
> > > + */
> > > + if (!I915_SQS_IS_COMPLETE(node))
> > > + continue;
> > > +
> > > + if (node->status != i915_sqs_dead) {
> > > + if (i915_seqno_passed(node->params.request->seqno, min_seqno) &&
> > > + (node->params.request->seqno != min_seqno))
> > > + continue;
> > > + }
> > > +
> > > + list_del(&node->link);
> > > + list_add(&node->link, &remove);
> > > +
> > > + /* Strip the dependency info while the mutex is still locked */
> > > + i915_scheduler_remove_dependent(scheduler, node);
> > > +
> > > + continue;
> > > + }
<SNIP>
> > > + do {
> > > + WARN_ON(!node);
> > > + WARN_ON(node->params.ring != ring);
> > > + WARN_ON(node->status != i915_sqs_popped);
> > > + count++;
> > > +
> > > + /*
> > > + * The call to pop above will have removed the node from the
> > > + * list. So add it back in and mark it as in flight.
> > > + */
> > > + i915_scheduler_fly_node(node);
> > Why do we want to pull an object out of the list inside spin lock and
> > push it back immediately in our critical code path? Seems like a waste
> > for no obvious gain at this point. Why do not we rather just select an
> > entry and modify it in-place, if it's going to stay in the same queue
> > anyway.
> The list order is significant. The element must be moved to the front to
> keep the submitted items in submission order. Doing it this way also
> keeps the code nicely partitioned and easier to understand/maintain.
> Plus, there is a plan to optimise the code by splitting the one single
> list into three separate ones - queued, flying, complete. If/when that
> happens, the element will have to be removed from one list and added to
> another.
Ok.
>
> >
> > > +
> > > + scheduler->flags[ring->id] |= i915_sf_submitting;
> > > + spin_unlock_irqrestore(&scheduler->lock, flags);
> > > + ret = dev_priv->gt.execbuf_final(&node->params);
> > > + spin_lock_irqsave(&scheduler->lock, flags);
> > > + scheduler->flags[ring->id] &= ~i915_sf_submitting;
> > > +
> > > + if (ret) {
> > > + int requeue = 1;
> > Multipurpose variable, not really a good idea. And as commented
> > further, should not exist at all.
> >
> > > +
> > > + /*
> > > + * Oh dear! Either the node is broken or the ring is
> > > + * busy. So need to kill the node or requeue it and try
> > > + * again later as appropriate.
> > > + */
> > > +
> > > + switch (-ret) {
> > > + case ENODEV:
> > > + case ENOENT:
> > > + /* Fatal errors. Kill the node. */
> > > + requeue = -1;
> > > + break;
> > "break" indent is wrong.
> >
> > > +
> > > + case EAGAIN:
> > > + case EBUSY:
> > > + case EIO:
> > > + case ENOMEM:
> > > + case ERESTARTSYS:
> > > + case EINTR:
> > > + /* Supposedly recoverable errors. */
> > > + break;
> > > +
> > > + default:
> > > + /*
> > > + * Assume the error is recoverable and hope
> > > + * for the best.
> > > + */
> > > + DRM_DEBUG_DRIVER("<%s> Got unexpected error from execfinal(): %d!\n",
> > > + ring->name, ret);
> > There's MISSING_CASE macro, should use it.
> >
> > > + break;
> > > + }
> > > +
> > Just move the code below this point to the switch, no point having a
> > switch to categorize your options and then doing bunch of ifs to
> > execute code that could be in switch.
> One of the 'if' paths is to break out of the while loop. Can't do that
> from inside the switch.
I do think the code could still be simplified, even if it involved a
carefully placed goto.
>
> > > + /*
> > > + * Check that the watchdog/reset code has not nuked
> > > + * the node while we weren't looking:
> > > + */
> > > + if (node->status == i915_sqs_dead)
> > > + requeue = 0;
Btw, just noticed, should some locking of node occur? Is it handled
gracefully if right after this check, the status is changed, or do we
have a race condition here?
>
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-02-19 10:14 UTC|newest]
Thread overview: 143+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-23 11:38 [PATCH 00/39] GPU scheduler for i915 driver John.C.Harrison
2015-11-23 11:38 ` [PATCH 01/39] drm/i915: Add total count to context status debugfs output John.C.Harrison
2016-01-08 9:50 ` Joonas Lahtinen
2015-11-23 11:38 ` [PATCH 02/39] drm/i915: Updating assorted register and status page definitions John.C.Harrison
2016-01-08 12:26 ` Joonas Lahtinen
2016-01-11 7:47 ` Daniel Vetter
2015-11-23 11:38 ` [PATCH 03/39] drm/i915: Explicit power enable during deferred context initialisation John.C.Harrison
2016-01-08 12:35 ` Joonas Lahtinen
2015-11-23 11:38 ` [PATCH 04/39] drm/i915: Prelude to splitting i915_gem_do_execbuffer in two John.C.Harrison
2015-11-23 11:39 ` [PATCH 05/39] drm/i915: Split i915_dem_do_execbuffer() in half John.C.Harrison
2015-12-11 13:15 ` [PATCH 05/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 06/39] drm/i915: Re-instate request->uniq because it is extremely useful John.C.Harrison
2015-11-23 11:39 ` [PATCH 07/39] drm/i915: Start of GPU scheduler John.C.Harrison
2015-12-11 13:16 ` [PATCH 08/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 08/39] drm/i915: Prepare retire_requests to handle out-of-order seqnos John.C.Harrison
2015-11-23 11:39 ` [PATCH 09/39] drm/i915: Disable hardware semaphores when GPU scheduler is enabled John.C.Harrison
2015-11-23 11:39 ` [PATCH 10/39] drm/i915: Force MMIO flips when scheduler enabled John.C.Harrison
2015-11-23 11:39 ` [PATCH 11/39] drm/i915: Added scheduler hook when closing DRM file handles John.C.Harrison
2015-12-11 13:19 ` [PATCH 12/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 12/39] drm/i915: Added scheduler hook into i915_gem_request_notify() John.C.Harrison
2015-11-23 11:39 ` [PATCH 13/39] drm/i915: Added deferred work handler for scheduler John.C.Harrison
2015-11-23 11:39 ` [PATCH 14/39] drm/i915: Redirect execbuffer_final() via scheduler John.C.Harrison
2015-11-23 11:39 ` [PATCH 15/39] drm/i915: Keep the reserved space mechanism happy John.C.Harrison
2015-12-11 13:19 ` [PATCH 16/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 16/39] drm/i915: Added tracking/locking of batch buffer objects John.C.Harrison
2015-12-11 13:19 ` [PATCH 17/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 17/39] drm/i915: Hook scheduler node clean up into retire requests John.C.Harrison
2015-12-11 13:19 ` [PATCH 18/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 18/39] drm/i915: Added scheduler support to __wait_request() calls John.C.Harrison
2015-12-11 13:20 ` [PATCH 19/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 19/39] drm/i915: Added scheduler support to page fault handler John.C.Harrison
2015-11-23 11:39 ` [PATCH 20/39] drm/i915: Added scheduler flush calls to ring throttle and idle functions John.C.Harrison
2015-12-11 13:20 ` [PATCH 21/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 21/39] drm/i915: Added a module parameter for allowing scheduler overrides John.C.Harrison
2015-11-23 11:39 ` [PATCH 22/39] drm/i915: Support for 'unflushed' ring idle John.C.Harrison
2015-11-23 11:39 ` [PATCH 23/39] drm/i915: Defer seqno allocation until actual hardware submission time John.C.Harrison
2015-12-11 13:20 ` [PATCH 24/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 24/39] drm/i915: Added immediate submission override to scheduler John.C.Harrison
2015-11-23 11:39 ` [PATCH 25/39] drm/i915: Add sync wait support " John.C.Harrison
2015-11-23 11:39 ` [PATCH 26/39] drm/i915: Connecting execbuff fences " John.C.Harrison
2015-11-23 11:39 ` [PATCH 27/39] drm/i915: Added trace points " John.C.Harrison
2015-12-11 13:20 ` [PATCH 28/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 28/39] drm/i915: Added scheduler queue throttling by DRM file handle John.C.Harrison
2015-12-11 13:21 ` [PATCH 29/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 29/39] drm/i915: Added debugfs interface to scheduler tuning parameters John.C.Harrison
2015-11-23 11:39 ` [PATCH 30/39] drm/i915: Added debug state dump facilities to scheduler John.C.Harrison
2015-12-11 13:21 ` [PATCH 31/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 31/39] drm/i915: Add early exit to execbuff_final() if insufficient ring space John.C.Harrison
2015-12-11 13:21 ` [PATCH 32/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 32/39] drm/i915: Added scheduler statistic reporting to debugfs John.C.Harrison
2015-12-11 13:21 ` [PATCH 33/40] " John.C.Harrison
2015-11-23 11:39 ` [PATCH 33/39] drm/i915: Added seqno values to scheduler status dump John.C.Harrison
2015-11-23 11:39 ` [PATCH 34/39] drm/i915: Add scheduler support functions for TDR John.C.Harrison
2015-11-23 11:39 ` [PATCH 35/39] drm/i915: GPU priority bumping to prevent starvation John.C.Harrison
2015-11-23 11:39 ` [PATCH 36/39] drm/i915: Scheduler state dump via debugfs John.C.Harrison
2015-11-23 11:39 ` [PATCH 37/39] drm/i915: Enable GPU scheduler by default John.C.Harrison
2015-11-23 11:39 ` [PATCH 38/39] drm/i915: Add scheduling priority to per-context parameters John.C.Harrison
2015-11-23 11:39 ` [PATCH 39/39] drm/i915: Allow scheduler to manage inter-ring object synchronisation John.C.Harrison
2015-12-11 13:16 ` [PATCH 06/40] drm/i915: Cache request pointer in *_submission_final() John.C.Harrison
2015-12-11 13:23 ` [PATCH 00/40] GPU scheduler for i915 driver John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 00/38] " John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 01/38] drm/i915: Add total count to context status debugfs output John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 02/38] drm/i915: Explicit power enable during deferred context initialisation John.C.Harrison
2016-01-12 0:20 ` Chris Wilson
2016-01-12 11:11 ` John Harrison
2016-01-12 11:28 ` Chris Wilson
2016-01-12 11:50 ` John Harrison
2016-01-12 14:04 ` Daniel Vetter
2016-01-12 14:21 ` John Harrison
2016-01-12 15:35 ` Daniel Vetter
2016-01-12 15:59 ` Imre Deak
2016-01-12 16:11 ` Daniel Vetter
2016-01-12 16:59 ` Chris Wilson
2016-01-11 18:42 ` [PATCH v4 03/38] drm/i915: Prelude to splitting i915_gem_do_execbuffer in two John.C.Harrison
2016-02-04 17:01 ` Jesse Barnes
2016-02-12 16:18 ` John Harrison
2016-01-11 18:42 ` [PATCH v4 04/38] drm/i915: Split i915_dem_do_execbuffer() in half John.C.Harrison
2016-01-11 22:03 ` Chris Wilson
2016-02-04 17:08 ` Jesse Barnes
2016-01-11 18:42 ` [PATCH v4 05/38] drm/i915: Cache request pointer in *_submission_final() John.C.Harrison
2016-02-04 17:09 ` Jesse Barnes
2016-01-11 18:42 ` [PATCH v4 06/38] drm/i915: Re-instate request->uniq because it is extremely useful John.C.Harrison
2016-01-11 22:04 ` Chris Wilson
2016-01-12 11:16 ` John Harrison
2016-01-11 18:42 ` [PATCH v4 07/38] drm/i915: Start of GPU scheduler John.C.Harrison
2016-01-20 13:18 ` Joonas Lahtinen
2016-02-18 14:22 ` John Harrison
2016-02-19 10:13 ` Joonas Lahtinen [this message]
2016-01-11 18:42 ` [PATCH v4 08/38] drm/i915: Prepare retire_requests to handle out-of-order seqnos John.C.Harrison
2016-01-11 22:10 ` Chris Wilson
2016-02-04 17:14 ` Jesse Barnes
2016-01-11 18:42 ` [PATCH v4 09/38] drm/i915: Disable hardware semaphores when GPU scheduler is enabled John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 10/38] drm/i915: Force MMIO flips when scheduler enabled John.C.Harrison
2016-01-11 22:16 ` Chris Wilson
2016-01-12 11:19 ` John Harrison
2016-01-12 14:07 ` Daniel Vetter
2016-01-12 21:53 ` Chris Wilson
2016-01-13 12:37 ` John Harrison
2016-01-13 13:14 ` Chris Wilson
2016-01-11 18:42 ` [PATCH v4 11/38] drm/i915: Added scheduler hook when closing DRM file handles John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 12/38] drm/i915: Added scheduler hook into i915_gem_request_notify() John.C.Harrison
2016-01-11 22:14 ` Chris Wilson
2016-01-12 11:25 ` John Harrison
2016-01-11 18:42 ` [PATCH v4 13/38] drm/i915: Added deferred work handler for scheduler John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 14/38] drm/i915: Redirect execbuffer_final() via scheduler John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 15/38] drm/i915: Keep the reserved space mechanism happy John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 16/38] drm/i915: Added tracking/locking of batch buffer objects John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 17/38] drm/i915: Hook scheduler node clean up into retire requests John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 18/38] drm/i915: Added scheduler support to __wait_request() calls John.C.Harrison
2016-01-11 23:14 ` Chris Wilson
2016-01-12 11:28 ` John Harrison
2016-01-11 18:42 ` [PATCH v4 19/38] drm/i915: Added scheduler support to page fault handler John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 20/38] drm/i915: Added scheduler flush calls to ring throttle and idle functions John.C.Harrison
2016-01-11 22:20 ` Chris Wilson
2016-01-11 18:42 ` [PATCH v4 21/38] drm/i915: Added a module parameter for allowing scheduler overrides John.C.Harrison
2016-01-11 22:24 ` Chris Wilson
2016-01-12 11:34 ` John Harrison
2016-01-12 11:55 ` Chris Wilson
2016-01-11 18:42 ` [PATCH v4 22/38] drm/i915: Support for 'unflushed' ring idle John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 23/38] drm/i915: Defer seqno allocation until actual hardware submission time John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 24/38] drm/i915: Added immediate submission override to scheduler John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 25/38] drm/i915: Added trace points " John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 26/38] drm/i915: Added scheduler queue throttling by DRM file handle John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 27/38] drm/i915: Added debugfs interface to scheduler tuning parameters John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 28/38] drm/i915: Added debug state dump facilities to scheduler John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 29/38] drm/i915: Add early exit to execbuff_final() if insufficient ring space John.C.Harrison
2016-01-11 18:42 ` [PATCH v4 30/38] drm/i915: Added scheduler statistic reporting to debugfs John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 31/38] drm/i915: Added seqno values to scheduler status dump John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 32/38] drm/i915: Add scheduler support functions for TDR John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 33/38] drm/i915: GPU priority bumping to prevent starvation John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 34/38] drm/i915: Scheduler state dump via debugfs John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 35/38] drm/i915: Enable GPU scheduler by default John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 36/38] drm/i915: Add scheduling priority to per-context parameters John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 37/38] drm/i915: Add support for retro-actively banning batch buffers John.C.Harrison
2016-01-11 18:43 ` [PATCH v4 38/38] drm/i915: Allow scheduler to manage inter-ring object synchronisation John.C.Harrison
2016-01-11 22:07 ` Chris Wilson
2016-01-12 11:38 ` John Harrison
2016-01-11 18:43 ` [PATCH] igt/gem_ctx_param_basic: Updated to support scheduler priority interface John.C.Harrison
2016-01-11 23:52 ` [PATCH v4 00/38] GPU scheduler for i915 driver Chris Wilson
2016-01-12 4:37 ` Tian, Kevin
2016-01-12 11:43 ` John Harrison
2016-01-12 13:49 ` Dave Gordon
2016-01-13 2:33 ` Tian, Kevin
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=1455876823.7321.33.camel@linux.intel.com \
--to=joonas.lahtinen@linux.intel.com \
--cc=Intel-GFX@Lists.FreeDesktop.Org \
--cc=John.C.Harrison@Intel.com \
--cc=daniel.vetter@ffwll.ch \
/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;
as well as URLs for NNTP newsgroup(s).