From patchwork Wed Nov 11 17:40:36 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: stephen hemminger X-Patchwork-Id: 38151 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 11E53B7099 for ; Thu, 12 Nov 2009 04:41:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758394AbZKKRlM (ORCPT ); Wed, 11 Nov 2009 12:41:12 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1758304AbZKKRlM (ORCPT ); Wed, 11 Nov 2009 12:41:12 -0500 Received: from mail.vyatta.com ([76.74.103.46]:57004 "EHLO mail.vyatta.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758373AbZKKRlL (ORCPT ); Wed, 11 Nov 2009 12:41:11 -0500 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.vyatta.com (Postfix) with ESMTP id 408CB4F403D; Wed, 11 Nov 2009 09:41:02 -0800 (PST) X-Virus-Scanned: amavisd-new at tahiti.vyatta.com Received: from mail.vyatta.com ([127.0.0.1]) by localhost (mail.vyatta.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id S0Gpg8Ndk-nx; Wed, 11 Nov 2009 09:40:47 -0800 (PST) Received: from nehalam (pool-74-107-129-83.ptldor.fios.verizon.net [74.107.129.83]) by mail.vyatta.com (Postfix) with ESMTP id A84994F402F; Wed, 11 Nov 2009 09:40:46 -0800 (PST) Date: Wed, 11 Nov 2009 09:40:36 -0800 From: Stephen Hemminger To: steve@chygwyn.com, David Miller Cc: Eric Dumazet , Christine Caulfield , Hannes Eder , Alexey Dobriyan , Steven Whitehouse , netdev@vger.kernel.org, linux-decnet-users@lists.sourceforge.net Subject: [PATCH 2/2] decnet: convert dndev_lock to spinlock Message-ID: <20091111094036.736762da@nehalam> In-Reply-To: <20091111093927.4a08999d@nehalam> References: <20091110175446.280423729@vyatta.com> <20091110175647.615305929@vyatta.com> <4AF9B449.6040708@gmail.com> <20091110105053.16687e93@nehalam> <20091110182436.GA13374@fogou.chygwyn.com> <20091111093927.4a08999d@nehalam> Organization: Vyatta X-Mailer: Claws Mail 3.6.1 (GTK+ 2.16.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org There is no reason for this lock to be reader/writer since the reader only has lock held for a very brief period. The overhead of read_lock is more expensive than spinlock. Compile tested only, I am not a decnet user. Signed-off-by: Stephen Hemminger --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- a/net/decnet/dn_dev.c 2009-11-10 17:39:53.652984752 -0800 +++ b/net/decnet/dn_dev.c 2009-11-10 17:41:15.942736073 -0800 @@ -68,7 +68,7 @@ extern struct neigh_table dn_neigh_table */ __le16 decnet_address = 0; -static DEFINE_RWLOCK(dndev_lock); +static DEFINE_SPINLOCK(dndev_lock); static struct net_device *decnet_default_device; static BLOCKING_NOTIFIER_HEAD(dnaddr_chain); @@ -557,7 +557,8 @@ rarok: struct net_device *dn_dev_get_default(void) { struct net_device *dev; - read_lock(&dndev_lock); + + spin_lock(&dndev_lock); dev = decnet_default_device; if (dev) { if (dev->dn_ptr) @@ -565,7 +566,8 @@ struct net_device *dn_dev_get_default(vo else dev = NULL; } - read_unlock(&dndev_lock); + spin_unlock(&dndev_lock); + return dev; } @@ -575,13 +577,15 @@ int dn_dev_set_default(struct net_device int rv = -EBUSY; if (!dev->dn_ptr) return -ENODEV; - write_lock(&dndev_lock); + + spin_lock(&dndev_lock); if (force || decnet_default_device == NULL) { old = decnet_default_device; decnet_default_device = dev; rv = 0; } - write_unlock(&dndev_lock); + spin_unlock(&dndev_lock); + if (old) dev_put(old); return rv; @@ -589,13 +593,14 @@ int dn_dev_set_default(struct net_device static void dn_dev_check_default(struct net_device *dev) { - write_lock(&dndev_lock); + spin_lock(&dndev_lock); if (dev == decnet_default_device) { decnet_default_device = NULL; } else { dev = NULL; } - write_unlock(&dndev_lock); + spin_unlock(&dndev_lock); + if (dev) dev_put(dev); }