From patchwork Wed Dec 3 19:49:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jesse Barnes X-Patchwork-Id: 5432881 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 CBD3F9F1D4 for ; Wed, 3 Dec 2014 19:49:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A6D7A20357 for ; Wed, 3 Dec 2014 19:49:17 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 5DB8420373 for ; Wed, 3 Dec 2014 19:49:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D8BE26E161; Wed, 3 Dec 2014 11:49:15 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) by gabe.freedesktop.org (Postfix) with ESMTP id B4B596E0BC for ; Wed, 3 Dec 2014 11:49:14 -0800 (PST) Received: by mail-pd0-f174.google.com with SMTP id w10so15963168pde.5 for ; Wed, 03 Dec 2014 11:49:14 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FPi+yk3PPk0LJXw74ZKVe9KsS8TCQWlCg6wqOPoiPjg=; b=PQsqvWbul7LbUnup8+VBh7IsL2I2AaktUg0wM4EA4Ufeisbog3JtfcLuSNkvXZEhu0 AaxlSu75cddr31pzlr03OpNasYGdBguEzFz64oW8qyqewUASI5BrHt94ITFamjfejkRd fLMO0jJqJksKdmXGIIFF5+P5zCGt/13wrIPpcSmAvsM4+Bl83MnHsF1YVWsdxwMy5Bpn qPJTDJOhUMOg1798sDpTOCTV2LA2MEdgYxiqses4t8YuVDFTi57ObbFmvGtGcUqmaIK+ AYRJPuUWUkT5U5/Qso6iwFIQJRXDdmcLmFvu/A09kcm9sQFmcCWSBvWogzlmSHD9ko7b MuIg== X-Received: by 10.66.221.198 with SMTP id qg6mr11970428pac.106.1417636154178; Wed, 03 Dec 2014 11:49:14 -0800 (PST) Received: from localhost.localdomain (c-67-161-37-189.hsd1.ca.comcast.net. [67.161.37.189]) by mx.google.com with ESMTPSA id hk9sm13694668pdb.47.2014.12.03.11.49.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Dec 2014 11:49:13 -0800 (PST) From: Jesse Barnes To: intel-gfx@lists.freedesktop.org Date: Wed, 3 Dec 2014 11:49:07 -0800 Message-Id: <1417636147-29664-4-git-send-email-jbarnes@virtuousgeek.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1417636147-29664-1-git-send-email-jbarnes@virtuousgeek.org> References: <1417636147-29664-1-git-send-email-jbarnes@virtuousgeek.org> Cc: Maarten Lankhorst Subject: [Intel-gfx] [PATCH 3/3] drm/i915: add fences to the request struct X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 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 This simplifies the sync code quite a bit. I don't think we'll be able to get away with using the core fence code's seqno support, since we'll be moving away from simple seqno comparisions with the scheduler and preemption, but the additional code is pretty minimal anyway, and lets us add additional debugging as needed, so it's probably fine to keep either way. We still need to add support for other rings here; we ought to be able to do that with the timeline field of the ioctl (which will include other "rings" like the display flip queue for example). Signed-off-by: Jesse Barnes --- drivers/gpu/drm/i915/i915_drv.h | 6 +++ drivers/gpu/drm/i915/i915_sync.c | 89 +++++++++++++++------------------------- 2 files changed, 40 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 367d95a..2725243 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -49,6 +49,7 @@ #include #include #include +#include /* General customization: */ @@ -2025,6 +2026,11 @@ struct drm_i915_gem_request { struct drm_i915_file_private *file_priv; /** file_priv list entry for this request */ struct list_head client_list; + + /* core fence obj for this request, may be exported */ + struct fence fence; + + wait_queue_t wait; }; void i915_gem_request_free(struct kref *req_ref); diff --git a/drivers/gpu/drm/i915/i915_sync.c b/drivers/gpu/drm/i915/i915_sync.c index 4741b0c..ea54b34 100644 --- a/drivers/gpu/drm/i915/i915_sync.c +++ b/drivers/gpu/drm/i915/i915_sync.c @@ -50,25 +50,10 @@ static spinlock_t fence_lock; * with other Android timelines and aggregated into sync_fences, etc. * * TODO: - * rebase on top of Chris's seqno/request stuff and use requests * allow non-RCS fences (need ring/context association) */ -struct i915_fence { - struct fence base; - struct intel_engine_cs *ring; - struct intel_context *ctx; - wait_queue_t wait; - struct drm_i915_gem_request *request; -}; - -#define to_intel_fence(x) container_of(x, struct i915_fence, base) - -int __wait_seqno(struct intel_engine_cs *ring, u32 seqno, - unsigned reset_counter, - bool interruptible, - struct timespec *timeout, - struct drm_i915_file_private *file_priv); +#define to_i915_request(x) container_of(x, struct drm_i915_gem_request, fence) static const char *i915_fence_get_driver_name(struct fence *fence) { @@ -77,24 +62,24 @@ static const char *i915_fence_get_driver_name(struct fence *fence) static const char *i915_fence_get_timeline_name(struct fence *fence) { - struct i915_fence *intel_fence = to_intel_fence(fence); + struct drm_i915_gem_request *req = to_i915_request(fence); - return intel_fence->ring->name; + return req->ring->name; } static int i915_fence_check(wait_queue_t *wait, unsigned mode, int flags, void *key) { - struct i915_fence *intel_fence = wait->private; - struct intel_engine_cs *ring = intel_fence->ring; + struct drm_i915_gem_request *req = wait->private; + struct intel_engine_cs *ring = req->ring; - if (!i915_gem_request_completed(intel_fence->request, false)) + if (!i915_gem_request_completed(req, false)) return 0; - fence_signal_locked(&intel_fence->base); + fence_signal_locked(&req->fence); __remove_wait_queue(&ring->irq_queue, wait); - fence_put(&intel_fence->base); + fence_put(&req->fence); ring->irq_put(ring); return 0; @@ -102,26 +87,26 @@ static int i915_fence_check(wait_queue_t *wait, unsigned mode, int flags, static bool i915_fence_enable_signaling(struct fence *fence) { - struct i915_fence *intel_fence = to_intel_fence(fence); - struct intel_engine_cs *ring = intel_fence->ring; + struct drm_i915_gem_request *req = to_i915_request(fence); + struct intel_engine_cs *ring = req->ring; struct drm_i915_private *dev_priv = ring->dev->dev_private; - wait_queue_t *wait = &intel_fence->wait; + wait_queue_t *wait = &req->wait; /* queue fence wait queue on irq queue and get fence */ - if (i915_gem_request_completed(intel_fence->request, false) || + if (i915_gem_request_completed(req, false) || i915_terminally_wedged(&dev_priv->gpu_error)) return false; if (!ring->irq_get(ring)) return false; - if (i915_gem_request_completed(intel_fence->request, false)) { + if (i915_gem_request_completed(req, false)) { ring->irq_put(ring); return true; } wait->flags = 0; - wait->private = intel_fence; + wait->private = req; wait->func = i915_fence_check; __add_wait_queue(&ring->irq_queue, wait); @@ -132,22 +117,22 @@ static bool i915_fence_enable_signaling(struct fence *fence) static bool i915_fence_signaled(struct fence *fence) { - struct i915_fence *intel_fence = to_intel_fence(fence); + struct drm_i915_gem_request *req = to_i915_request(fence); - return i915_gem_request_completed(intel_fence->request, false); + return i915_gem_request_completed(req, false); } static signed long i915_fence_wait(struct fence *fence, bool intr, signed long timeout_js) { - struct i915_fence *intel_fence = to_intel_fence(fence); - struct drm_i915_private *dev_priv = intel_fence->ring->dev->dev_private; + struct drm_i915_gem_request *req = to_i915_request(fence); + struct drm_i915_private *dev_priv = req->ring->dev->dev_private; int ret; s64 timeout; timeout = jiffies_to_nsecs(timeout_js); - ret = __i915_wait_request(intel_fence->request, + ret = __i915_wait_request(req, atomic_read(&dev_priv->gpu_error.reset_counter), intr, &timeout, NULL); if (ret == -ETIME) @@ -159,29 +144,29 @@ static signed long i915_fence_wait(struct fence *fence, bool intr, static int i915_fence_fill_driver_data(struct fence *fence, void *data, int size) { - struct i915_fence *intel_fence = to_intel_fence(fence); + struct drm_i915_gem_request *req = to_i915_request(fence); - if (size < sizeof(intel_fence->request->seqno)) + if (size < sizeof(req->seqno)) return -ENOMEM; - memcpy(data, &intel_fence->request->seqno, - sizeof(intel_fence->request->seqno)); + memcpy(data, &req->seqno, + sizeof(req->seqno)); - return sizeof(intel_fence->request->seqno); + return sizeof(req->seqno); } static void i915_fence_value_str(struct fence *fence, char *str, int size) { - struct i915_fence *intel_fence = to_intel_fence(fence); + struct drm_i915_gem_request *req = to_i915_request(fence); - snprintf(str, size, "%u", intel_fence->request->seqno); + snprintf(str, size, "%u", req->seqno); } static void i915_fence_timeline_value_str(struct fence *fence, char *str, int size) { - struct i915_fence *intel_fence = to_intel_fence(fence); - struct intel_engine_cs *ring = intel_fence->ring; + struct drm_i915_gem_request *req = to_i915_request(fence); + struct intel_engine_cs *ring = req->ring; snprintf(str, size, "%u", ring->get_seqno(ring, false)); } @@ -200,27 +185,21 @@ static struct fence_ops i915_fence_ops = { static struct fence *i915_fence_create(struct intel_engine_cs *ring, struct intel_context *ctx) { - struct i915_fence *fence; + struct drm_i915_gem_request *req; int ret; - fence = kzalloc(sizeof(*fence), GFP_KERNEL); - if (!fence) - return NULL; - ret = ring->add_request(ring); if (ret) { DRM_ERROR("add_request failed\n"); - fence_free((struct fence *)fence); return NULL; } - fence->ring = ring; - fence->ctx = ctx; - fence->request = ring->outstanding_lazy_request; - fence_init(&fence->base, &i915_fence_ops, &fence_lock, ctx->user_handle, - fence->request->seqno); + req = ring->outstanding_lazy_request; + + fence_init(&req->fence, &i915_fence_ops, &fence_lock, + ctx->user_handle, req->seqno); - return &fence->base; + return &req->fence; } /**