From patchwork Tue Jul 22 14:05:36 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Maarten Lankhorst X-Patchwork-Id: 4603021 Return-Path: X-Original-To: patchwork-dri-devel@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 93B119F295 for ; Tue, 22 Jul 2014 14:05:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 85CC42016C for ; Tue, 22 Jul 2014 14:05:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 0BBF1200FE for ; Tue, 22 Jul 2014 14:05:46 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 79B1A6E4FC; Tue, 22 Jul 2014 07:05:45 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by gabe.freedesktop.org (Postfix) with ESMTP id 42A8A6E4FC; Tue, 22 Jul 2014 07:05:44 -0700 (PDT) Received: from 5ed49945.cm-7-5c.dynamic.ziggo.nl ([94.212.153.69] helo=[192.168.1.128]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1X9ahE-0000hU-Sj; Tue, 22 Jul 2014 14:05:36 +0000 Message-ID: <53CE6FB0.90500@canonical.com> Date: Tue, 22 Jul 2014 16:05:36 +0200 From: Maarten Lankhorst User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: =?ISO-8859-1?Q?Christian_K=F6nig?= , =?ISO-8859-1?Q?Christian_K=F6nig?= , Dave Airlie , Thomas Hellstrom , nouveau , LKML , dri-devel , Ben Skeggs , "Deucher, Alexander" Subject: Re: [PATCH 09/17] drm/radeon: use common fence implementation for fences References: <20140709093124.11354.3774.stgit@patser> <20140709122953.11354.46381.stgit@patser> <53CE2421.5040906@amd.com> <20140722114607.GL15237@phenom.ffwll.local> <20140722115737.GN15237@phenom.ffwll.local> <53CE56ED.4040109@vodafone.de> In-Reply-To: <53CE56ED.4040109@vodafone.de> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.15 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-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 op 22-07-14 14:19, Christian König schreef: > Am 22.07.2014 13:57, schrieb Daniel Vetter: >> On Tue, Jul 22, 2014 at 01:46:07PM +0200, Daniel Vetter wrote: >>> On Tue, Jul 22, 2014 at 10:43:13AM +0200, Christian König wrote: >>>> Am 22.07.2014 06:05, schrieb Dave Airlie: >>>>> On 9 July 2014 22:29, Maarten Lankhorst wrote: >>>>>> Signed-off-by: Maarten Lankhorst >>>>>> --- >>>>>> drivers/gpu/drm/radeon/radeon.h | 15 +- >>>>>> drivers/gpu/drm/radeon/radeon_device.c | 60 ++++++++- >>>>>> drivers/gpu/drm/radeon/radeon_fence.c | 223 ++++++++++++++++++++++++++------ >>>>>> 3 files changed, 248 insertions(+), 50 deletions(-) >>>>>> >>>>> From what I can see this is still suffering from the problem that we >>>>> need to find a proper solution to, >>>>> >>>>> My summary of the issues after talking to Jerome and Ben and >>>>> re-reading things is: >>>>> >>>>> We really need to work out a better interface into the drivers to be >>>>> able to avoid random atomic entrypoints, >>>> Which is exactly what I criticized from the very first beginning. Good to >>>> know that I'm not the only one thinking that this isn't such a good idea. >>> I guess I've lost context a bit, but which atomic entry point are we >>> talking about? Afaics the only one that's mandatory is the is >>> fence->signaled callback to check whether a fence really has been >>> signalled. It's used internally by the fence code to avoid spurious >>> wakeups. Afaik that should be doable already on any hardware. If that's >>> not the case then we can always track the signalled state in software and >>> double-check in a worker thread before updating the sw state. And wrap >>> this all up into a special fence class if there's more than one driver >>> needing this. >> One thing I've forgotten: The i915 scheduler that's floating around runs >> its bottom half from irq context. So I really want to be able to check >> fence state from irq context and I also want to make it possible >> (possible! not mandatory) to register callbacks which are run from any >> context asap after the fence is signalled. > > NAK, that's just the bad design I've talked about. Checking fence state inside the same driver from interrupt context is OK, because it's the drivers interrupt that we are talking about here. > > Checking fence status from another drivers interrupt context is what really concerns me here, cause your driver doesn't have the slightest idea if the called driver is really capable of checking the fence right now. I think there is a usecase for having atomic context allowed with fence_is_signaled, but I don't think there is one for interrupt context, so it's good with me if fence_is_signaled cannot be called in interrupt context, or with irqs disabled. fence_enable_sw_signaling disables interrupts because it holds fence->lock, so in theory it could be called from any context including interrupts. But no sane driver author does that, or at least I hope not.. Would a sanity check like the one below be enough to allay your fears? 8<------- 8<-------- >> If the radeon hw/driver doesn't want to cope with that complexity we can >> fully insolate it with the sw tracked fence state if you don't like >> Maarten's radeon implementation. But forcing everyone to forgoe this just >> because you don't like it and don't want to use it in radeon doesn't sound >> right. > > While it's clearly a hack Maarten's solution for radeon would indeed work, but that's not really the point here. > > It's just that I think leaking interrupt context from one driver into another driver is just a really really bad idea from a design point of view. > > And calling into a driver while in atomic context to check for a fence being signaled doesn't sounds like a good idea either, cause that limits way to much what the called driver can do for checking the status of a fence. No, you really shouldn't be doing much in the check anyway, it's meant to be a lightweight check. If you're not ready yet because of a lockup simply return not signaled yet. ~Maarten diff --git a/include/linux/fence.h b/include/linux/fence.h index d174585b874b..c1a4519ba2f5 100644 --- a/include/linux/fence.h +++ b/include/linux/fence.h @@ -143,6 +143,7 @@ struct fence_cb { * the second time will be a noop since it was already signaled. * * Notes on signaled: + * Called with interrupts enabled, and never from interrupt context. * May set fence->status if returning true. * * Notes on wait: @@ -268,15 +269,29 @@ fence_is_signaled_locked(struct fence *fence) static inline bool fence_is_signaled(struct fence *fence) { + bool ret; + if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags)) return true; - if (fence->ops->signaled && fence->ops->signaled(fence)) { + if (!fence->ops->signaled) + return false; + + if (config_enabled(CONFIG_PROVE_LOCKING)) + WARN_ON(in_interrupt() || irqs_disabled()); + + if (config_enabled(CONFIG_DEBUG_ATOMIC_SLEEP)) + preempt_disable(); + + ret = fence->ops->signaled(fence); + + if (config_enabled(CONFIG_DEBUG_ATOMIC_SLEEP)) + preempt_enable(); + + if (ret) fence_signal(fence); - return true; - } - return false; + return ret; } /**