From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: ACJfBotcAL3mXLlvUXLiEHZngNjSeCXOIrSv34jBubFZ6J82RZ6hWOulKS9+i783CGpPz/7e0VFC ARC-Seal: i=1; a=rsa-sha256; t=1516219499; cv=none; d=google.com; s=arc-20160816; b=WeevPPmIWiblFUztkeGr9QWDlYjYwzbW8nL1MAasMUlPESPosCUTNVXS5XwmyGA3ds AoYoamXr1DfGfEoRjWW6IEGKKAskSVfbZYHT0rTDNUJ4GHeCvU/LHSbRhmMhg0yYBE1A W6szmahRLLzOV3uAD2iGqJiOXNAYHoZEVBMq508i1NkBE7LABuCdbWoPkPUwsKGIX4FI 4y0dG+Zi+shGTzV9VPVw6iCJI7ECCoNEbz6zc4ODd2N+pRdbXJCKjkymXbsGaLAZG8uD K2AhASbTxNW5ZNthkNGnMqzgHxDzjjwV/3ku9Y82P1jQxhXj72O0RMqLN/Y3kHxB9uiZ i7Bg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=spamdiagnosticmetadata:spamdiagnosticoutput:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=ptrhRNr3FC8pxGqzpqe2wazzLBydrMbyFLrB3JnNl2c=; b=AR8qR9+2teUTRYERFALPbtze+DQxXailP2Rld5n6DlnxrV5RSSvZ552hOZbDSI/c2i XGqo3UzR1LbI9Ath3OW847dhQ1H1i/Gx9wg+rlQLilcF7lboFMIUh8f/vfblSfM0dOrs oKRSwZcbGl5vvMKXO5Qz9cOu3nS2Z8HmjYiM2dGSE5hySdM3Lk1r9IxkJHyXxHya3zEy SKZx3DCPiLDIbpiqSqxUxyiUxeYvDAthdVQepsAyZmO/urc0QgXKxJIJ3/fAN1N5WQAi mpnvKwosJgNeL9MoJdEm0JgQy7VLfVwKTq8P03GdO1VIOCPQ2Xz2jOHN0eSx8L8J9xlL UkMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector1 header.b=LKePe1Vo; spf=pass (google.com: domain of avagin@virtuozzo.com designates 104.47.0.128 as permitted sender) smtp.mailfrom=avagin@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=LKePe1Vo; spf=pass (google.com: domain of avagin@virtuozzo.com designates 104.47.0.128 as permitted sender) smtp.mailfrom=avagin@virtuozzo.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=avagin@virtuozzo.com; Date: Wed, 17 Jan 2018 12:04:37 -0800 From: Andrei Vagin To: Kirill Tkhai 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 Subject: Re: [PATCH v2 03/31] net: Introduce net_sem for protection of pernet_list Message-ID: <20180117200435.GA6222@outlook.office365.com> References: <151120175301.3159.9577108443167812854.stgit@localhost.localdomain> <151120275448.3159.9199776106492105413.stgit@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline In-Reply-To: <151120275448.3159.9199776106492105413.stgit@localhost.localdomain> User-Agent: Mutt/1.9.1 (2017-09-22) X-Originating-IP: [4.16.175.162] X-ClientProxiedBy: MWHPR11CA0044.namprd11.prod.outlook.com (2603:10b6:300:115::30) To DB5PR08MB0741.eurprd08.prod.outlook.com (2a01:111:e400:599c::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 521e52d7-08d5-48c2-46be-08d55de59426 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:DB5PR08MB0741; X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB0741;3:pHcuWWylcEtHYLjxN23BtXWOeLUp5zD1usqRnzZAO5yoqFwMlfuUaqQJ5VSjrqzbtj9k49OHpwMGyhwD66j4Zzx1WAwI1z1rEjLWYG5VYk/9Kn58wuRxC7KmrGJwajFD9WEa4VFFImJNMIv4pSjp//GAk1vxK4zEWE7Ni2J/xei6xF6qNszuE4UMTfzWu+DscTZbzqxOzop9ze54vcg9zKpO5dyQY/ibep3ZBNH79InPZLiDfCiUlF7Me7NRKIWQ;25:dBYNOcus+/k0KyvP9O/RvjH0OMtSLmVMVXXvCMnRnG400tJQBeqU6+6aOB4uJY4SM4BrAIqC33p+rKS2wXx51RLhLrRhRnv7gFUudxqNFdUPkcJNPmccs0GDs06gYJ6xF6P927qEI0eL8gIQ8X2/n6WqBQ1M1ymRe24sRo/FyFP+2f0GbgFxwHs7gH996fXIS0xo539Zn7x/gUZ5k1t/HI/ljKdRCYhgQcRV7hw6ELz4gzg6OxeqlIIJwO5e/SLLl9pBqnf3qmVnQ9PZv2AxjGJZXEOxaY+pVaEew57pCFMKzoA81GMoCCq/8ci4mvPKRMcmGUGMJfTSyBHcRC/udA==;31:sr7YbPN2oVRDY2XnuJORSMBj0NxSU2TMggEvNC9hQSCMD4Yib2vybAwQrPP+DG4cLSuLXbDeOBWghzEqBr2hOUX9lGuAH6TvqZMRPLKb9w7ljCbUyZIO2BOLWJ9pPaXrL3qsugNCbEEWO6Q89xkB04O/N8Oc9tOHcH2gWwWkjgaDTwA5CjpkN9G1DIr3I7EHrWrxwHLW05yHIWVzlQKTXwpa3yEFfO1gBpO5sqpUpuU= X-MS-TrafficTypeDiagnostic: DB5PR08MB0741: X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB0741;20:3hkJjmAZ3Etirt2+4+VtEKnqr0WFBzOpU/AsLL+/bWnM2+9oTcznijoD32LinpM2Nm9zGoONbsw/lpzPG+ge7sG4e219YmDJmWT+oqe8VaiBqbyMUsmhWMhCUr+xkLS3c23NCMhGutJaBzNBozdWRIhBiIwiK24Ekanm39ZKbFUxCPoJjhZOchyPWCBOf+d4dolUbUnBZqGpX9bF1gC28WUrtpWExo9WBa/EiCYBO73zVBDo2Iem7WgdV6Jwmuz+B6WxCv0cIT9KZK6y3fXe18u19eYTporkBDn2X8qL6E8VcUp/g9gXk+VcIPwBvC1fcwgFQFthyoXyAC6QlI/FMoKg9onmUMcHZj4bV2n0pbjhTSoI4xFVAnc6dNST9iF57KFlBtOLk04odu75YSE3ntq8UhwIMYbNiBMwH7jLw5Y=;4:oGawunV6aJrPQb5Xtzhsu4v2huBmoKeqo0/HLuXJE7iRByHVDTusaHTm7ookUFoTB7jUH85oOr7kVnjjIM3/ygCj7ka+pfl4QyK4LcHtJIoOrTGsJCn25S81mPpgmWppSshOWK9Cu6JeHCPPfINcuUcLC3zD9RLdWsoFMqbzc+R9nIpBQnBQ0sIwBRDIcPKfOn96l/Wqze8rYVDsfz4JI0yvHa/872Mo+jk4X4L0E9bhO9Lbot6o+SarXWq3KR+x9EwANrZM7wZobZiZhytpNA== 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)(93006095)(93001095)(3002001)(10201501046)(3231023)(2400048)(944501161)(6041268)(20161123562045)(20161123564045)(20161123560045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011);SRVR:DB5PR08MB0741;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DB5PR08MB0741; X-Forefront-PRVS: 0555EC8317 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(39380400002)(376002)(346002)(39850400004)(366004)(396003)(24454002)(189003)(199004)(69596002)(2950100002)(6666003)(1076002)(33656002)(229853002)(5660300001)(37156001)(55016002)(16526018)(316002)(2906002)(53936002)(6636002)(16586007)(53416004)(47776003)(50466002)(105586002)(478600001)(4326008)(25786009)(6246003)(6862004)(39060400002)(66066001)(9686003)(86362001)(83506002)(6506007)(59450400001)(81156014)(386003)(81166006)(8676002)(7416002)(7736002)(305945005)(26005)(7696005)(76176011)(6116002)(106356001)(8936002)(23686003)(52116002)(3846002)(97736004)(68736007)(58126008)(18370500001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB5PR08MB0741;H:outlook.office365.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?koi8-r?Q?1;DB5PR08MB0741;23:b7JUBmMa6a6sN3Oag6mFRTT2R9CgukIvdXS2j2Weu5q?= =?koi8-r?Q?D06hWgFksmWkz9ou2b+CaU/W+IqT+m4azvnyqfoBMPBNtjlS+qgDCg0PLQCWsn?= =?koi8-r?Q?DfcDJgyFHotW+5tnND4LYpKr3rG9sjON+z6VU53cLCYO6tRinJwmmizYIkOHC1?= =?koi8-r?Q?XM6d79jdoePH3QfnfmiJNH7a5BUdfK5Ck5mXDoXRQSqh31hWBqLzMEqysYXu5J?= =?koi8-r?Q?G4aklORhyWGUVVU/Db9CTx6bvm2EKFYQOxL/VF6vv9p+jMcgg0d+JBHwifANZ0?= =?koi8-r?Q?gMlY2twqHz3jzIbi3Gow8lw+HqiQwUpnonW1CPJJ9ESmLLoPNnujGaW5SGoRto?= =?koi8-r?Q?WCZboa0EAir3cVCD2YyxO29sDZj6Cp3CPAg1wou1PcBBjuLR/U+vh9jDM0wxR3?= =?koi8-r?Q?BLz0BgnklIW7tKHvxS5rtfzukbUcBtbEEokTBdO84VNmzecLXagcTPeD7Qm8MW?= =?koi8-r?Q?UfBPNxRddxANeooRrtWpRcz86u6Ms1R7C5Igkh/QsGlkxbjvogqDoruKFw6MXn?= =?koi8-r?Q?R8KspkhZMpaeWTF4W9DGO0Zyti4Sys6xOLiwsEmUXnosEf1ZGEm8Nqyr81JqL2?= =?koi8-r?Q?MtfGRO8WX7S/UhuwyPlUd4qTuWV75EXT5eemzCYSlYOQI9c6pyNgncfPNRwNGL?= =?koi8-r?Q?/DLRycGXjnYa6/OLx191RwszeErgmF/+uusAbSKt8UQZ6ZG1R8XqjFRByn7qWu?= =?koi8-r?Q?30GLIgc4klJwL0KOWc7iOeMZi+uqO5/jQ4fL69YrhTn4HnSoDm3C2V8Nj4xQYw?= =?koi8-r?Q?qON3MrgZDUQ7BQZhmeAIGqV3lrRbmtmeCeWCjL233vb+m/ZELsPxGfSuHNTSF5?= =?koi8-r?Q?c+Bepa3hr68mKVT9NRYAo9dpsdh89jwTdQsEwX8k+/VUMq0QZ4bPwulDygqfYX?= =?koi8-r?Q?Qg+SGUsciiNGTEEXssl6PAuw1xXTltfRBOj325EnUQrtU2MYotITtXTETkCdDd?= =?koi8-r?Q?xFZH7e66YxQRgki3XuVe+dsKVP7+pz8I8jI1t1mWso3wA3lmJMC6mwH7uRXMRE?= =?koi8-r?Q?xRFy09x6m4tFnImuybQZZN9wRFBzQp86qijSmFdx4B7yHLp0wqHKmxnYwCgilq?= =?koi8-r?Q?Z0WfmrBhOG0RhAZh4i9hjH5lxeLmGP7aAd6FJuSrBTI1Eq+JvL6GJ8Tv5b4W2T?= =?koi8-r?Q?WDLn5Lepr3RTJqWIj+Oi/yRNsDQi5ZWShP6mKjSlI8shXw+T1JSan9ogkRZGtz?= =?koi8-r?Q?6Hj1gPxkyMASvTzk4d0L7Amjvp/t8+aVabWmgoS1JGYX4x1jorR+zh46xMMm0v?= =?koi8-r?Q?rBpCjNhvrW1NeEKqrKar4J0W9rgsnIQI7Cth67ug2Nlbbm6KJZM0mmp7HTW4QP?= =?koi8-r?Q?zIrDNBVA91IhtAoV6PMCRL/ORzcnF4eufgBtSgKum8=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB0741;6:vbMVVsB0pR06c0H/Wso5ducsCqKqrtdqfPTZN39DGDHEpp8SIkS2cO2L4rRAtUjlT9r8YiHG987bx4oH7vA2sYyC2Mqed7w8IjG6RGTjFC26rlflJd5Z/FMfqFNOdZ4mynWFdximJyLUS166ADsvttaC7r2hSMzWfAvQ0O55IinRGVmE9GlUrqVzxvQz8H6Sg7MPpjZYMSPPg+CRCYO8zRhn2Lygd9Qd3XyBUrVY2G2WjDscQ6n4VSbc7wzTnb4oHGqSnA+vsrZh7Ee28nusyaOKKMl8L9d6l0pbhHS+1KxlnQmu4CMxbpFQQJ83quOLlg5ibVQ9GT/s2DI7r1I+gWY3Dtn0v7ZsM2PJhH7r96k=;5:r4PEMIzxjEHPuGkdZpFm+9v03w+ZAD+zA+mXuiCRq67fu3ryxUEFMFlPkxmif0ABHqXonRSshKc0EGHoVjhnu4W6YdtXlDw0F5DQkEwlGDNy7rwq5natqm9U9AkkMKikMleuTJuIX29IVOpfzap2Hy3y2h3RS1Etgcv8ie9wYCs=;24:yM9RixyoDs3KIDDhE3a+2Tgz9N//Qn2tXg/MrxIJGQBRsTIJQIl9YrNrqzPj6tzxViWdbmbVbeOM5paFXEM0pZTYLO/Svi0BfDG7SmQnX6E=;7:kjkGdvZyInL2sjoiZ6UEuSYI0CI0RVcuN5ipcVDnhwOKF//j4BcB2DFa9OjDhk6N30TA8T1M4X5uPMgVeD7Nsb9vFHb5M3yF2hIJ2SoYPEBp6jRFYhSOKmEe7mqa/NMY8iu2NOiTbv1YBtLyqehqNsV2Gs+N5d1QErcRMyCTXSPAO9L8/UwQZVlXnBkWF+MDWyzEaah9wI7qFMLXHAcZbjOBqChwOlXHNlDPwAGHKi4eIPm8GidGd4RUZPUJqqDQ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB0741;20:g+lOtQ3XXtLHCirHRNXE5FpCuQpTIPGx5fr6pz+6TUXVDfBWbIgZVwc4gUDfxWCq4n0MG6xd1hkgFH3oX2GS+Ekv0k0RlW5U7E7C0vaoX31k6aOFANPBR1T8WU8uoVnmNmqVQCFziMttDKEL1xWsAD7WPVZdfjsCFUs5oL/CgfY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2018 20:04:50.1283 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 521e52d7-08d5-48c2-46be-08d55de59426 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR08MB0741 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1584610950630930047?= X-GMAIL-MSGID: =?utf-8?q?1589871377575165869?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 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? > 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); > >