From patchwork Wed Dec 10 19:40:54 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Detsch X-Patchwork-Id: 13323 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 016CBDDF7F for ; Thu, 11 Dec 2008 06:48:59 +1100 (EST) X-Original-To: cbe-oss-dev@ozlabs.org Delivered-To: cbe-oss-dev@ozlabs.org Received: from igw3.br.ibm.com (igw3.br.ibm.com [32.104.18.26]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "igw3.br.ibm.com", Issuer "Equifax" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id DF0F8DDF91 for ; Thu, 11 Dec 2008 06:41:16 +1100 (EST) Received: from d24relay01.br.ibm.com (unknown [9.8.31.16]) by igw3.br.ibm.com (Postfix) with ESMTP id 41355390251 for ; Wed, 10 Dec 2008 17:37:40 -0200 (BRDT) Received: from d24av01.br.ibm.com (d24av01.br.ibm.com [9.18.232.46]) by d24relay01.br.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id mBAKehFe3563726 for ; Wed, 10 Dec 2008 17:40:43 -0300 Received: from d24av01.br.ibm.com (loopback [127.0.0.1]) by d24av01.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id mBAJf9of018683 for ; Wed, 10 Dec 2008 17:41:09 -0200 Received: from [9.8.13.23] ([9.8.13.23]) by d24av01.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id mBAJegsj017084 for ; Wed, 10 Dec 2008 17:41:06 -0200 From: Andre Detsch To: cbe-oss-dev@ozlabs.org Date: Wed, 10 Dec 2008 17:40:54 -0200 User-Agent: KMail/1.9.6 References: <200812101719.42964.adetsch@br.ibm.com> In-Reply-To: <200812101719.42964.adetsch@br.ibm.com> MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200812101740.54942.adetsch@br.ibm.com> Subject: [Cbe-oss-dev] [PATCH 05/18] powerpc/spufs: Gang should yield its spu(s) on major page faults X-BeenThere: cbe-oss-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Discussion about Open Source Software for the Cell Broadband Engine List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: cbe-oss-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: cbe-oss-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Implement gang level nfaulting count that is incremented and decremented across major page faults enabling the gang to be yielded when there are no runnable contexts in the gang. If there are no other runnable gangs waiting to be dispatched, then the gang remains lazily loaded. Otherwise, it is switched out and put on the rq. The nrunnable count is the number of contexts in the gang that are inside spu_run() and are considered runnable. Signed-off-by: Luke Browning Signed-off-by: Andre Detsch --- arch/powerpc/platforms/cell/spufs/fault.c | 13 ++++++++++--- arch/powerpc/platforms/cell/spufs/spufs.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/platforms/cell/spufs/fault.c b/arch/powerpc/platforms/cell/spufs/fault.c index f093a58..9e270b9 100644 --- a/arch/powerpc/platforms/cell/spufs/fault.c +++ b/arch/powerpc/platforms/cell/spufs/fault.c @@ -149,8 +149,16 @@ int spufs_handle_class1(struct spu_context *ctx) local_irq_restore(flags); /* hashing failed, so try the actual fault handler */ - if (ret) + if (ret) { + struct spu_gang *gang = ctx->gang; + + atomic_inc(&gang->nfaulting); + if (atomic_read(&gang->nrunnable) == + atomic_read(&gang->nfaulting)) + spu_yield(ctx); ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt); + atomic_dec(&gang->nfaulting); + } /* * This is nasty: we need the state_mutex for all the bookkeeping even @@ -166,8 +174,7 @@ int spufs_handle_class1(struct spu_context *ctx) ctx->csa.class_1_dar = ctx->csa.class_1_dsisr = 0; /* - * If we handled the fault successfully and are in runnable - * state, restart the DMA. + * If we handled the fault successfully, restart the DMA. * In case of unhandled error report the problem to user space. */ if (!ret) { diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 8e84481..c041cce 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h @@ -167,6 +167,7 @@ struct spu_gang { int prio; atomic_t nstarted; atomic_t nrunnable; + atomic_t nfaulting; unsigned long sched_flags; struct list_head rq;