From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752670AbdKTSdJ (ORCPT ); Mon, 20 Nov 2017 13:33:09 -0500 Received: from mail-ve1eur01on0135.outbound.protection.outlook.com ([104.47.1.135]:45121 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751936AbdKTSdG (ORCPT ); Mon, 20 Nov 2017 13:33:06 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: [PATCH v2 05/31] net: Allow pernet_operations to be executed in parallel 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: Mon, 20 Nov 2017 21:32:55 +0300 Message-ID: <151120277590.3159.12461615068657469111.stgit@localhost.localdomain> In-Reply-To: <151120175301.3159.9577108443167812854.stgit@localhost.localdomain> References: <151120175301.3159.9577108443167812854.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: HE1PR0501CA0003.eurprd05.prod.outlook.com (2603:10a6:3:1a::13) To VI1PR0801MB1344.eurprd08.prod.outlook.com (2603:10a6:800:3b::8) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: efd54e00-d42d-41ed-f8a1-08d5304520e0 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(2017052603258);SRVR:VI1PR0801MB1344; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1344;3:uBnNDQFi3TbUbfykd/wMGM1etekGyFE4SP4RCPTbjthJbZBQbgxYpcWal2l9Jhl/AL2nuVPC6lqrUlka/W1hhHPyZKbSyVMlJpAat//w8dtwCeTpjsjifa1ydc47q8JZgBN7eD1NFiEzRa/ZtHj2F4iSIUUn1xS+lXnav4eJIUK7guPtZXBWi+585ua2ZC5RfmMFva0lWBiW28NWyDqveyXUw06sKOwZyGxG4WjVWPoSvAtW3QM8VRY9t74Eu4ac;25:EvsoALi8FHPIOtFOKTCUL5QOQkmsLHX51FlaBQovBqppQoa+HyYGYGe6uumkg/4Cy1tk2Rxoldr0itJ8AcKsvv5Pud0fOaEUI6avA1MwqogKEXwlmRfRg4+QDWL0HxVeEd7bYMGqizIdFoPIg/BlQWOqwlNoSMqSqllz1j04IyxzSJns/HfNogEPQz4WRh+OUzXOn9Z2+devOUeSWTVWr6lBROd0t8bgC374+ScpFPAIrI/hsJkShv6nEFVbU6eXWoixcH0//rgkpDKi6jNui4ik3SG6lGjIk3qENWueUa8SIIfZSthQ7CJxKke8iHvagDudecOmf4T8phPPkODUWA==;31:geGVsqF5gIrWTstTkZYCrpJ9d6ZXz93C2u3jRJA4dbg5owNzd6U76cX+urLwKgIx3vwqzvSmD1B1oy8W9JxmGBk0vmeIIDfzXUZDzv8/UxfBwhHgdn3MP3WBa56NOESxNhBzP9n2lF/IrzCvw8xrTp5tVX0vJLV1+TCFWKh8sfPOmt3CeoseaPiYCQjvupPpO9STwJYYu6NLYWIIKPf3cxDXsf9x7A4n0ZQByIxaEto= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1344: X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1344;20:md+Iphr940dp6IsZ778t6TrfPAd3OqWchRi8CNv4j2P5hg6mgXZ0LAFydMka+/GHqS8caBmFRcKYz/gmNBMjXYIrWAtsIPDz+vhkt6impt7CezPYjodzNCKmQH3IITVQti//u8vrcEONESyDBCEqgvGgOwpyC9A5+HgvoTDKYGZ7USaeIUl5uOt+XmJSFxWAEA7HFLFzd7pJvEz5lcuqudXTF+gBMi0B9GJUXpltRihnLwB/appbhnDvTT6YD2pfSaN8UchMY1n0Xi9gwBVBhLPovR+hjOMv1TRDrS6qrce5NEeb4WYiTAkUEfb1hGVLPr0qJIgwzilRAkWIA687UaZYfUJA8H3e3L8czutwK5TcFlVmXNQpQYLPavCmITUyRe4ZwhBCCgVVyyw5KQ7RqJgE8PUJkZiJY+32KIRyNxI=;4:+8HzCRupcN4+0iZux4/5BvmRtezAg5KHJxQqmuEq2GMQRfDPZRZy+qStW/E1YX9MxE2g/zmbQ2kJAhljM1D1sLzVCZbrfZDy58O0Fa4mY5JSIiu2s4VrQkgzfz2h/jGHTH8qdMbDGtjaupSoWkdLm1y+vKK53m+8ibucjLK4e8N6T6cg4X7R/2xc0BBsa+a3ADZLtFau0cXIgFWgtg60dYa4x2UHA3JDAfCH/5tNLh+FdcLh7DOST+JDpp0b+xIrmE4Td7FBvmp9+GCID7pQ5Q== 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)(93006095)(93001095)(10201501046)(3231022)(3002001)(100000703101)(100105400095)(6041248)(20161123564025)(20161123558100)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:VI1PR0801MB1344;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:VI1PR0801MB1344; X-Forefront-PRVS: 04976078F0 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(6069001)(346002)(376002)(189002)(199003)(83506002)(86362001)(105586002)(106356001)(66066001)(316002)(58126008)(103116003)(23676003)(97736004)(33646002)(2906002)(68736007)(55016002)(189998001)(55236003)(6506006)(81166006)(81156014)(8676002)(6666003)(39060400002)(50986999)(76176999)(54356999)(305945005)(7736002)(5660300001)(7416002)(101416001)(8936002)(61506002)(16526018)(3846002)(50466002)(6116002)(9686003)(53936002)(478600001)(25786009)(2950100002)(230700001)(47776003)(921003)(1121003);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1344;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA4MDFNQjEzNDQ7MjM6aHNpMk5GWE9waGQxOTZ5UHlnVzVXVXFk?= =?utf-8?B?MUV5WHV2c2g4dTJwbG4xbm41Z1BMUFgreGIwK2RwdkFFT081WTNML0VKLzVv?= =?utf-8?B?bUU4WlczQ2J2QWtlK2xkcGpQZU9RN0hVRHNjRUNXTXdFMkJKQXJnUEM1TGlE?= =?utf-8?B?aTlrMGZSdjlwY1N6N0l2ejdPWHp4Tkh5eEhyeG5jZE9MNDl1SGJlVDdjSCtP?= =?utf-8?B?Z3l3a0I3eko0WmtpL3hmc3NBNXA2bVNTWmRYWng2NGtZOGxyTVhieXMveXBx?= =?utf-8?B?bUFXdThrMUdHb3ppTk1YcGIza0VZYzFSRkdRemY4dVVMa3RXM3ZNc1l3dWQv?= =?utf-8?B?UVpjSDk4RE1ZNmYzMHk3SzZyUUY0NVZWUEZ0blJpWjloeCtBTy9hd1RqRldh?= =?utf-8?B?ajhoOFdOZE45c3RnMlJzOFF2TG1qMGVFZ2hDOEwwbnFhWjgzQlAyVTBGUzVK?= =?utf-8?B?TlFMS0ZSV2Y5dllVTU1IcUlkelZ2eGNqZnVsZG9MSUpmZHVFZmNnRlNneDV1?= =?utf-8?B?YUZzV1ZRakpVZWIyTHBjV3dFdTFTZjlHM3hoSnQyampib0IwWjAvdmxBMjVQ?= =?utf-8?B?MXY0ME9BNkVxNTBnRk1aM3o0Ui9HYStVUWl5NDA4YU9WU1NMN2kzRXllSEts?= =?utf-8?B?djZ6K05UVVFmUm92K2FpRFY4K2Y1WTVZM3JLTzhscTJBVXFxa0ZMSVR5Zzdz?= =?utf-8?B?TG1wODY1WGtad3IzZm5EdFF5M3FVSUR3OTVLWHRUcXhRUWRZMUZRWUtjRzV6?= =?utf-8?B?ZjdMVkRjWE1zL0xScTlFRk1xZnNBWThyTU9RbzlEMUhZWVBMeDRJa1c2SkRS?= =?utf-8?B?cE0rTTYwaS8zNzAwYThtUG10OFdFakt2Mm9ORTNlNFpZUTFGWjRLVGN0aEc0?= =?utf-8?B?QklGVEx4UHVPeDBMNmhmOGJEc21tRHV6aExrZHhSKytwNEJCOGdDV3BDYXdG?= =?utf-8?B?VFN1STQ0SnFKNGtPVHhvMlFlTVVCeEtBU3l1Rkxub1lLQkxHc3AzTHdQUDV3?= =?utf-8?B?ak1Rdk8zUW1ua2NSUitja0xpbVFyRmtQdU1YOWFuS3pBOTd6SFE3bVp1Z1RZ?= =?utf-8?B?NXVHRUhXNVJVTmp5R2dhTW5iVHlGYmlSM2lKM2g2SXBtTWVWREtIcHk2TlIr?= =?utf-8?B?RlhOM2duS3pQbVE1VjJsUC9NVm5SMnRmbkErUHpuc05EL3MyQjVMSHZLdG1w?= =?utf-8?B?Ti9FUGROQTVJM2pxcGNEMmVxeDNRWnFEMDVONGVPVWJBN1BwOWhITWJRNkkz?= =?utf-8?B?bmthTUdjcVhHY1d6LzIyZGZNZWwrRVFIT0UySmo3SGFZQlVuaFVta0VEb0tu?= =?utf-8?B?ckVueTE4Y3hEdDYvN08xd0VxQ0xySGZlY1kvRmd3YWdJeUdselpiSCtKcGUw?= =?utf-8?B?bWNmOXErTVdIMDcrdzB3L0xEa3g0SWVEaldUZEF1WkpMRDN6TFdyQTF4UnU2?= =?utf-8?B?Mm54ZEN3RkliZWh2TEdGS01sK3BrRWtwUTVyemZpcHpHckpwT29PNjgvYS9Y?= =?utf-8?B?cnFyc0FNdS90VmVZZ2M0MDJhNFI0WklhQ3E2TkdKQUZFdVhmKzRWV2ZudVUy?= =?utf-8?B?dkV2ZlIycGRyc1FYQ2kyQ2sweEV0clQxcUgzVkFtZ3dUbWxqcWJhM0QyaTVZ?= =?utf-8?Q?c=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1344;6:t4W+/A43H9+oS8XQ80IjyLGLdv1HqHDzpdMkCaTqGV2JDEsXkllCE1/qEv0T5Mzbn+Atqjr7DWPATh/OgZjZnLVZie22JzeCgkC7+l+lIk0tMzr4KUAt2CUKMzGwWFz4IPF1+/KKNc0nSm3t1nmmnTjOpOvNTnMpRV8GGPYDDA2Za+1I6SvEKFLAXBMeW2XbakoK5dV6j3rpiq3aYT6iT2dpWgjmx/TgNjwnz1jJu2zkU59RpwSibAMl9XH+0OKsCvzcxRY3U6TBP0AmZzkYSVopcyClPABeTstRlpP2u1xKqNQdWyLEjhRnB4ELAa1HO0AOoYTGOmuVpD7kIycEBt0elxmtYickTxDlVBzaTb8=;5:Qg0u7XpHnDX5+F66EPph9biV/9io5tNRaF9YV3Hoie/WWB/9AeVm9XBlZbvmlo0TxkJUJEQbigQn6A1xtyFUn4IQIeX1NfSnmpn8vMZ4M5l4pgJv/BH2905AplnzFWncQCV8QLuPLOwQhxXZ1zNYZrRiGEi17rGiDyg60V3uQr8=;24:siT6PhCpc+Ul6Zj7dHBvgucJQqre5KXTl9pp6ZLYoOnXRltMAsF/UVccoHLOcxyn0N5gDzZ7K43x9EUUEIAHQpfsJ/jhqyVWmJKAS3M3o/8=;7:1D2Nw1feoH9aBN9dKBqIqFso2mrUrBdzbv2XIaCQ5U9WibAqKLoD/6c4UBH9zRAZJOyr31o1EaQVQW0ulMCDjjRkvvwKus21UFUaE2yvcR5U5H6tIQ9xot5ppI87ISrffsRHCFAglVZ0pXdOClVQ583oN70avRrRM7uQFILOaxEJ0XNn3MQeKwwApgS8N2px9RWKLS7hxUJhdHSBhecHcit5e/+GvowOPO+b4YOhWkgpZc+AVtVs1kSytMQJxvKn SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1344;20:GnGUv0FygC7FKhITwHJWOh0Cb0NJzyClCbQEX6n/dcNjbXMIZ/Yr3wvdjG4+yntFBrMy/Ol7nV97++mWjhBYgMIe2uHMh8LAFMYW+TyyzC6bfc/8EVs5xdGXUBk7UV2PTzLFu2XHWy/Vl7nUSNaRkk+2DUEVh5UHFWoHOMMOeMQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2017 18:32:58.6690 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: efd54e00-d42d-41ed-f8a1-08d5304520e0 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1344 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds new pernet_operations::async flag to indicate operations, which ->init(), ->exit() and ->exit_batch() methods are allowed to be executed in parallel with the methods of any other pernet_operations. When there are only asynchronous pernet_operations in the system, net_mutex won't be taken for a net construction and destruction. Also, remove BUG_ON(mutex_is_locked()) from net_assign_generic() without replacing with the equivalent net_sem check, as there is one more lockdep assert below. Suggested-by: Eric W. Biederman Signed-off-by: Kirill Tkhai --- include/net/net_namespace.h | 6 ++++++ net/core/net_namespace.c | 29 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 10f99dafd5ac..db978c4755f7 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -303,6 +303,12 @@ struct pernet_operations { void (*exit_batch)(struct list_head *net_exit_list); unsigned int *id; size_t size; + /* + * Indicates above methods are allowe to be executed in parallel + * with methods of any other pernet_operations, i.e. they are not + * need synchronization via net_mutex. + */ + bool async; }; /* diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index c4f7452906bb..550c766f73aa 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -41,8 +41,9 @@ struct net init_net = { EXPORT_SYMBOL(init_net); static bool init_net_initialized; +static unsigned nr_sync_pernet_ops; /* - * net_sem: protects: pernet_list, net_generic_ids, + * net_sem: protects: pernet_list, net_generic_ids, nr_sync_pernet_ops, * init_net_initialized and first_device pointer. */ DECLARE_RWSEM(net_sem); @@ -70,11 +71,10 @@ 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(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; @@ -419,11 +419,14 @@ 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; + if (nr_sync_pernet_ops) { + rv = mutex_lock_killable(&net_mutex); + if (rv < 0) + goto up_read; + } rv = setup_net(net, user_ns); - mutex_unlock(&net_mutex); + if (nr_sync_pernet_ops) + mutex_unlock(&net_mutex); up_read: up_read(&net_sem); if (rv < 0) { @@ -453,7 +456,8 @@ static void cleanup_net(struct work_struct *work) spin_unlock_irq(&cleanup_list_lock); down_read(&net_sem); - mutex_lock(&net_mutex); + if (nr_sync_pernet_ops) + mutex_lock(&net_mutex); /* Don't let anyone else find us. */ rtnl_lock(); @@ -489,7 +493,8 @@ static void cleanup_net(struct work_struct *work) list_for_each_entry_reverse(ops, &pernet_list, list) ops_exit_list(ops, &net_exit_list); - mutex_unlock(&net_mutex); + if (nr_sync_pernet_ops) + mutex_unlock(&net_mutex); /* Free the net generic variables */ list_for_each_entry_reverse(ops, &pernet_list, list) @@ -961,6 +966,9 @@ static int register_pernet_operations(struct list_head *list, rcu_barrier(); if (ops->id) ida_remove(&net_generic_ids, *ops->id); + } else if (!ops->async) { + pr_info_once("Pernet operations %ps are sync.\n", ops); + nr_sync_pernet_ops++; } return error; @@ -968,7 +976,8 @@ static int register_pernet_operations(struct list_head *list, static void unregister_pernet_operations(struct pernet_operations *ops) { - + if (!ops->async) + BUG_ON(nr_sync_pernet_ops-- == 0); __unregister_pernet_operations(ops); rcu_barrier(); if (ops->id)