From patchwork Thu Jun 26 17:24:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Harrison X-Patchwork-Id: 4429211 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5F6219FBC3 for ; Thu, 26 Jun 2014 17:26:01 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 965D6203A0 for ; Thu, 26 Jun 2014 17:25:57 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 0FBD920304 for ; Thu, 26 Jun 2014 17:25:52 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A3C356E24E; Thu, 26 Jun 2014 10:25:50 -0700 (PDT) X-Original-To: Intel-GFX@lists.freedesktop.org Delivered-To: Intel-GFX@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 68A7E6E24E for ; Thu, 26 Jun 2014 10:25:44 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 26 Jun 2014 10:25:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.01,554,1400050800"; d="scan'208";a="561434812" Received: from johnharr-linux.iwi.intel.com ([172.28.253.52]) by fmsmga002.fm.intel.com with ESMTP; 26 Jun 2014 10:25:29 -0700 From: John.C.Harrison@Intel.com To: Intel-GFX@lists.freedesktop.org Date: Thu, 26 Jun 2014 18:24:20 +0100 Message-Id: <1403803475-16337-30-git-send-email-John.C.Harrison@Intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1403803475-16337-1-git-send-email-John.C.Harrison@Intel.com> References: <1403803475-16337-1-git-send-email-John.C.Harrison@Intel.com> Organization: Intel Corporation (UK) Ltd. - Co. Reg. #1134945 - Pipers Way, Swindon SN3 1RJ Subject: [Intel-gfx] [RFC 29/44] drm/i915: Hook scheduler into intel_ring_idle() X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: John Harrison The code to wait for a ring to be idle ends by calling __wait_seqno() on the value in the last request structure. However, with a scheduler, there may be work queued up but not yet submitted. There is also the possiblity of pre-emption re-ordering work after it has been submitted. Thus the last request structure at the current moment is not necessarily the last piece of work by the time that particular seqno has completed. It is not possible to force the scheduler to submit all work from inside the ring idle function as it might not be a safe place to do so. Instead, it must simply return early if the scheduler has outstanding work and roll back as far as releasing the driver mutex lock and the returning the system to a consistent state. --- drivers/gpu/drm/i915/i915_scheduler.c | 12 ++++++++++++ drivers/gpu/drm/i915/i915_scheduler.h | 1 + drivers/gpu/drm/i915/intel_ringbuffer.c | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c index 6b6827f..6a10a76 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.c +++ b/drivers/gpu/drm/i915/i915_scheduler.c @@ -165,6 +165,13 @@ int i915_scheduler_closefile(struct drm_device *dev, struct drm_file *file) return 0; } +bool i915_scheduler_is_idle(struct intel_engine_cs *ring) +{ + /* Do stuff... */ + + return true; +} + #else /* CONFIG_DRM_I915_SCHEDULER */ int i915_scheduler_init(struct drm_device *dev) @@ -177,6 +184,11 @@ int i915_scheduler_closefile(struct drm_device *dev, struct drm_file *file) return 0; } +bool i915_scheduler_is_idle(struct intel_engine_cs *ring) +{ + return true; +} + int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe) { return i915_gem_do_execbuffer_final(&qe->params); diff --git a/drivers/gpu/drm/i915/i915_scheduler.h b/drivers/gpu/drm/i915/i915_scheduler.h index 898d2bb..1b3d51a 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.h +++ b/drivers/gpu/drm/i915/i915_scheduler.h @@ -74,6 +74,7 @@ int i915_scheduler_closefile(struct drm_device *dev, struct drm_file *file); int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe); int i915_scheduler_handle_IRQ(struct intel_engine_cs *ring); +bool i915_scheduler_is_idle(struct intel_engine_cs *ring); #ifdef CONFIG_DRM_I915_SCHEDULER diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 1ef0cbd..1ad162b 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -1651,6 +1651,14 @@ int intel_ring_idle(struct intel_engine_cs *ring) return ret; } + /* If there is anything outstanding within the scheduler then give up + * now as the submission of such work requires the mutex lock. While + * the lock is definitely held at this point (i915_wait_seqno will BUG + * if called without), the driver is not necessarily at a safe point + * to start submitting ring work. */ + if (!i915_scheduler_is_idle(ring)) + return -EAGAIN; + /* Wait upon the last request to be completed */ if (list_empty(&ring->request_list)) return 0;