From patchwork Tue Jan 8 02:31:46 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: 210281 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 A6E332C0087 for ; Tue, 8 Jan 2013 13:31:39 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754089Ab3AHCb3 (ORCPT ); Mon, 7 Jan 2013 21:31:29 -0500 Received: from na3sys009aog126.obsmtp.com ([74.125.149.155]:42296 "HELO na3sys009aog126.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1753907Ab3AHCb1 (ORCPT ); Mon, 7 Jan 2013 21:31:27 -0500 Received: from mail-vc0-f200.google.com ([209.85.220.200]) (using TLSv1) by na3sys009aob126.postini.com ([74.125.148.12]) with SMTP ID DSNKUOuE/prDOBhzQ1LM66zNdL3YwjA9iwaV@postini.com; Mon, 07 Jan 2013 18:31:27 PST Received: by mail-vc0-f200.google.com with SMTP id f13so31486817vcb.3 for ; Mon, 07 Jan 2013 18:31:26 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-received:from:to:cc:subject:date:message-id:x-mailer :x-gm-message-state; bh=FHhjTyeewVScGYzZvko4NA9bj0ho7Oj4NBgJQmryoN4=; b=pyYfzs5xoSJCYRyIfG2ALGJAoH5uSv6mOxbmlQDjtMnX70GO3hyPlw7flkY8ba3dO9 kuYkoJ+T3tNe/Q5PtgS7/YQVLBBO6BXKeJNQfJs4kC8dimPM8K37d6/TSJeMAmYttTsz HzlCxOsiMRnTME+TBQjPL30CYEUIjKWDg5CwraBClk0EUmjDyfDW3viOYPiIB4IJ15Ob G/OZfaNNFNVsIYT6cVZX4Cy/8p67Fo4BjReuIX2AWFks373sfZaEJJJBrkoKhXVgw5Oz zwOWCYLe3iVRSDbvrSOzxIt+cYIDFBEVsileJF/FUcaTZfYQlwgW8DBOF8nOvxJIvAxX K/xg== X-Received: by 10.220.40.135 with SMTP id k7mr83657509vce.12.1357612285968; Mon, 07 Jan 2013 18:31:25 -0800 (PST) X-Received: by 10.220.40.135 with SMTP id k7mr83657506vce.12.1357612285818; Mon, 07 Jan 2013 18:31:25 -0800 (PST) Received: from localhost ([64.125.181.92]) by mx.google.com with ESMTPS id b10sm53156947vdk.15.2013.01.07.18.31.24 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 07 Jan 2013 18:31:25 -0800 (PST) From: Pravin B Shelar To: dev@openvswitch.org, netdev@vger.kernel.org Cc: jesse@nicira.com, shemminger@vyatta.com, Pravin Shelar Subject: [PATCH 2/5] GRE: Use RTNL for atomic protocol registration. Date: Mon, 7 Jan 2013 18:31:46 -0800 Message-Id: <1357612306-1748-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.7.12.315.g682ce8b X-Gm-Message-State: ALoCoQnEqJmdRcINa0GPcWLz9ZrkfoGxou+kB6To3CNObAMtmbEsNSronFVtkgl7vxWeHEMe5uhQRKzWeFDUq+kTJkgnsCJe2RvBBz7InVogNJhWI8ccihLCetbXaMUbA37Yfnlb4AbuhoDw8r/QqEpIfh44lb98FYtWGEK66piMPjTxNq2glZE= Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Pravin Shelar Currently gre demultiplexer uses its own spin-lock. We should rather RTNL lock. Suggested-by: Stephen Hemminger Signed-off-by: Pravin B Shelar --- drivers/net/ppp/pptp.c | 4 ++++ net/ipv4/gre.c | 18 +++++------------- net/ipv4/ip_gre.c | 4 ++++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index 162464f..672e7e3 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c @@ -673,7 +673,9 @@ static int __init pptp_init_module(void) if (!callid_sock) return -ENOMEM; + rtnl_lock(); err = gre_add_protocol(&gre_pptp_protocol, GREPROTO_PPTP); + rtnl_unlock(); if (err) { pr_err("PPTP: can't add gre protocol\n"); goto out_mem_free; @@ -707,7 +709,9 @@ static void __exit pptp_exit_module(void) { unregister_pppox_proto(PX_PROTO_PPTP); proto_unregister(&pptp_sk_proto); + rtnl_lock(); gre_del_protocol(&gre_pptp_protocol, GREPROTO_PPTP); + rtnl_unlock(); vfree(callid_sock); } diff --git a/net/ipv4/gre.c b/net/ipv4/gre.c index 0eaaf44..c0757c9 100644 --- a/net/ipv4/gre.c +++ b/net/ipv4/gre.c @@ -26,23 +26,19 @@ 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) { + ASSERT_RTNL(); if (version >= GREPROTO_MAX) goto err_out; - spin_lock(&gre_proto_lock); if (gre_proto[version]) - goto err_out_unlock; + goto err_out; RCU_INIT_POINTER(gre_proto[version], proto); - spin_unlock(&gre_proto_lock); return 0; -err_out_unlock: - spin_unlock(&gre_proto_lock); err_out: return -1; } @@ -50,20 +46,16 @@ EXPORT_SYMBOL_GPL(gre_add_protocol); int gre_del_protocol(const struct gre_protocol *proto, u8 version) { + ASSERT_RTNL(); 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; + if (rtnl_dereference(gre_proto[version]) != proto) + goto err_out; RCU_INIT_POINTER(gre_proto[version], NULL); - spin_unlock(&gre_proto_lock); synchronize_rcu(); return 0; -err_out_unlock: - spin_unlock(&gre_proto_lock); err_out: return -1; } diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 303012a..05f389f 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -1792,7 +1792,9 @@ static int __init ipgre_init(void) if (err < 0) return err; + rtnl_lock(); err = gre_add_protocol(&ipgre_protocol, GREPROTO_CISCO); + rtnl_unlock(); if (err < 0) { pr_info("%s: can't add protocol\n", __func__); goto add_proto_failed; @@ -1822,8 +1824,10 @@ static void __exit ipgre_fini(void) { rtnl_link_unregister(&ipgre_tap_ops); rtnl_link_unregister(&ipgre_link_ops); + rtnl_lock(); if (gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO) < 0) pr_info("%s: can't remove protocol\n", __func__); + rtnl_unlock(); unregister_pernet_device(&ipgre_net_ops); }