From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966285AbdKQS3G (ORCPT ); Fri, 17 Nov 2017 13:29:06 -0500 Received: from mail-db5eur01on0114.outbound.protection.outlook.com ([104.47.2.114]:5570 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1760763AbdKQS2a (ORCPT ); Fri, 17 Nov 2017 13:28:30 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: [PATCH RFC 07/25] net: Make sys sublist pernet_operations executed out of net_mutex 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, eric.dumazet@gmail.com, stephen@networkplumber.org, ktkhai@virtuozzo.com Date: Fri, 17 Nov 2017 21:28:21 +0300 Message-ID: <151094330120.20009.9804877551209771323.stgit@localhost.localdomain> In-Reply-To: <151094119999.20009.6955267140148739392.stgit@localhost.localdomain> References: <151094119999.20009.6955267140148739392.stgit@localhost.localdomain> User-Agent: StGit/0.18 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0002.eurprd03.prod.outlook.com (2603:10a6:3:76::12) To VI1PR0801MB1342.eurprd08.prod.outlook.com (2603:10a6:800:3a::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ff005d68-6b47-4a59-2a66-08d52de8fe1e X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(2017052603199);SRVR:VI1PR0801MB1342; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1342;3:21F5rUxka91AIKbxSVZFOCV5S0o+iUcFr3NYjkXtGLP7K8sXiSEs0HFx+fEUkPCwAcYFwX/dzWcUNzg0xKnPJxqVrJTGA7N+skWZXU9kC/8wxEcYEw2q/NrZ3HEGIK79op2XBKWJkF2TsgjazYCPLyli+Zn3rzJsImupHKWnNsUHhD0NUO7pW0JNbbYarXxVCMGSsCi95oxLAtRgsARUZ5/iL5/1HwCPUeDXHiAVFJ8wk5cN/hF/eyaIsqeSVHKB;25:1JD8LbM/TZrIjl5i2ELe1hyWl3ukpFBnrSdu4sdSGvuwJfEBHd1EnDzpMh5IFE1z4c5Nk60MDY/tkD0YQcOHd/WbOvwbV+OAAnJ0pIFGaYZLTgQJlkNznQ76WsdQnaWqxSN5hgT6hYCA2mjxlPxwCpNY3x7Z0RHlKsXIOIqKPT6qZIC9glUAWiEBD6izqgVFExhngpdiXa131e6JdiRIFLjhkNqR5CPijGVfJ0LylYzrvzn24TXmIWA4av+wzx8kCfV/nqVU0lswJQEBSzUWWYFAaOjkpRiudUfQLvxeQwLxvzHgyzSLcSjJAog0Mv1hfMJ4a/ekF6memLLmCNT8dw==;31:hkI7oLCKif2kYXAdjyJ/U18tXWKmMaf5OppUcYYObrB3CXLXxiU3xZw+58yR33eln0XvY5QCFN1efR6wPNTBhox01GPcAxe/2WJLB+Jr87wVAzx5t98Kqz16O+NkdUzZt3q3UbI44Qc4sLBODtddUMLdg2OWZw9IQrFTtUhq/xCo+0VlnxQy2iEQzZHdRgfsYxM6dzxch6jFbj0vJOBi4wDNhohL6A8QtZpFKB+ie6Y= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1342: X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1342;20:dQ/YAlLbs9sT1cYqA4pr23IlyPr9pGF+kZMru1Xi7uIL9DGvVzp+ZnsidyPNsssq2cm6o46gj9Dnxa1TsudY/AEvAneqYNhrpfJMOKHF4dOa2EO17Sdx3e5JmDZyUpPbISpGIOu4igurxs03gtbxlYtiAzRmLrZwrt4yB051krZJJ28ensWHX2NwdwcdoQWk8ojq+cIi5bSE7ta9QETKlbS58wkG8RzNxEjq5n3sP1e5TppcfB8jR48fxNvU29VLaodPVfNlGtTZWV9C6cFT3+9KHBt7Jdb7Jh9TMmKc2ZEd3o8wwrFBUbF3aQX9D3cNpqYJTxq95BCx+LR1nSQ/t/pM21vKYMr3qBfkumwWK9T7t3eouxbHqeku6vkL6+G+arZMZMaw7A24vtj8dDsXloUCdH3M3RPErrGqz01yv/g=;4:av4FRi7BSbD46WfVcDwmu8t9BgHuE9Smw87NUj/58n7ElOH/H45wrCNqQqMV/xX3Pt4095JbJ7CoGGTZfDJyJkOgwz9xf1c6KSX1NXuemOuA0rAlHI+8gijsv6PxyWI72XAqSWjeD08gfri8bNZCFRI4Ztenl4ElgCiDhi6Xu4exMAwzRU/4ZeRhGf4Uuq6QvNLjnhwz4lMk+7ibmOXmBw/Vok12zzCVrySaAORd/HEPWROtKzR7WS1TjjqS/S4FUpvYwebo5KvDj7GNv+BXkw== 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)(5005006)(8121501046)(3002001)(100000703101)(100105400095)(3231022)(93006095)(93001095)(10201501046)(6041248)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123564025)(20161123558100)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:VI1PR0801MB1342;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:VI1PR0801MB1342; X-Forefront-PRVS: 049486C505 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6069001)(6009001)(346002)(376002)(199003)(189002)(316002)(83506002)(58126008)(81166006)(6666003)(66066001)(68736007)(2950100002)(61506002)(189998001)(33646002)(50466002)(23676003)(7736002)(97736004)(55236003)(81156014)(2906002)(86362001)(8676002)(8936002)(305945005)(16526018)(478600001)(54356999)(3846002)(105586002)(106356001)(25786009)(101416001)(230700001)(76176999)(55016002)(50986999)(53936002)(39060400002)(47776003)(103116003)(6506006)(7416002)(9686003)(6116002)(5660300001)(921003)(1121003)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1342;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA4MDFNQjEzNDI7MjM6eVFoaUxoeEtoY0RnWUFBYndNVUtDUk41?= =?utf-8?B?dVNDYjZaa2VwVEJLK2lhbnFsU3QzYlRWWXZORUIwKzBFZUM5THF2dWgzOGtT?= =?utf-8?B?RDVydTRNdDU0VWFzYisrc0xIcnprd3NJTHpScFNyOFlDTGpwWnJRd0JXaGNS?= =?utf-8?B?cjYySzZHSCtyRWdLMzlGNW1qRFhtU1ZRemI4WVV6SXVra0RWajgzU3JkMFIw?= =?utf-8?B?dHB0UjNrVGhRaHJqT2dabm84Z01GQnBCZUlKRDdrM3UyTitKa01CRW5UZDgv?= =?utf-8?B?bHVXV2VpYXRvdzE1MTFLM1VnOE41TUl4WGROcHZlT05kSUdZUGhTSlpOM2gr?= =?utf-8?B?Y1l4M3h1ZmZaQkwyVDFZUklZOUoxTi9GczFHdWZmdnJDcHcvamhxUU1zVTNP?= =?utf-8?B?NzVxM2RIT0FVRW4za1hQdFRiV0c3RFRGaXQrUE4zb1RucjlVdDhrWXlqVS9z?= =?utf-8?B?UWlHSzJMRFJOUGgzRHRqZHpNQW1ac3c5eEhLL1FDWXBFUXlPZWxsSHBJbVpR?= =?utf-8?B?MG1LWjBjbldCMTIzUXJtTmlkYTVONlA2UHlPYzBleDFLTmEzNlhhaHFNOGdy?= =?utf-8?B?eURPK21BOVhUNy96a1puK05OQWFyVjIrTUtBQjRHeGx2amt2T2JqS1o3eENT?= =?utf-8?B?ZnF1RklpTHM5ZnAzcGdDU28zRWF1Y2czbWY0WDJTVjYwVnpwSnpOQUxORnA2?= =?utf-8?B?bmp1YjJ3UGszS0pNeVVVNmdTY211THQreTBHUU5lbXFZZkNvVkcweGxRdkV3?= =?utf-8?B?YTlhTHgyNlk4MUxHelJMV1ltNFgyaFFyODBsemt2dVF5VXJscHR5WjFsWmRr?= =?utf-8?B?QzNHTjFBREdhQTlwcjhuQlF5YURaL1ZiZE9YelJCZWlaZ1pGWFRlRkNOV29Q?= =?utf-8?B?UDVBYmpXM2pXOEFXNXc1YmpCM0dkUE9MVXp6Rk05bithc3BRK05GMUdKcFZ5?= =?utf-8?B?N3Z5V2VuQStmR3dhM2lxZTdBdnovaCt1dXdDOXFhQ2xTN004TmoreXdzN2xs?= =?utf-8?B?TW0rMzg0anBPSHhQNmk4ZjBubTNtUHc1Y2o0dGx2UmE3NVVwZ1R2S3kreXhQ?= =?utf-8?B?ZWNLS2NJNHkyOHV4UkNXL0ljaEJGUWJ1UlNXQmhJanBjNzJROS9zd0VnZU1Y?= =?utf-8?B?ZlpXZWZvNWNUNUs4N2pjUFd1YSt1eVA3T0FpeDRTYUg2V2NaMng5Y29sM1Vu?= =?utf-8?B?Zi9vNjZwWkljYnZJb0hPdVp1bEFQSzN2NWpuaFBnQW5IbVV4dGFneGJuNEdF?= =?utf-8?B?SGpOLzlmenBQZXhjY1NiSGlyL3RLQk52c2lIUVljU3VLaWVzRGxPU0tiZUl2?= =?utf-8?B?ZGJFM1BSNGthNzF1Vm9mREdYa0I3UENWUGZHRDZBdUdoUmI3YUpuRGxuSTZ0?= =?utf-8?B?NkFQZGVuOE9TL09vdFNYVGYya3RURzFZZnVwU2tGVldCL2FwQytIY3M1ZkRB?= =?utf-8?B?SWFtMjlWK0dlRURzbGpPSU1LaXg4eURLbDBpTmxqSStxYVZienU2MDI3NVNY?= =?utf-8?B?dXkrMWc3cmRSeEQ5OGFYU1ZVRU5scWRlL0hoR1dyeUNrV2NVM0JBZUVMM1Ba?= =?utf-8?B?YlRRU2MxYXoxWTlRL2tyMHgwd2gyOWZHR01Cb25HT2hCTFlUUjhyaDRFWG1E?= =?utf-8?Q?E6veDORx4yWb6pfdkii7w1?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1342;6:nqlszi+G/OCFZn24l4yP0Y7XaxvixZ0xHjjFbgEtUaASVOIcmgqU+WKUhi/yOtHlPtMQm599kKkVtL3n178SVNxSeAoLjnh95VJTb2puLisDyvMi43m+wMoUD+vHHGXlpukTmxWkJafx7yxz3RiV2pYes/3Y3bSzs1pyO2oLFrDBTLZFGwvZMQG+KS3B/6kzsUquouE4loy2OSC+pAnoM/UxOOghHBawRa6zNLLyMErLv1inlpDwOtMTlUkw132DZu4ehenOmxfBwOnUrnraurdg2me3xlSSUJcsnZmDZ/r2xxwAdxq5lXArIU5KElD/S1ObCCa7MfCamTZXvY7gyIahDR7MboVnFsFyLoDtfzQ=;5:jaaElcNToTmYlz5MBR5lnfcsydGzofR5mK/D7mVYfeO/0kQ+N/pwtit/7RFc694iLcQrASIQ7CVzz8xk4EkHH6GRtLPQpX7OtJEP51EYWhjRFXETwsVbfHbA8rjN9HPp5+6oI/QL5CB/n1XLbEVu3/5W4gOFUfY5rs9fHgoS8pA=;24:yfEzRooNmJ4JhwywiIuWVqVpKQs1r/5LbWMXDZS3Y98Cru0rug9bif8Qfv/vKqPd4g+OH1Bl9P083pDQdO7Dtjna3xqJ+twCw/z6NfIiCto=;7:0RQYmSqOrU+vGYaxVepOh7wj4ucDus2X29k3rR5HcF006Uf8VkHxL9fyY/ZrsFkn09PNjj2CctjqSnsCHQvS28zcEl40u9PWuQazZMwvguLttTcDZFh43BFGqkIP9vBoGTLM3n0kB+BXEuGsH1G4UiXeIWl7qww1bsUc0Ir7giHp6oc8zb59GhdO3l1kKXpdi7S0fr7ZGuVcfyvEgIyzTM3v0lrY2wQ+clNUhRaX+5E110aOPe+k5wJGuUCGBuca SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1342;20:TDYBc9d0I+gE14yj9BUuqSaQSAJu2oy9u5hLUxW5wjlZ5D4WZQDfOP34fAOhqnJ7bUugHhX9/hEuGVHBicyPY8xSLSbDADPANg8DYOBXdDfW8V5NskpprnVR3XJbhQqDd7Uc9ejq/if4bW59ivI8RNCR/bGuZjfPIRmZxlR8UWQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Nov 2017 18:28:24.2469 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ff005d68-6b47-4a59-2a66-08d52de8fe1e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1342 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move net_mutex to setup_net() and cleanup_net(), and do not hold it, while sys sublist methods are executed. Signed-off-by: Kirill Tkhai --- net/core/net_namespace.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index f4f4aaa5ce1f..7aec8c1afe50 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -84,11 +84,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; @@ -300,6 +300,7 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns) { /* Must be called with net_mutex held */ const struct pernet_operations *ops, *saved_ops; + bool locked = false; int error = 0; LIST_HEAD(net_exit_list); @@ -311,14 +312,34 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns) spin_lock_init(&net->nsid_lock); list_for_each_entry(ops, &pernet_list, list) { + if (&ops->list == first_subsys) { + BUG_ON(locked); + error = mutex_lock_killable(&net_mutex); + if (error) + goto out_undo; + locked = true; + } + error = ops_init(ops, net); if (error < 0) goto out_undo; } + + if (!locked) { + /* + * This may happen only on early boot, so we don't + * care about possibility to interrupt the locking. + */ + mutex_lock(&net_mutex); + locked = true; + } + rtnl_lock(); list_add_tail_rcu(&net->list, &net_namespace_list); rtnl_unlock(); out: + if (locked) + mutex_unlock(&net_mutex); return error; out_undo: @@ -433,12 +454,7 @@ struct net *copy_net_ns(unsigned long flags, 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: @@ -460,6 +476,7 @@ static void cleanup_net(struct work_struct *work) struct net *net, *tmp; struct list_head net_kill_list; LIST_HEAD(net_exit_list); + bool locked; /* Atomically snapshot the list of namespaces to cleanup */ spin_lock_irq(&cleanup_list_lock); @@ -468,6 +485,7 @@ static void cleanup_net(struct work_struct *work) down_read(&net_sem); mutex_lock(&net_mutex); + locked = true; /* Don't let anyone else find us. */ rtnl_lock(); @@ -500,10 +518,18 @@ static void cleanup_net(struct work_struct *work) synchronize_rcu(); /* Run all of the network namespace exit methods */ - list_for_each_entry_reverse(ops, &pernet_list, list) + list_for_each_entry_reverse(ops, &pernet_list, list) { ops_exit_list(ops, &net_exit_list); - mutex_unlock(&net_mutex); + if (&ops->list == first_subsys) { + BUG_ON(!locked); + mutex_unlock(&net_mutex); + locked = false; + } + } + + if (locked) + mutex_unlock(&net_mutex); /* Free the net generic variables */ list_for_each_entry_reverse(ops, &pernet_list, list)