From patchwork Thu Apr 8 17:55:50 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Hilman X-Patchwork-Id: 91337 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o38Hu4bJ005473 for ; Thu, 8 Apr 2010 17:56:04 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758867Ab0DHR4A (ORCPT ); Thu, 8 Apr 2010 13:56:00 -0400 Received: from mail-bw0-f209.google.com ([209.85.218.209]:48459 "EHLO mail-bw0-f209.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755949Ab0DHR4A (ORCPT ); Thu, 8 Apr 2010 13:56:00 -0400 Received: by bwz1 with SMTP id 1so1990207bwz.21 for ; Thu, 08 Apr 2010 10:55:57 -0700 (PDT) Received: by 10.204.130.211 with SMTP id u19mr546114bks.41.1270749357320; Thu, 08 Apr 2010 10:55:57 -0700 (PDT) Received: from localhost (deeprootsystems.com [216.254.16.51]) by mx.google.com with ESMTPS id 24sm2228406bkr.12.2010.04.08.10.55.55 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 08 Apr 2010 10:55:56 -0700 (PDT) From: Kevin Hilman To: linux-kernel@vger.kernel.org Cc: linux-omap@vger.kernel.org, Rabin Vincent , "H. Peter Anvin" Subject: [PATCH] rwsem generic spinlock: use IRQ save/restore spinlocks Date: Thu, 8 Apr 2010 10:55:50 -0700 Message-Id: <1270749350-25152-1-git-send-email-khilman@deeprootsystems.com> X-Mailer: git-send-email 1.7.0.2 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 08 Apr 2010 17:56:13 +0000 (UTC) diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c index ccf95bf..ffc9fc7 100644 --- a/lib/rwsem-spinlock.c +++ b/lib/rwsem-spinlock.c @@ -143,13 +143,14 @@ void __sched __down_read(struct rw_semaphore *sem) { struct rwsem_waiter waiter; struct task_struct *tsk; + unsigned long flags; - spin_lock_irq(&sem->wait_lock); + spin_lock_irqsave(&sem->wait_lock, flags); if (sem->activity >= 0 && list_empty(&sem->wait_list)) { /* granted */ sem->activity++; - spin_unlock_irq(&sem->wait_lock); + spin_unlock_irqrestore(&sem->wait_lock, flags); goto out; } @@ -164,7 +165,7 @@ void __sched __down_read(struct rw_semaphore *sem) list_add_tail(&waiter.list, &sem->wait_list); /* we don't need to touch the semaphore struct anymore */ - spin_unlock_irq(&sem->wait_lock); + spin_unlock_irqrestore(&sem->wait_lock, flags); /* wait to be given the lock */ for (;;) { @@ -209,13 +210,14 @@ void __sched __down_write_nested(struct rw_semaphore *sem, int subclass) { struct rwsem_waiter waiter; struct task_struct *tsk; + unsigned long flags; - spin_lock_irq(&sem->wait_lock); + spin_lock_irqsave(&sem->wait_lock, flags); if (sem->activity == 0 && list_empty(&sem->wait_list)) { /* granted */ sem->activity = -1; - spin_unlock_irq(&sem->wait_lock); + spin_unlock_irqrestore(&sem->wait_lock, flags); goto out; } @@ -230,7 +232,7 @@ void __sched __down_write_nested(struct rw_semaphore *sem, int subclass) list_add_tail(&waiter.list, &sem->wait_list); /* we don't need to touch the semaphore struct anymore */ - spin_unlock_irq(&sem->wait_lock); + spin_unlock_irqrestore(&sem->wait_lock, flags); /* wait to be given the lock */ for (;;) {