From patchwork Wed Nov 28 14:50:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Christian_K=C3=B6nig?= X-Patchwork-Id: 10702825 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2E21913AD for ; Wed, 28 Nov 2018 14:50:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C7CA2D5AD for ; Wed, 28 Nov 2018 14:50:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 110522D5C3; Wed, 28 Nov 2018 14:50:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A81732D5BE for ; Wed, 28 Nov 2018 14:50:52 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2F0EA6E388; Wed, 28 Nov 2018 14:50:44 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by gabe.freedesktop.org (Postfix) with ESMTPS id 288BC6E353; Wed, 28 Nov 2018 14:50:30 +0000 (UTC) Received: by mail-wm1-x344.google.com with SMTP id r11-v6so2899087wmb.2; Wed, 28 Nov 2018 06:50:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HARf8sVKTLFMWzM3S3deR/CxrGFl+QlDBF5jWVQsrps=; b=HwDpJgweIIo5eb/VrB5wuRDnW0gGfsDBuXJy32vfZwxEABeYARmX1D+3yJhrmoyZb3 rrUyaWl+XBNGbFwyn3HtMSS+FhE/Cjuc9OWFWDd3I7ks0W84deKuYxronmMu8RaRBEm/ TqLjgGH3HhGWT85ODQsQT89RE/GGr9A1/ETOrRD9fw4A1/gIHT5lXNnkHI9PUOV3XYpL ZWnACXE+WkuP6bPMSa/K3uyfOPupSb5O+n1BxA0T9CxtyR/9ns01HhQFXp6P0UNPdxrB 4N9HGDGWdYbOjM7xqc+ahCymcOSSfCYYHzqiZDbRBW/4akDvtDpdtNJ+4eWzHbe9oxhw nfVA== X-Gm-Message-State: AA+aEWaRbMyWn82ygw19Q0RDHChXTjaCI/RORPKItNJU5LKrKPKJqOPD 0+A+//Pl2Q5FpYRcCBSS5TAJhvr2 X-Google-Smtp-Source: AFSGD/UnmtaXrqLDWsetV/IyOLUhCwFBnXkWhMsbRatER/NtXXaKQFpn2Z4dIhJ12/vlqsTYzD4ZKg== X-Received: by 2002:a1c:650b:: with SMTP id z11mr3060004wmb.23.1543416628496; Wed, 28 Nov 2018 06:50:28 -0800 (PST) Received: from baker.fritz.box ([2a02:908:125b:9a00:d565:1a37:fff0:7800]) by smtp.gmail.com with ESMTPSA id c12sm5235746wrs.82.2018.11.28.06.50.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 28 Nov 2018 06:50:27 -0800 (PST) From: " =?utf-8?q?Christian_K=C3=B6nig?= " X-Google-Original-From: =?utf-8?q?Christian_K=C3=B6nig?= To: dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org Subject: [PATCH 04/11] drm/syncobj: use only a single stub fence Date: Wed, 28 Nov 2018 15:50:14 +0100 Message-Id: <20181128145021.4105-5-christian.koenig@amd.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20181128145021.4105-1-christian.koenig@amd.com> References: <20181128145021.4105-1-christian.koenig@amd.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Extract of useful code from the timeline work. Let's use just a single stub fence instance instead of allocating a new one all the time. Signed-off-by: Chunming Zhou Signed-off-by: Christian König --- drivers/gpu/drm/drm_syncobj.c | 67 ++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index b92e3c726229..f78321338c1f 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -56,10 +56,8 @@ #include "drm_internal.h" #include -struct drm_syncobj_stub_fence { - struct dma_fence base; - spinlock_t lock; -}; +static DEFINE_SPINLOCK(stub_fence_lock); +static struct dma_fence stub_fence; static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence) { @@ -71,6 +69,25 @@ static const struct dma_fence_ops drm_syncobj_stub_fence_ops = { .get_timeline_name = drm_syncobj_stub_fence_get_name, }; +/** + * drm_syncobj_get_stub_fence - return a signaled fence + * + * Return a stub fence which is already signaled. + */ +static struct dma_fence *drm_syncobj_get_stub_fence(void) +{ + spin_lock(&stub_fence_lock); + if (!stub_fence.ops) { + dma_fence_init(&stub_fence, + &drm_syncobj_stub_fence_ops, + &stub_fence_lock, + 0, 0); + dma_fence_signal_locked(&stub_fence); + } + spin_unlock(&stub_fence_lock); + + return dma_fence_get(&stub_fence); +} /** * drm_syncobj_find - lookup and reference a sync object. @@ -188,23 +205,18 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, } EXPORT_SYMBOL(drm_syncobj_replace_fence); -static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) +/** + * drm_syncobj_assign_null_handle - assign a stub fence to the sync object + * @syncobj: sync object to assign the fence on + * + * Assign a already signaled stub fence to the sync object. + */ +static void drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) { - struct drm_syncobj_stub_fence *fence; - fence = kzalloc(sizeof(*fence), GFP_KERNEL); - if (fence == NULL) - return -ENOMEM; + struct dma_fence *fence = drm_syncobj_get_stub_fence(); - spin_lock_init(&fence->lock); - dma_fence_init(&fence->base, &drm_syncobj_stub_fence_ops, - &fence->lock, 0, 0); - dma_fence_signal(&fence->base); - - drm_syncobj_replace_fence(syncobj, &fence->base); - - dma_fence_put(&fence->base); - - return 0; + drm_syncobj_replace_fence(syncobj, fence); + dma_fence_put(fence); } /** @@ -272,7 +284,6 @@ EXPORT_SYMBOL(drm_syncobj_free); int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, struct dma_fence *fence) { - int ret; struct drm_syncobj *syncobj; syncobj = kzalloc(sizeof(struct drm_syncobj), GFP_KERNEL); @@ -283,13 +294,8 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, INIT_LIST_HEAD(&syncobj->cb_list); spin_lock_init(&syncobj->lock); - if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) { - ret = drm_syncobj_assign_null_handle(syncobj); - if (ret < 0) { - drm_syncobj_put(syncobj); - return ret; - } - } + if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) + drm_syncobj_assign_null_handle(syncobj); if (fence) drm_syncobj_replace_fence(syncobj, fence); @@ -980,11 +986,8 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data, if (ret < 0) return ret; - for (i = 0; i < args->count_handles; i++) { - ret = drm_syncobj_assign_null_handle(syncobjs[i]); - if (ret < 0) - break; - } + for (i = 0; i < args->count_handles; i++) + drm_syncobj_assign_null_handle(syncobjs[i]); drm_syncobj_array_free(syncobjs, args->count_handles);