From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: ACJfBour3RSWsEVxdShP1dA3UGsLAODkXBFFeIvQ6pOV5WQa75DlnzCFMC8cgDgwv3hoHgOeWMLk ARC-Seal: i=1; a=rsa-sha256; t=1516270479; cv=none; d=google.com; s=arc-20160816; b=QlpnxyHc6r8HTULV0B0UQG4/ZLM1oDl2uB3qb3dW3PqKm6tPs8I3UvSXH0UBYqD2XV I5gzTQFGvLie/cW7lcCaUjr+ecmvmP6p/NQBs4+BXHr5whkxObssdXDLAlVIQ2zMqbg8 YGir511qpA0T53OGLne4fYqK3aBlBxdgc9Uuh3QQZCZ/8Y0vmCB86UXnY+RFG1oVDL6Y tzutvhrmID97Pck8AW+VO6eDaiORLJXHnfhye644o24realEMLeehIPERr8QYp7boaI3 SPBP6vPNQIgGtOKf11T1fRQju1GcI35hK4RABKrfB7/8DEztvEeCunHJif4bhx2OH+Fz K4Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=spamdiagnosticmetadata:spamdiagnosticoutput :content-transfer-encoding:content-language:in-reply-to:mime-version :user-agent:date:message-id:from:references:cc:to:subject :dkim-signature:arc-authentication-results; bh=yBIRCvdfkQfZ1Mn6m36ZedcWXykOmDkQWdp9AGmI0Io=; b=py8n7VZstnJKcjQkDkMM4fmdYuKMoPcpsUaZC2Ivl7iZj0zDX8gylxdxXO1c6qtNQP Mi6JrEpmofyOQxd9oxzvM9veJ2l9ypK71k+uHgF3eBJk6nd5lz3L6zCheShjAKFWI/37 6omTlCaNNIe6cx2xkeK27yy+IV/mcM0sBHAqif72EG+geZIh+LkrR5dy47Ywp43CnwlP vdRn4PgeWq8F0aEVFhIoRKdrQVQXWe9o1uq1BtylB5vmF4OdibNoG1au59IxtLvNsNoI 7lF7IvldjgMTVCcZtc6svrpFPw2H8dnRSlE9emlNe6ejlzqjeugxjRFy1VOfglNhs+W7 4DVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector1 header.b=P2gYUrCF; spf=pass (google.com: domain of ktkhai@virtuozzo.com designates 104.47.0.127 as permitted sender) smtp.mailfrom=ktkhai@virtuozzo.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector1 header.b=P2gYUrCF; spf=pass (google.com: domain of ktkhai@virtuozzo.com designates 104.47.0.127 as permitted sender) smtp.mailfrom=ktkhai@virtuozzo.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: Re: [PATCH v2 03/31] net: Introduce net_sem for protection of pernet_list To: Andrei Vagin Cc: 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, ebiederm@xmission.com, gorcunov@virtuozzo.com, eric.dumazet@gmail.com, stephen@networkplumber.org References: <151120175301.3159.9577108443167812854.stgit@localhost.localdomain> <151120275448.3159.9199776106492105413.stgit@localhost.localdomain> <20180117200435.GA6222@outlook.office365.com> From: Kirill Tkhai Message-ID: <8bfb4034-5551-d9cd-ba52-729faedb738b@virtuozzo.com> Date: Thu, 18 Jan 2018 13:14:26 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <20180117200435.GA6222@outlook.office365.com> Content-Type: text/plain; charset=koi8-r Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR0202CA0017.eurprd02.prod.outlook.com (2603:10a6:4:29::27) To HE1PR0801MB1338.eurprd08.prod.outlook.com (2603:10a6:3:39::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c90686e0-556b-402d-9fab-08d55e5c44f0 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:HE1PR0801MB1338; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;3:YHsl23rNaEq0pcMmWZWJ6eYoiDa5b/3pOisJeAwMlmV4oaKpb6KSauhUjcUheyDuFnMfr6cgGFTIpvH4NhRrQRZ5GyfgeT9uE0n/lVx8rS+MZoaGONVqwNUpIf4c24j9nJL7xNorXc7tyMwS984i8fVFciCV/UNNfKz0ebjut0QC5m3V0hVm4gM8EeYv8wWRaWmYgCsOegkvzd2suVlxJoKnO3dZ/QIyV6kGVDI43obHX1JSJYRNCseLbalGXvbq;25:hSrtt5QLEUtUL5gAsQoEWI5wofer4QcI4xkZfoOnmoBaBAlY3KCnb1QfMBOUso91kaSNI7SbBmcjqUcKiGgn8siMe+4TyJeO3QNe654w2GxwpHbi5Pu+QGk4cFtabtxXzlkONE4WAYEDo2cwFl6WRAzkT/5J0ICaGKmUiIWL1l9aZAdxbRUF0Lw8BXJdacfEk0fog388x8HSlL/AkD/wH2d5IrMkbXoChFvD5biMwkJ6+xOQK3CpG6XxEVRT8z8/m3rbxl8azL4NHIqCt5VDVD7vcZ1sTvHkA7gBhSwdOl/it/OTPvV6zysveZHVEEO7+LBIZ0Oh4T2mWXWM/FBziA==;31:3Ez6CfnG3yksqljWWMCvHJFhMRRYd4k9oFWBZzMvRDmTKoARG2HcYq0888wgT+wtZwe2TEsryjmcy9sG2w+8NfUjwqt04bwiQMmRBR8YLCcl1nLMuwwIggdzbZCL5aBX1W3ZyctirtctHqSPU15bu2VtcnDr7cByHNIT3Saz8hbdDU8ZCNPuvj6akWZO/syB1I9fj3Z43EXAk1rKqXrr4byZIsajfEFMZjRKf0i2PL8= X-MS-TrafficTypeDiagnostic: HE1PR0801MB1338: X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;20:w2/1qxqErPlEpfiXAQsbfHBOEhuFJw5hlV3hm/yYJMSOsHzABdrnCBMPBxlVWDTPUHB3IY5O2oRU97/5qF9CtIPwQsVSg5TgsCQdaY9ifFH4zMskeseM8+oHMwIyg32yzm72KI84X5y6HEz5CAxh2GKDwNdN69RlV8YDI8NsBP+J/RXXhPKeA5rWNyAW0QUQ/Qnr01E6jS1RCq0vzYzWsw4A9UQzBlehYTdFWob1C9UjYzRMEurGENA9K2mAPXFHtyCa3XtOEdZ+R16bdepxVHto9RROC8MKAx7X168WXHG1t+djwj8KU/So3T8AtjvGb4R/GHt7G4k8O/Kg0zY+VzEYqAKr/Ibw2Jds/3ty4ETYa19ToZx4tnSvFeBcOYPHTxC/9OdWgJJwHmbZugk2FWapR7pxhzLG4NjMxS5vo4E=;4:xr/jOgH34O8QUjAVa+7FyKbcbrfs6yfbd6+Oc/j6ZKfRJgIwkn0S+jEPEQ2d6KuL+5JklAdiORUsXRGmlsucsf9EVdm1SYL8l6la04gCrf4bToYQuEhD9rBFo7r2YywRuwigdsMfqjWmA7wBLTam//xPvJ8w5EIDE/5CWJK+cb3hST+cY8Is3hMIdR3uSkZZ3jyoaWchgULbFgP/Zm/nJcwgL4OOVxiqBZ+1N6yIztPQRDLS4TfqHE+fASIfCoE27o3ANoWEli2pzko+6WSNlg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(3231023)(2400060)(944501161)(6041268)(20161123562045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(6072148)(201708071742011);SRVR:HE1PR0801MB1338;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:HE1PR0801MB1338; X-Forefront-PRVS: 05568D1FF7 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6049001)(39850400004)(346002)(396003)(39380400002)(376002)(366004)(189003)(199004)(83506002)(229853002)(8676002)(31686004)(86362001)(81156014)(53936002)(65806001)(65956001)(478600001)(3846002)(50466002)(316002)(26005)(16576012)(8936002)(81166006)(16526018)(31696002)(58126008)(23686003)(37006003)(66066001)(97736004)(64126003)(6246003)(36756003)(230700001)(25786009)(6862004)(39060400002)(4326008)(7416002)(2906002)(68736007)(7736002)(305945005)(47776003)(53546011)(386003)(65826007)(105586002)(106356001)(2950100002)(76176011)(6666003)(59450400001)(6486002)(5660300001)(6636002)(77096007)(6116002)(52116002);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1338;H:[172.16.25.196];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?koi8-r?Q?1;HE1PR0801MB1338;23:VNm20OvPq9pLvAoBObjkeH0WNxCrzRwezFcTJ+6w3?= =?koi8-r?Q?hXJfdDb5DZOHaBxRTlmmNM8sJNEfLNCeAkhcfkM5Bum5qlkOj79jIzXOqmD4Hm?= =?koi8-r?Q?EoOw2CPBd1PNKDns9khGYSZihTF/RLHngb2rhJEUo+UpfE5i4AETPY2E605Y/O?= =?koi8-r?Q?b2Qmi/7KIrExiuHxsudR85xXDjhh30bV4v5akv5oNq1UwW+n8a4QDodHQMb3Oh?= =?koi8-r?Q?eAN76bO4spRlrcJrexnaB1+9ntem+T3Z/9xZZ24HwXX5l/ap/DhVy5Ucs0Lu5i?= =?koi8-r?Q?Q8ndKmbFiJvYQlSVNka3HflRN9uzgublNFUKaEeqndpOxKSlzl5tjfzAHCSMS4?= =?koi8-r?Q?As3QhzVvbVWLeH6sTTD2B2xwiwsCDzWGaGTUpakXWP07nDyiXnyq9Rakgt35Bp?= =?koi8-r?Q?kz7Te7k+av6FEAR0TlmygAVbZqFGUuQnI1cE50+Xk1VCNt7MKz2BHHoGCeuLH+?= =?koi8-r?Q?FHvcYJeQBwrs8+8hhdYEPsOxXMspHIJo8MPHMtu1oC2DFtzzKOKQUrMG2A4BPB?= =?koi8-r?Q?LI2fX2XtQ/KHUsjBmip9Na+4d6l3LblvOc6zk8Hxd3t6thsY9GMlVocxPV1aoP?= =?koi8-r?Q?omKJSJps9Y19gzfga2K+qXUfkX3gz2c2W1MbS9wIyEGbekges6zZ7aUgQ5phd/?= =?koi8-r?Q?DG+yb30m8keflmZDWmWIMGav9YQKGwXLHCKRa1ZjGTvHVnTPW3EQUURGDX+8RQ?= =?koi8-r?Q?RUR8A3rbAkUEk7qXqrYhwTE+LLXlxYJkzSQz3AhXfj1WulPWRT3BnFZs39/Nxo?= =?koi8-r?Q?0Xep9WcB018ppVsarlmUkoo4e6y/oZI1Foz281G4msE+v3Ci4y3AmMnbC8bHZd?= =?koi8-r?Q?PDI4GpRo3hLAosBgtk54ZgVjSGIG1XJPTEHe8Jd4D8rylvxh3qvsOL+T1/2vhE?= =?koi8-r?Q?hM0SoVX9/J59ZeEpj5fMrJaCs/bwj4tyvvjEgJD1A/Jg5a4ElbkI9m0y4aqkJL?= =?koi8-r?Q?6UQxzqA0naioGIBi3ondSSp/Pav+B7Fey1WK/52zxDjNsqMYE1l/fMg/pDlk5w?= =?koi8-r?Q?CVb+9f+UPwSaAa0O14WHZJZ///lPeqA8qHvZLRrReOaw1P50gb4WdaOmnx8bDe?= =?koi8-r?Q?R40VxKeAkjGEVtMjzTwqO2DlW1q4owhncK6BI6x/DJ/X29A9Kr+i0jGqF1tvpQ?= =?koi8-r?Q?/8cuhSkpvuQFUrqG38DGdYFc3M2vUml16AjyKoCnJrFbb8/THx6EQo9eyUINGv?= =?koi8-r?Q?ZAPaP0DHV2Eb1WJR0gAxCfHwZGrlFegmviPH4C87KRkndT8OMrftpLF5A2TeL5?= =?koi8-r?Q?20IiG6udV2wT4Fs5p0g9PopKznAPuPo12ITbD2uPPq8onAScA4Zqwz3/jXzgCA?= =?koi8-r?Q?3yXwa/z4Z8/5K8S6c6VzxMqqsChagHuBxRbsbYFbs8PWL+c5TaNfkWrw09IGUw?= =?koi8-r?Q?0z8lOrvozgotMZ2LySygo3zmw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;6:hs97R0eMejCxgU0Tsw+kc7obOOh7ZCRerQqM1CsRA5ia7j3gzVKcpXhP7NZyno91gQEez4R+/IAPx86j/kSbGX7P/vlZvwYrrQ75xoU4mxKge3+llJ/5A6oZPa3G4alEgeZHMY3b5c2ZqHq1Tg3gBY0FPP2hn7UoOLuQMlGjKdSX+/rdkQNpD3URZkxNwG3A41qehJj391TEDjOBKCxsc23EujdkZWcjhfEy0JE4UZBeqFO1D5SHhi4gu11jICHVnu0OppadM46yAKHG2Y5Bx9Pv0TKOcsRFGMYgcSN9fneQMRxDTIoSDYo8zkTB2esN37YKQhQv7bO+Fe0V9M2ySqJs3IjORqYqvqlIy97RIkM=;5:y3njq70TSebipoEw4g8AovGdszc9McapecYrOHXWWxmpcyqfciOuY8c2W/i4oScEhTUB63R9+4l72049JHc7tXw5Ry68fVX5Ud8Rd5JFS9qlCUBv2fwmu2jniDdo4JLaeONSC0H101ExJQSJ6mRKzlQdF96J6Ww8qUjysHrXn6U=;24:2r/2tetDEwrfHmsrNtRiEFzSgcpc1qEo9mjhChRj1i5brcAN/0h5ge99iyUV6MdsGMGo8PZVEF9hRTW3X9FqHOJ038eZZ7cZXhtPYyjavB4=;7:o11S+sD3IJvgzTZiQ6OU/FNEr5cTd9iUdhgKWjpEBkxThtiCvggf2UplI91BLHgBayqPKr9rFIpcvUCOufnZpNaqe9aSTLB+lUil7y0ar0bHNCyyTaPqPe510vT89MyBNy9YlEfYtpXRbidLSa7rXEh2jGG8Novl+9C/El6NiHA5t6bXaiY4RHBE7h85OadPt4V/2WJ29QIuX0pApPsicVcgmotuWTDat1ICdNgom40g/0Jg5DshAbeaZXJwXsEk SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;20:UMgxOgBTwzmX1o+y3KZYfRme4TSO72l5Y/HCP4ZE9AU3TCKmKmUqAQrr4Xuk1enLv65Fm4Xp2PhpHgIxBJJiatvBzkzC7+J8g6LqKBl+ZrzvUAl7YEibQBTeXFHzQC8Uq75eR3Q+MOiJ0qYZ9CFttBNiZ1neASlF7w70mvdU7iQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2018 10:14:29.8008 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c90686e0-556b-402d-9fab-08d55e5c44f0 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1338 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1584610950630930047?= X-GMAIL-MSGID: =?utf-8?q?1589924833888861980?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: On 17.01.2018 23:04, Andrei Vagin wrote: > On Mon, Nov 20, 2017 at 09:32:34PM +0300, Kirill Tkhai wrote: >> 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 >> >> I observed 20-30 seconds hangs of "unshare -n" on ordinary 8-cpu laptop >> with preemptible RCU enabled. >> >> The solution is to convert net_mutex to the rw_semaphore and add small locks >> to really small number of pernet_operations, what really need them. 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, after all patch set is applied, >> like you may see here: >> >> %for i in {1..10000}; do unshare -n bash -c exit; done >> >> *before* >> real 1m40,377s >> user 0m9,672s >> sys 0m19,928s >> >> *after* >> real 0m17,007s >> user 0m5,311s >> sys 0m11,779 >> >> (5.8 times faster) >> >> This patch starts replacing net_mutex to net_sem. It adds rw_semaphore, >> describes the variables it protects, and makes to use where appropriate. >> net_mutex is still present, and next patches will kick it out step-by-step. >> >> Signed-off-by: Kirill Tkhai >> --- >> include/linux/rtnetlink.h | 1 + >> net/core/net_namespace.c | 39 ++++++++++++++++++++++++++------------- >> net/core/rtnetlink.c | 4 ++-- >> 3 files changed, 29 insertions(+), 15 deletions(-) >> >> diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h >> index 2032ce2eb20b..f640fc87fe1d 100644 >> --- a/include/linux/rtnetlink.h >> +++ b/include/linux/rtnetlink.h >> @@ -35,6 +35,7 @@ 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/net/core/net_namespace.c b/net/core/net_namespace.c >> index 2e512965bf42..859dce31e37e 100644 >> --- a/net/core/net_namespace.c >> +++ b/net/core/net_namespace.c >> @@ -41,6 +41,11 @@ struct net init_net = { > >> static LIST_HEAD(pernet_list); >> static struct list_head *first_device = &pernet_list; >> DEFINE_MUTEX(net_mutex); > > With all patches, we still have the net_mutex, I think we need to add a > comment, which explains why we need it. Are "sync" pernet operations > depricated after this series? Or is it ok to have them? net_mutex will leave till the time all pernet_operations are converted. But people, who don't use unconverted operations, will have performance profit already. Comment is not a problem :) Thanks, Kirill >> EXPORT_SYMBOL(init_net); >> >> static bool init_net_initialized; >> +/* >> + * net_sem: protects: pernet_list, net_generic_ids, >> + * init_net_initialized and first_device pointer. >> + */ >> +DECLARE_RWSEM(net_sem); >> >> #define MIN_PERNET_OPS_ID \ >> ((sizeof(struct net_generic) + sizeof(void *) - 1) / sizeof(void *)) >> @@ -279,7 +284,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); >> @@ -411,12 +416,16 @@ struct net *copy_net_ns(unsigned long flags, >> net->ucounts = ucounts; >> get_user_ns(user_ns); >> >> - rv = mutex_lock_killable(&net_mutex); >> + rv = down_read_killable(&net_sem); >> if (rv < 0) >> goto put_userns; >> - >> + rv = mutex_lock_killable(&net_mutex); >> + if (rv < 0) >> + goto up_read; >> rv = setup_net(net, user_ns); >> mutex_unlock(&net_mutex); >> +up_read: >> + up_read(&net_sem); >> if (rv < 0) { >> put_userns: >> put_user_ns(user_ns); >> @@ -443,6 +452,7 @@ static void cleanup_net(struct work_struct *work) >> list_replace_init(&cleanup_list, &net_kill_list); >> spin_unlock_irq(&cleanup_list_lock); >> >> + down_read(&net_sem); >> mutex_lock(&net_mutex); >> >> /* Don't let anyone else find us. */ >> @@ -484,6 +494,7 @@ static void cleanup_net(struct work_struct *work) >> 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. >> @@ -510,8 +521,10 @@ static void cleanup_net(struct work_struct *work) >> */ >> void net_ns_barrier(void) >> { >> + down_write(&net_sem); >> mutex_lock(&net_mutex); >> mutex_unlock(&net_mutex); >> + up_write(&net_sem); >> } >> EXPORT_SYMBOL(net_ns_barrier); >> >> @@ -838,12 +851,12 @@ static int __init net_ns_init(void) >> >> rcu_assign_pointer(init_net.gen, ng); >> >> - mutex_lock(&net_mutex); >> + down_write(&net_sem); >> if (setup_net(&init_net, &init_user_ns)) >> panic("Could not setup the initial network namespace"); >> >> init_net_initialized = true; >> - mutex_unlock(&net_mutex); >> + up_write(&net_sem); >> >> register_pernet_subsys(&net_ns_ops); >> >> @@ -983,9 +996,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); >> @@ -1001,9 +1014,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); >> >> @@ -1029,11 +1042,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); >> @@ -1049,11 +1062,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 dabba2a91fc8..cb06d43c4230 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); >> >>