From patchwork Mon Nov 20 18:32:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kirill Tkhai X-Patchwork-Id: 839709 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="PfqZd83P"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ygd096h9Dz9s71 for ; Tue, 21 Nov 2017 05:43:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752646AbdKTSdJ (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 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=Rr/ojAd5Cn77k2jxoQ/VN96oHXk/GQVTeHUXnjkr+ks=; b=PfqZd83P2WWPaN2DGmHcSKcx9IlMPtoRBi/lI9UrdzZqqcYA+c1waKxA3/fIuHlPCqP8n9ifEauQbArcLaHL+wSfbx9wptFPZpvwk8zpHBclF6dHhnnUfzkuXaKADCAd2cCh8zgaHRVR9z2PCu1qfjFmSzrxSqOm13VqO8TorkU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Received: from localhost.localdomain (195.214.232.6) by VI1PR0801MB1344.eurprd08.prod.outlook.com (2603:10a6:800:3b::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.239.5; Mon, 20 Nov 2017 18:32:58 +0000 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 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; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BVI1PR0801MB1344=3B23=3Ahs?= =?utf-8?q?i2NFXOphd196yPygW5WUqd1EyXuvsh8u2pln1nn5gPLPX+xb0+dpvAEO?= =?utf-8?q?O5Y3L/EJ/5omE8ZW3CbvAke+ldpjPeOQ7HUDscECWMwE2BJArgPC5LiD?= =?utf-8?q?i9k0fRv9pcSz7Ivz7OXzxNHyxHrxncdOL49uHbeT7cH+OgywkB7zJ4Zk?= =?utf-8?q?i/xfssA5p6mSSZdXZx64kY8lrMXbys/ypqmAWu8k1GGoziNMXpb3kEYc?= =?utf-8?q?1RFGQzf8uULktW3vMsYwud/QZcH98DMY6f30y7K6rQF45VVPFtnRiZ9h?= =?utf-8?q?x+AO/awTjFWaj8h8WNdN9stg2Rs8QvLmj0eEghC8L0nqaZ83BP2U0FS5?= =?utf-8?q?JNQLKFRWf9vYUMMHqIdzVvxcjfuldoLIJfduEfcgFSgx5uaFsWVQjJUe?= =?utf-8?q?b2LpcWwEu1Sf9G3xhJt2jjboB0Z0/vlA25P1v40OA6Eq50gFMZ3z4R/G?= =?utf-8?q?a+UQiy408aOVSSL7i3EyeHKlv6z+NTUQfRov+aiDV8+f5Y5Y3rKO8lq2?= =?utf-8?q?AUqqkFLITyg7sLmp865XkZwr3fnDtQy3qUIDw95KXtTqxQQdY1FQYKcG?= =?utf-8?q?5zf7LVDcXMs/LRq9EFMqfsAY8rMOQo9D1HYYPLx4IkW6JDRpM+M60i/3?= =?utf-8?q?700a8mPmt8WEjKv2oNE3e4ZYQ1FZ4KTcthG4BIFTLxPuOx0L6hf8bDsm?= =?utf-8?q?mDuzhLkdxR++p4BB8gCWpCawFTSuI44JqJ4kOTxo2QeMUBxKASyuFLno?= =?utf-8?q?YKBLGsp3LwPP5wjMQvO3QmnkcRR+ckLimQrFkPuMX9anKzA97zHQ7mZu?= =?utf-8?q?gTY5uGEHW5RUNjyGgaMnbTyFbiR3iJ3h6IpmMeVDKHpy6NR+FXN3gnKz?= =?utf-8?q?PmQ5V2lP/MVnR2tfnA+PznsND/s2B5LHvKtmpN/EPdNA5I3jqpcD2eqx?= =?utf-8?q?3QZqD05N4eOUbA7Pp9hHMbQ6I3nkaMGcqXGcWz/22dfMel+EQHOE2Jj7?= =?utf-8?q?HaYBUnhUmkEDoKnrEny18cxDt6/7O1wEqCLrHfecY/FgwagIyGlzZbH+?= =?utf-8?q?Jpe0mcf9q+MWH07+w0w/LDkx4IeDjWTdAuZJLD3zLWrA1xRu62nxdCwF?= =?utf-8?q?IbehvLGFKMl+pkEkpQ5rzfipzGrJpOoO68/a/XrqrsAMu/tVeYgc402a?= =?utf-8?q?4R4ZIaCq6NGJAFEuXf+4VWfnuU2vEvfR2pdrsQXCi2Ck0xEtrT1qH3VA?= =?utf-8?q?mgwTmljqba3D2i5Yc=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: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@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)