From patchwork Tue Jun 18 00:49:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pravin B Shelar X-Patchwork-Id: 252081 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.180.67]) by ozlabs.org (Postfix) with ESMTP id ECE2C2C029B for ; Tue, 18 Jun 2013 10:49:56 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752240Ab3FRAtq (ORCPT ); Mon, 17 Jun 2013 20:49:46 -0400 Received: from na3sys009aog122.obsmtp.com ([74.125.149.147]:50281 "HELO na3sys009aog122.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751884Ab3FRAtg (ORCPT ); Mon, 17 Jun 2013 20:49:36 -0400 Received: from mail-pd0-f172.google.com ([209.85.192.172]) (using TLSv1) by na3sys009aob122.postini.com ([74.125.148.12]) with SMTP ID DSNKUb+un9/lCsqWYsH+ZIvxuEVjap6kA0Hk@postini.com; Mon, 17 Jun 2013 17:49:36 PDT Received: by mail-pd0-f172.google.com with SMTP id z10so3341298pdj.3 for ; Mon, 17 Jun 2013 17:49:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=oKbMCUDogaMXLhfq1P68UGvb6Ph3wkUXQNQRUscZt6k=; b=f1CGzaBewkg7lMKj+O9ljhQDy0X00LkHbckI0WPrgmON27+wK0BDICQhK8HKNb8ctZ zw6ymVyWD3ZL6/gOK3alN9DvHPCE8KJadPCg6oMeef3g24t1iSgjl6CJaaawf5F/2uZL Jj7kH1evn4wrQtOaihPLRzQA6dENEGjGE8pbc77HXlmruntlHo6JgZEkSrTjuQ+CJ8lJ bhP40/AeOvJtQZOEZ2PZwYpPAkSs039bmPwbyxZOefz2l4SCGv0a5X0ASYzdpnl5eHyH fRBYntHORCr+6CjFGxZsfZhHC2gqgfa6lc+NYx6g9DS8lyL0aUwXrqTmk9GInkPj2bnb s4Jw== X-Received: by 10.66.249.135 with SMTP id yu7mr15076141pac.15.1371516575396; Mon, 17 Jun 2013 17:49:35 -0700 (PDT) X-Received: by 10.66.249.135 with SMTP id yu7mr15076137pac.15.1371516575307; Mon, 17 Jun 2013 17:49:35 -0700 (PDT) Received: from localhost ([75.98.92.113]) by mx.google.com with ESMTPSA id vu5sm16936015pab.10.2013.06.17.17.49.34 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Mon, 17 Jun 2013 17:49:34 -0700 (PDT) From: Pravin B Shelar To: netdev@vger.kernel.org, dev@openvswitch.org Cc: Pravin B Shelar Subject: [PATCH net-next v2 01/12] gre: Simplify gre protocol registration locking. Date: Mon, 17 Jun 2013 17:49:32 -0700 Message-Id: <1371516572-17661-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.8.2.135.g7b592fa X-Gm-Message-State: ALoCoQlqzBOKO4P0+ImyCMDxLUJQRUcVAK03cADWZ9D6eYmicHG48q48zTgFe0uZyKtwdQavXPecPb1O1FduPmTRPjbBFyR6crI1DSgG/OCKQlns5K0uCpcjReLi1Kn+UFfJ6xjzjcaZI3Pp98fv/FFTgfL/K/cdiZpi/kYJDgkRvQxcyAEBPmw= Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Use cmpxchg() for atomic protocol registration which saves code and data space. Signed-off-by: Pravin B Shelar --- net/ipv4/gre.c | 40 +++++++++++++--------------------------- 1 files changed, 13 insertions(+), 27 deletions(-) diff --git a/net/ipv4/gre.c b/net/ipv4/gre.c index b2e805a..1e294d5 100644 --- a/net/ipv4/gre.c +++ b/net/ipv4/gre.c @@ -26,46 +26,32 @@ static const struct gre_protocol __rcu *gre_proto[GREPROTO_MAX] __read_mostly; -static DEFINE_SPINLOCK(gre_proto_lock); int gre_add_protocol(const struct gre_protocol *proto, u8 version) { if (version >= GREPROTO_MAX) - goto err_out; - - spin_lock(&gre_proto_lock); - if (gre_proto[version]) - goto err_out_unlock; - - RCU_INIT_POINTER(gre_proto[version], proto); - spin_unlock(&gre_proto_lock); - return 0; + return -EINVAL; -err_out_unlock: - spin_unlock(&gre_proto_lock); -err_out: - return -1; + return (cmpxchg((const struct gre_protocol **)&gre_proto[version], NULL, proto) == NULL) ? + 0 : -EBUSY; } EXPORT_SYMBOL_GPL(gre_add_protocol); int gre_del_protocol(const struct gre_protocol *proto, u8 version) { + int ret; + if (version >= GREPROTO_MAX) - goto err_out; - - spin_lock(&gre_proto_lock); - if (rcu_dereference_protected(gre_proto[version], - lockdep_is_held(&gre_proto_lock)) != proto) - goto err_out_unlock; - RCU_INIT_POINTER(gre_proto[version], NULL); - spin_unlock(&gre_proto_lock); + return -EINVAL; + + ret = (cmpxchg((const struct gre_protocol **)&gre_proto[version], proto, NULL) == proto) ? + 0 : -EBUSY; + + if (ret) + return ret; + synchronize_rcu(); return 0; - -err_out_unlock: - spin_unlock(&gre_proto_lock); -err_out: - return -1; } EXPORT_SYMBOL_GPL(gre_del_protocol);