From patchwork Tue Nov 14 13:53:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kirill Tkhai X-Patchwork-Id: 837862 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="NnrXK4NH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ybprf5cdqz9s7C for ; Wed, 15 Nov 2017 00:53:54 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754788AbdKNNxx (ORCPT ); Tue, 14 Nov 2017 08:53:53 -0500 Received: from mail-ve1eur01on0099.outbound.protection.outlook.com ([104.47.1.99]:62304 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754708AbdKNNxr (ORCPT ); Tue, 14 Nov 2017 08:53:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=/R9tv30IOIlqHlJ0LjvE+BP3dSuvThj59+qVQjFsR/M=; b=NnrXK4NHgBXrIJIp1TX04Z16TMLcFajA9t1hDnxd87uZHjZ4dQYy85cxCaRitOZh9Ozld+OKmYFmUptRO+8X2SXGbZW//qyHNUtcepDSGvIO52pVWaoKiR2Ks2LLk2BpHJiVwFCO3mr7pBPR02EJLOvmHOLmut/aWPyX4UxDXQ0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Received: from localhost.localdomain (195.214.232.6) by VI1PR0801MB1343.eurprd08.prod.outlook.com (2603:10a6:800:3b::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.218.12; Tue, 14 Nov 2017 13:53:42 +0000 Subject: [PATCH] net: Convert net_mutex into rw_semaphore and down read it on net->init/->exit From: Kirill Tkhai To: davem@davemloft.net, vyasevic@redhat.com, kstewart@linuxfoundation.org, pombredanne@nexb.com, vyasevich@gmail.com, mark.rutland@arm.com, gregkh@linuxfoundation.org, adobriyan@gmail.com, fw@strlen.de, nicolas.dichtel@6wind.com, xiyou.wangcong@gmail.com, roman.kapl@sysgo.com, paul@paul-moore.com, dsahern@gmail.com, daniel@iogearbox.net, lucien.xin@gmail.com, mschiffer@universe-factory.net, rshearma@brocade.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, ktkhai@virtuozzo.com, ebiederm@xmission.com, avagin@virtuozzo.com, gorcunov@virtuozzo.com Date: Tue, 14 Nov 2017 16:53:33 +0300 Message-ID: <151066759055.14465.9783879083192000862.stgit@localhost.localdomain> User-Agent: StGit/0.18 MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: AM5PR0102CA0024.eurprd01.prod.exchangelabs.com (2603:10a6:206::37) To VI1PR0801MB1343.eurprd08.prod.outlook.com (2603:10a6:800:3b::7) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e5f80264-b283-4987-1ebd-08d52b671ed7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603199); SRVR:VI1PR0801MB1343; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1343; 3:h1kaHtSSfHXkO+j0lGqHfOcGRyuZOqm3qXpbfme2ROz0A4QH5kSC6jlrsQqmwf3BHWz3aI9fKta0oTwvBlhnvYpcNSzxhlH5Vq0/EigG3Pk1vVH5YmXT5TgIPnBY2grFA8+B6aqr83ucZIaWz3QQJdRh1UV3YP9JIv+5fOE7ASIVPOsGR28C6ToEbBcTOn2qs99sBnKcow5FT5N0zAIGv9IBMlt98rCsDpjfRMESbf/q194zaWZ+kjjCneN1F03w; 25:MS9WnJ/lEnMzpJY6P02Acz818CgEmkqs0glalu1cvu9IWa07gVLn1lhJkS/AHnhFu5jrQULT30ywulBw7M9q6AyyfoeX+Yl6x1BH37fhu00XDZc6gE0CUM6JS9jYdcVklFaR/7rPeERMK1whVgdXWh/pSxCD0q/g/2MULqxEC/vo29ozlQ+Jn+lLwB+WUg5wpMMvQN5LmQqREarWbgr3ypbn4/T9jHIzDwTJLlGS5cUKK+brLYZ7gCMqN3rVcoT3rmS1J2FPwKHNf+eLcIb7mpSOlA1l2qJnFuY+W/mG63pLOXRrsTzRS6oNq423HuAeU/hE9PER8vwGJclvvpSFJA==; 31:roGvSgSFZwkw6GWr7CXG8Wn/fposRc2emXQGPgb6QaF/ADeQGFFb5tiZvSDufJsjR56ugimBGWSpK8fiCmAhRRR6d+xSFo42D7QVB8cFYza8hqVcu7+3VJ5Q+QAqxH8HYYuxj19oUinuaFwk2TO2yFsD1O6ibLiiFdNGwCPB6IvzvKAyf3laT0KKW1//wt7i16S6P6o+SmGs/YiRiKDgrsXGrmkd7stPDBWbDPczICM= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1343: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1343; 20:cELq+x0TG/dLbPPzqSpOZIbl1B+23Tv9e/6049JlVboADLw74sirww1LK6yidctsW3NpSnIFWgYnt/enfyuy4xEVHUwarlOxGidzH4E+vYQiv/4xlYPYeKK0Fnx6QNLbXYDEiyIZCJuQzkOuyUF51aZ4kxA+Y+Is4LnduE58drEyhxr3PRJSESlj6BesPRgQpu04RrSeGG9WEFFKwMdwrqmVNuToRXIaQOR5SSByv40OaOJCBof07VQr0Xfp77H9yWPhrGygpd4vtfs6IMF1WXUbpjT9nd+IfMp7XltM63LetaQZKbY7EsfQlBAE3/s9KMcKgatiPi/pcn/ehNeDrubrKrkuCim4aGwtDF/5cc55LvI9d/Vc+Ja0VcUXiZqxyhhSz6dxbFh1GkvUlwCN2Au2unK9ncMuNmUNncbH/kQ=; 4:FN6l9d7GEetrALgjxJ7Q27oTy2o+5wUrWCraTIU9PBdK2Ti7HEJGTPnQDC2F5/KKd9jZOcXV92i6NC+OqZWw8NPOf0dzQWCcpFP2Xxtv2LHHGuRtwSjMCRWZLotg3fHsXw5Jgk1l3qcQ18gAwept/oehGas6mTCggSLv5a+aLQ2Xl1pQRurJDEVZa17T/9+xyeBnXjK7wS7FyEYerf9MD8PGJ3ChaNBmRSYABEqKo1g/ictTiGR01T7YBx49Mb4KFfeh9EcJX8xQW5OvLIzihA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(93006095)(93001095)(3231022)(10201501046)(3002001)(6041248)(20161123562025)(20161123564025)(20161123560025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR0801MB1343; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR0801MB1343; X-Forefront-PRVS: 04916EA04C X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(6069001)(376002)(346002)(199003)(189002)(54356999)(6506006)(50986999)(55016002)(101416001)(9686003)(39060400002)(53936002)(81166006)(81156014)(8676002)(6666003)(6636002)(8936002)(5660300001)(305945005)(189998001)(68736007)(50466002)(33646002)(7736002)(47776003)(106356001)(61506002)(105586002)(316002)(66066001)(230700001)(83506002)(478600001)(6116002)(3846002)(97736004)(7416002)(23676003)(86362001)(25786009)(16526018)(103116003)(58126008)(2906002)(921003)(1121003); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1343; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BVI1PR0801MB1343=3B23=3Ak0?= =?utf-8?q?5p3GtxhlqpsZH05jJpIS4aEmdH1Kym6LsD+Kb/fRsC1wiDwycux3QAqS?= =?utf-8?q?cA4bcQvzCbpmCxxF5pXItC0w3Q5k/aeRcLXaWaNEqhrMscy/siwULLbZ?= =?utf-8?q?90OHcTZ2DgokSHy/YoGlieta9rKwRI7NRCBxqpxjW8ym4JKXPmxebWsk?= =?utf-8?q?k/9LYI12+x/qHgT7C3ocalz5FDlYKW/DZiEEeMNiCMd0+jcqw36EKjjS?= =?utf-8?q?ofgEsyW2g09Pxhfi7BUowoRx5MmmsjK0PrcO75q8A9VD23/lmuRQVZdw?= =?utf-8?q?A24xx91WwNwRvm7/jErtcA1LOLTi8+kakbH4AqauCzHex8AB8i9bd3Ah?= =?utf-8?q?SG5SaLZJU0QtIe9LYvXJvo3hQPbkodKEcDxtwMR0Y21NOpVFINcTiW6n?= =?utf-8?q?bNwOGiQP/kIeHot7fTiUQVZ2OEAQyP6uAAq4oFRa4AQLJVZdcKtc/3iH?= =?utf-8?q?xB6Kh2pTXgNiTRkrSesOJJNmVtMe44gVHgHuIXOPiPknnou5mfi6j3hP?= =?utf-8?q?ohYYrdDVnFaSG6hHphZvHEur05Ym12uKKh0GC+0G2h3kVSpeQ3InBc/X?= =?utf-8?q?UBUQnCmH87cdLNX620mPtwVpjvkfb9u7eTkMkhkW4soQR0q+23gldxGj?= =?utf-8?q?c/nuiKAkoCcwbo2YujJQD8KnsIiKxjTdgtkk4DSJbT3l9Ei5EHP3nvVN?= =?utf-8?q?FKvaMDt18xBHJkVrENsBzdrAV1sFPwGE6MfGYDqRp6vO80MgESZzo7XU?= =?utf-8?q?OKBlLYLeYnxrbNi/a0nUFGzBN71KeQDVI0z7mskcgDbqgaNN2PsGJm+g?= =?utf-8?q?Wr6iZqCWs6nPbHd+K/VOpbhsWdBiKwlOZPeoUfFRMwmrKYlG7YAwhFJb?= =?utf-8?q?lHKw2jLck5lzrnM0ZnY7qScw3iw49acpRAJv95n16vMqHO52ENjPh3Lw?= =?utf-8?q?V6DISiV3V9xM303SHKRHHGmqOb+I7O4j18RN7ogqRvDL58t8zFU9K6ML?= =?utf-8?q?P032nfGOnauzy16Lmo+DN954eHZrg5i5a8cR4fC5nq14qsgeaDHUZEe/?= =?utf-8?q?BXI6/V9wXevjWjwLspnrys6RS6gapJUzFtlWV566ImMPJFJFgBkyAXNX?= =?utf-8?q?iFWt7LT4WsOYY7BbkHa1580xU5FTNRG2/Haa07Ua1JI2Fd3CqK6jnQPx?= =?utf-8?q?FwQ6k4NL580fA96t1z3T3PVaqYpdur?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1343; 6:/0gOoIJKlvEY+ACX+d/FC3g8bZky+8mSpeicnEPvkTDNqRvlRB50G8v8ZAFuCstL0OVpBW0rPyg0JpxuicNomrSadOQmx4sWQJFY4VhqMf57WMLpNVtIkZzuGB3ioUOGeGst79E70UO2Pf3eex4UdHthYtD00lAimP/SRR+VfL4FWmHOKw/m8bZ4SdSFRZ4g9Zv9O1OpPoK+QAAqTfEgrfc7y5ihVvOnyOqqLTM4QM2Y1WhFM3/yviJPcuztE2mt+ycauRPTwBUd5jj906l6Y+Xfx45Sg/h9Mtyqm1g1+Z6257yKyo4+JQxMqQIdvWz0La6Xmd2231gwhXB1D86ZLziMHkN0Uav/DyvBjBUKIvg=; 5:xn25JFtTkRDjhXgeV+L/i0RWIgGLbi2yX1gPPKUW6DJg0lGlBZI1eZ5tNfP+pbFBadKaspT3kZDTa6j/9ZmWbl1v7qeJGHXhbd/YzD02HXu+/QK06i83pJXEri+8KP1bdM2HVl9k/Xgb51cIYQmi8LutZLgRS9lbiduL67YFqNg=; 24:uwICD9+H77ul5NYLQZeLcdSCn50Ak/upQ4+CIdSUPJuTKC9OaLVq5d/wkSKd237oaswlmGe+y/VkeMEJyi5POG37+jDftzzGBTZxcn97upY=; 7:WK3c1/cegUbJrCUsQnVhpOCG4sOoo+puLabZffWRI44ugfnNumQmHccgDsdkaKhLKB79/i+3hyfveyzoZtOVSInVIyQcEOsd8/EbDxk2qS8C5kNyKeus+p1iZejAgTSiG6Z8hxgJbtDD/sL4TOnuq1kDOyE0jgkKvCwioeLjdI5BD14SX1ThBNM1Nv4UXs4aaCUsX1+lfsEcLrB4lFbn4JRuYn1KN3jl1ZHHBKLpVi7LgqQMdvXITBvNViUitvxW SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1343; 20:rmB7/Hi5pYht26r2OT1jsXDvRmZFSbULsCNYte73IDVvemASZL0G+/vj1xBYoVciFwRygyghUMPUPlrhs/WBzCs+dqJAZdZCLn30043MfnrSMDSf/9t3UiNlp/UdvC68oHlUujniwC1FIldzTYWrRoTiL9v8tiKdQatfOm0vW5s= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Nov 2017 13:53:42.3083 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e5f80264-b283-4987-1ebd-08d52b671ed7 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1343 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Curently mutex is used to protect pernet operations list. It makes cleanup_net() to execute ->exit methods of the same operations set, which was used on the time of ->init, even after net namespace is unlinked from net_namespace_list. But the problem is it's need to synchronize_rcu() after net is removed from net_namespace_list(): Destroy net_ns: cleanup_net() mutex_lock(&net_mutex) list_del_rcu(&net->list) synchronize_rcu() <--- Sleep there for ages list_for_each_entry_reverse(ops, &pernet_list, list) ops_exit_list(ops, &net_exit_list) list_for_each_entry_reverse(ops, &pernet_list, list) ops_free_list(ops, &net_exit_list) mutex_unlock(&net_mutex) This primitive is not fast, especially on the systems with many processors and/or when preemptible RCU is enabled in config. So, all the time, while cleanup_net() is waiting for RCU grace period, creation of new net namespaces is not possible, the tasks, who makes it, are sleeping on the same mutex: Create net_ns: copy_net_ns() mutex_lock_killable(&net_mutex) <--- Sleep there for ages The solution is to convert net_mutex to the rw_semaphore. Then, pernet_operations::init/::exit methods, modifying the net-related data, will require down_read() locking only, while down_write() will be used for changing pernet_list. This gives signify performance increase, like you may see below. There is measured sequential net namespace creation in a cycle, in single thread, without other tasks (single user mode): 1)int main(int argc, char *argv[]) { unsigned nr; if (argc < 2) { fprintf(stderr, "Provide nr iterations arg\n"); return 1; } nr = atoi(argv[1]); while (nr-- > 0) { if (unshare(CLONE_NEWNET)) { perror("Can't unshare"); return 1; } } return 0; } Origin, 100000 unshare(): 0.03user 23.14system 1:39.85elapsed 23%CPU Patched, 100000 unshare(): 0.03user 67.49system 1:08.34elapsed 98%CPU 2)for i in {1..10000}; do unshare -n bash -c exit; done Origin: real 1m24,190s user 0m6,225s sys 0m15,132s Patched: real 0m18,235s (4.6 times faster) user 0m4,544s sys 0m13,796s This patch requires commit 76f8507f7a64 "locking/rwsem: Add down_read_killable()" from Linus tree (not in net-next yet). Signed-off-by: Kirill Tkhai --- include/linux/rtnetlink.h | 2 +- include/net/net_namespace.h | 9 +++++++-- net/core/net_namespace.c | 40 ++++++++++++++++++++-------------------- net/core/rtnetlink.c | 4 ++-- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 54bcd970bfd3..36cc009f4580 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -32,7 +32,7 @@ extern int rtnl_trylock(void); extern int rtnl_is_locked(void); extern wait_queue_head_t netdev_unregistering_wq; -extern struct mutex net_mutex; +extern struct rw_semaphore net_sem; #ifdef CONFIG_PROVE_LOCKING extern bool lockdep_rtnl_is_held(void); diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 10f99dafd5ac..aaed826ccbe7 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -60,7 +60,7 @@ struct net { struct list_head list; /* list of network namespaces */ struct list_head cleanup_list; /* namespaces on death row */ - struct list_head exit_list; /* Use only net_mutex */ + struct list_head exit_list; /* Use only net_sem */ struct user_namespace *user_ns; /* Owning user namespace */ struct ucounts *ucounts; @@ -89,7 +89,12 @@ struct net { /* core fib_rules */ struct list_head rules_ops; - struct list_head fib_notifier_ops; /* protected by net_mutex */ + /* + * RCU-protected list, modifiable by pernet-init and -exit methods. + * When net namespace is alive (net::count > 0), all the changes + * are made under rw_sem held on write. + */ + struct list_head fib_notifier_ops; struct net_device *loopback_dev; /* The loopback */ struct netns_core core; diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 6cfdc7c84c48..f502b11b507e 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -29,7 +29,7 @@ static LIST_HEAD(pernet_list); static struct list_head *first_device = &pernet_list; -DEFINE_MUTEX(net_mutex); +DECLARE_RWSEM(net_sem); LIST_HEAD(net_namespace_list); EXPORT_SYMBOL_GPL(net_namespace_list); @@ -65,11 +65,11 @@ static int net_assign_generic(struct net *net, unsigned int id, void *data) { struct net_generic *ng, *old_ng; - BUG_ON(!mutex_is_locked(&net_mutex)); + BUG_ON(!rwsem_is_locked(&net_sem)); BUG_ON(id < MIN_PERNET_OPS_ID); old_ng = rcu_dereference_protected(net->gen, - lockdep_is_held(&net_mutex)); + lockdep_is_held(&net_sem)); if (old_ng->s.len > id) { old_ng->ptr[id] = data; return 0; @@ -278,7 +278,7 @@ struct net *get_net_ns_by_id(struct net *net, int id) */ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns) { - /* Must be called with net_mutex held */ + /* Must be called with net_sem held */ const struct pernet_operations *ops, *saved_ops; int error = 0; LIST_HEAD(net_exit_list); @@ -406,7 +406,7 @@ struct net *copy_net_ns(unsigned long flags, get_user_ns(user_ns); - rv = mutex_lock_killable(&net_mutex); + rv = down_read_killable(&net_sem); if (rv < 0) { net_free(net); dec_net_namespaces(ucounts); @@ -421,7 +421,7 @@ struct net *copy_net_ns(unsigned long flags, list_add_tail_rcu(&net->list, &net_namespace_list); rtnl_unlock(); } - mutex_unlock(&net_mutex); + up_read(&net_sem); if (rv < 0) { dec_net_namespaces(ucounts); put_user_ns(user_ns); @@ -446,7 +446,7 @@ static void cleanup_net(struct work_struct *work) list_replace_init(&cleanup_list, &net_kill_list); spin_unlock_irq(&cleanup_list_lock); - mutex_lock(&net_mutex); + down_read(&net_sem); /* Don't let anyone else find us. */ rtnl_lock(); @@ -486,7 +486,7 @@ static void cleanup_net(struct work_struct *work) list_for_each_entry_reverse(ops, &pernet_list, list) ops_free_list(ops, &net_exit_list); - mutex_unlock(&net_mutex); + up_read(&net_sem); /* Ensure there are no outstanding rcu callbacks using this * network namespace. @@ -513,8 +513,8 @@ static void cleanup_net(struct work_struct *work) */ void net_ns_barrier(void) { - mutex_lock(&net_mutex); - mutex_unlock(&net_mutex); + down_write(&net_sem); + up_write(&net_sem); } EXPORT_SYMBOL(net_ns_barrier); @@ -841,7 +841,7 @@ static int __init net_ns_init(void) rcu_assign_pointer(init_net.gen, ng); - mutex_lock(&net_mutex); + down_read(&net_sem); if (setup_net(&init_net, &init_user_ns)) panic("Could not setup the initial network namespace"); @@ -851,7 +851,7 @@ static int __init net_ns_init(void) list_add_tail_rcu(&init_net.list, &net_namespace_list); rtnl_unlock(); - mutex_unlock(&net_mutex); + up_read(&net_sem); register_pernet_subsys(&net_ns_ops); @@ -991,9 +991,9 @@ static void unregister_pernet_operations(struct pernet_operations *ops) int register_pernet_subsys(struct pernet_operations *ops) { int error; - mutex_lock(&net_mutex); + down_write(&net_sem); error = register_pernet_operations(first_device, ops); - mutex_unlock(&net_mutex); + up_write(&net_sem); return error; } EXPORT_SYMBOL_GPL(register_pernet_subsys); @@ -1009,9 +1009,9 @@ EXPORT_SYMBOL_GPL(register_pernet_subsys); */ void unregister_pernet_subsys(struct pernet_operations *ops) { - mutex_lock(&net_mutex); + down_write(&net_sem); unregister_pernet_operations(ops); - mutex_unlock(&net_mutex); + up_write(&net_sem); } EXPORT_SYMBOL_GPL(unregister_pernet_subsys); @@ -1037,11 +1037,11 @@ EXPORT_SYMBOL_GPL(unregister_pernet_subsys); int register_pernet_device(struct pernet_operations *ops) { int error; - mutex_lock(&net_mutex); + down_write(&net_sem); error = register_pernet_operations(&pernet_list, ops); if (!error && (first_device == &pernet_list)) first_device = &ops->list; - mutex_unlock(&net_mutex); + up_write(&net_sem); return error; } EXPORT_SYMBOL_GPL(register_pernet_device); @@ -1057,11 +1057,11 @@ EXPORT_SYMBOL_GPL(register_pernet_device); */ void unregister_pernet_device(struct pernet_operations *ops) { - mutex_lock(&net_mutex); + down_write(&net_sem); if (&ops->list == first_device) first_device = first_device->next; unregister_pernet_operations(ops); - mutex_unlock(&net_mutex); + up_write(&net_sem); } EXPORT_SYMBOL_GPL(unregister_pernet_device); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 5ace48926b19..caa215fd170b 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -390,11 +390,11 @@ static void rtnl_lock_unregistering_all(void) void rtnl_link_unregister(struct rtnl_link_ops *ops) { /* Close the race with cleanup_net() */ - mutex_lock(&net_mutex); + down_write(&net_sem); rtnl_lock_unregistering_all(); __rtnl_link_unregister(ops); rtnl_unlock(); - mutex_unlock(&net_mutex); + up_write(&net_sem); } EXPORT_SYMBOL_GPL(rtnl_link_unregister);