From patchwork Tue Feb 13 09:26:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kirill Tkhai X-Patchwork-Id: 872675 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="cWW8JywL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zgccl1J4tz9sNr for ; Tue, 13 Feb 2018 20:27:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934392AbeBMJ07 (ORCPT ); Tue, 13 Feb 2018 04:26:59 -0500 Received: from mail-ve1eur01on0097.outbound.protection.outlook.com ([104.47.1.97]:15996 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933975AbeBMJ0t (ORCPT ); Tue, 13 Feb 2018 04:26:49 -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=yIOo9HpjduRz16CZkMZoaUcKRUpVjxeT2uWplya5UT8=; b=cWW8JywLd9qDDFyzskPeg8zFaQ2oLC8cGmE5+gSkZYOmE5SiDkOmgI8vL5TiAAMqXK/NQ3MOjp7OypAFXr+RkNlCLdkC2hx90VJIn0TIiDp7WwqtjS8OjCygo+9BD3HAJe4/oVZzsAy+hHLYz6+Uyi3737hLE+7zgpB04xwLmFI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Received: from localhost.localdomain (195.214.232.6) by HE1PR0801MB1337.eurprd08.prod.outlook.com (2603:10a6:3:39::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Tue, 13 Feb 2018 09:26:46 +0000 Subject: [PATCH net-next v3 05/32] 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, 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: Tue, 13 Feb 2018 12:26:44 +0300 Message-ID: <151851400426.5034.3718104605840354454.stgit@localhost.localdomain> In-Reply-To: <151851357738.5034.10272265431844825686.stgit@localhost.localdomain> References: <151851357738.5034.10272265431844825686.stgit@localhost.localdomain> User-Agent: StGit/0.18 MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR05CA0151.eurprd05.prod.outlook.com (2603:10a6:7:28::38) To HE1PR0801MB1337.eurprd08.prod.outlook.com (2603:10a6:3:39::27) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c9dc88ab-82fa-4c74-e210-08d572c3e7c7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:HE1PR0801MB1337; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1337; 3:r6f93ia048RjCXcE04rUtsHOMMHRzQHwQGCYcQ7TlehDeJ2wHlZoILi6yK9EW5F9t+IaQk1ETQp5SEW1rY7+nczag07MvUfqNcBmDAE2ZFrgbxNf5c9zeW7b3kIc/0lqZ9C/JJ0pFMUwuT0/M6qF1vaUlKgLDQENPyNE1f9m6JWmZedS63v/JcduNp5ivWw+ZQxmCyMR0aD7S2avrQPtOK7yduxWHQlm1gzy7kiqn0JW/xJxdZhvdZe7iZQP0pmn; 25:XeO6c503odAFCgZP/t8wIWaSxnoiUGnqABcfJfjftRkTQ8y/PbFvCzZjG3qOZAfKWwISzi6HqGyvFsqc1qxSHfBGIMV+7WWTbN/Iv13LzjtexZIrNiGMfuNvcZ7D4eBuEW85dqGp+V+oTrUuHTLTU95gCyi3NYZMlnzA8CTt0KYZVuk96NKNEcRbzMdFvhu2JaLT3spPsNwpsY7ciIeGN28GHVmOH7VickqYiYrYqYVry+6KjdbsA+YmQEPYm+1s59zRWM+4yyy/yeWf9GUWnX816dhfwYMBiRJyh5s+WRhl3c/7wmUfdbZF5Qia66gFoOKBYTTT9oNVMq+jwsqX7w==; 31:jtAHIARS7g1JCzmD/4N+DG5tAYTj2SNn9KxQHu9vI7hD/yqJCuuTnFXQmcFPIPS8HjVTfq0VibBWd5fKObw/hMxybRZHbTlosBbOKyc82ixbiowBuhCldGd4dTqrAjaWOGWh3Ois1yB2kyE3Ew52I85eD9G/P2bFwGRuEv5R4E5F7bK5fyNpf1AG+qNwU91HGn1IAzkjQv7WH7TtBkPOqDZ0dFpt6qm5koj9JkOmukg= X-MS-TrafficTypeDiagnostic: HE1PR0801MB1337: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1337; 20:IuNxGKiemULIeClqn7i49rML/QhUawVwGveETfWMVyLncQjMrMuGoJD06C4eusPkrsBunArmLmK1/4FfR8d+LgPo6houjEblvKmpTSljQeTPFh+oEh8FcxM80KF6j9AVec6x63clD30BfKDGvfSOQSS8/lQwN8NAQgGyCBPYaKcTOHL3y1K7OzHLVUUPTu5wogQNkb0L4RMMS1DbbvrQUUBrxxFRwEYCejPl7MoJ/trg7ybJnd+aCYEx7jw9IQ0TjtAQPaMpV3fDq2tFTE15qr+T1OB5NcrHXDYIeTbb1Xt9PpIA8TbE6KYO+z9pHuVJtOssnh98sJd2gxo+NfF6/A1mtQqCv3MN67wCwlpIkKJGiv9BCAe5ERI+2BLdTZ0CyjTAg0RPQqMjfJMpQxdYWnX/IOIzngCdfbpKUSK8n1iexbiyTlFR3zjf6gH4uwbjTM8cwOTvbp3H/58CZ2FhwL352n+w3jzJGMXR2GyD6VOV+hId1ivq/WUgzopJrf6G; 4:JQxtzkz3hqFIVOgyhjhAiGra4xYZPTqvYOEnyLhtZd1UWe6TzvWCwcNJE6Y01tJyR7MPAIrsuxbsViN5amnakEVT3wpRPuo9krBB+vEyQQ7aNyXS0A5ZpwTZ4G5jcuvF47WDjHmHH/WSPmTxhkVbgGRX1ORWjFQV9jhGN2e5/AOr0VHEwGEuO3hpVMZyC399JFHWaW1wT4DIcliAjP86EDDoS1qL/n5HM08JHVIP6V8QC2si4wC3wm3LOwNu+7g+ht3/vU5blxhu045TOPaBiw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(20161123558120)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(6072148)(201708071742011); SRVR:HE1PR0801MB1337; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0801MB1337; X-Forefront-PRVS: 0582641F53 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(39380400002)(39850400004)(366004)(396003)(376002)(346002)(189003)(199004)(81156014)(83506002)(6116002)(86362001)(50466002)(106356001)(478600001)(3846002)(316002)(6506007)(8936002)(2906002)(68736007)(386003)(59450400001)(58126008)(8676002)(81166006)(76176011)(55236004)(186003)(39060400002)(16526019)(55016002)(52116002)(9686003)(5660300001)(66066001)(7416002)(53936002)(25786009)(230700001)(105586002)(47776003)(2950100002)(305945005)(7696005)(26005)(33896004)(61506002)(97736004)(2486003)(7736002)(103116003)(23676004)(921003)(1121003); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB1337; 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=3BHE1PR0801MB1337=3B23=3AQq?= =?utf-8?q?L7Oguh1dUapAZjb999hIh3wpQ1DMoSsTVFDHjmU6HX187MZrYe9c3/hb?= =?utf-8?q?dDMb2Qr/CZvFGZtofZ5rojazi/+B8R2n4PLuUm/Tx7G9m2xRL4p2CAZS?= =?utf-8?q?7JW0FgRUpaWTPzccOVc4NVffH6wg828fLz/P8Nhu8y6DPjUJ21NZoncn?= =?utf-8?q?qQMfUNAhW+AL4RWUpf4GE9UO9RUfIiqqMfaXYXQK6JOtoeGyXY/1QS5U?= =?utf-8?q?xB/dbZo8PxJz+mArRcMumdHuqbD6pTqIKoYE+Ddmp+Gujg2d2/Db0ncM?= =?utf-8?q?jJ64tWeH1nnFApFohtbI9YjWDL5gMK2Zwkw575tWG3rSUPxhH+/rrnPj?= =?utf-8?q?iC+LPIYtv7HQgXGu+5IKQsvIBECagzMHonsXlNxt9R6+8KKii3HXsUaw?= =?utf-8?q?mkr3jBF2VOtBI+0jDRPJ+bAZrJOghKySAyg16XFnzgtDJtyAg0jLppMv?= =?utf-8?q?05SGJOGZkaUGDNQqzvokiJylZo5wkWULcDNXzS4bJ52+Kt7BG25qmxw5?= =?utf-8?q?R+cSjjxnnkejahIccse+oA6C4vYeZ4UCxflAnyAnX+n+3xi0CGeN0TC+?= =?utf-8?q?wbAfKarsn6RFyTrmwYpfFb+cWQGCEF+MSmZ9p3k3pevzD9LaoJvxEE51?= =?utf-8?q?W6s1/EGtD52d2bZi68zJ7opJVm+2HD4dZYm4vkPImRExjjDKR3np2442?= =?utf-8?q?3yasE5DMswc/VDvTNLSGgO/LGFpfMCJru2UuYbu+sRzC5/9tqGSC3QlH?= =?utf-8?q?sdKyG1bgQlycnks4vh64Wp/XBEptZq0JZQlSgt8CgURbjRTzJS3CpObp?= =?utf-8?q?m/vVvC4AA1vJtOyWRoyATKK1Pvww0WKcjtNEzn3ACFOIrAiE8QhZava6?= =?utf-8?q?2V+tW8TKihDOZroXdsdLlJDgotjYSEubT3yTGteK2TvTJWoXtVnl14JA?= =?utf-8?q?buiD8x+5c/qmn0kGZojjbQs40rWVK+yt2Iz6FrhQUyxso9ZY/fwB3tao?= =?utf-8?q?k4wLUUoKei2AYeaCsauZNI3SxmnBaq1QARVy4j+2wwkXfakzEuzhbhyA?= =?utf-8?q?+4NIp34ksMD9pdE6U0fclEOFt4hRMoeRO+xwszBhXWEFA4vPxZ6IX3qm?= =?utf-8?q?tKutQNf9srVlezTCCmQNosBGYI+20K+FVftilaTZDeIPntauOYY41qwR?= =?utf-8?q?yNrkvSXnrlKR1Cr9wchsUbojKHpDmCWlc7G/Vtc6bHT65XnyLe3HNLCO?= =?utf-8?q?0jvGdmQBWzaMwTMnTsNKc9PNNZS3IJe4Q6GoQXg/162KGzfyNeMlaGC5?= =?utf-8?q?9Ql17QG+mxD/EvHkogTM6A1zsL20uyLiJNWXI4DRfd5d/f?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1337; 6:QGwd2OMLqIn3DWzE8+LdRmrbJr8BQHP5klB4fMzPlHHODRGYKzG2epADhOMaAJalyiC8UPE5lN0rVkopcbjWBx57FQC7YxUZn4CUsApafnsw2ocvhlK3+aq/GqoZm6aDBkLgY+4s7S+AFOLIE9lwzhB5MmtkKAr1mDt4tYOMtRGqY9VWX2oyFtWEtVexmvTFuuYQ9sMq1HpToeBeQvPlUM0KmNJg1DPXjAY9OWyArge5HPjjX803wQN0UAxl8SxXtNX//z+4cFQJyEXzfDt+0ogCDDNAx+2/sXDzjEncRTnQV/O7OWyGbyQXuabsbSpQXOB/QWAtvjvPWAXLNGCnZ/fbXLze3l5ppKqRBz8XFKs=; 5:KScrOe9pr5C/d/4YRsBryzvjTDI0EMFMjrYOmmNPZ0n9jHgTSG6mlHz2zrjwzWOj3h1IDVuj+HHs76wz5ja/j+8EgkIt39HK9h8MYJbANNfcDnQPwbRNaGxjlb/wDNYXV7VEkRDSQib9V+6gz1OUsKms07RMd+4Jk47TWN7EftA=; 24:2L2xYVKdxkMEHcvksj/C5dcdnXefYgfzYpnRCsCsRbCA+fwtS0mvk7Lrrvwb4T8+JCYNBoFdbrPG15BEjmlNyIBEzt9gH8f++CvqQSy4x2I=; 7:uRFDmSt5tqgTcj3YWpna4NSIgdNsrajEtlQmQdOGpoBdiBulnzW8VmuCICitz+N58E9TAJFPWG04TL6YlDg8UgoOSe7WUXSfPP2XHQCSeQffsh46B7O5J/iUl++gMxUQVxYq4mRZeejHWXu29v4xK0kugdoJj1gaYOlg4Tcb2yTj3JMWFyI4cXwDnk7KBThAUvDouNpZdhfLU1PuGF/5TfryKpiA5FgSl4L08XRj6o2rW+SrEQayWJXm+OVhqoCq SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1337; 20:JMoaY25OvzooucMSc6CZYKRE7Kw0r+T35xMm+hujrh0r1XB4pce6QAhIkAlF7b3xd88KupUKzz3Z2NgyudqqWm8D2y90E9ToeTS0G0wyDWMwOyEI5bcG8mZbdNKNGaYgD9XeN/9/N4AHH8movUVlLg7zUOgSUmKDNKCA2e+3oXE= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Feb 2018 09:26:46.7806 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c9dc88ab-82fa-4c74-e210-08d572c3e7c7 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1337 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. v3: Add comment near net_mutex. Suggested-by: Eric W. Biederman Signed-off-by: Kirill Tkhai Acked-by: Andrei Vagin --- include/net/net_namespace.h | 6 ++++++ net/core/net_namespace.c | 30 ++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index f306b2aa15a4..9158ec1ad06f 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -313,6 +313,12 @@ struct pernet_operations { void (*exit_batch)(struct list_head *net_exit_list); unsigned int *id; size_t size; + /* + * Indicates above methods are allowed 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 f8453c438798..2a01ff32d9c7 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -29,6 +29,7 @@ static LIST_HEAD(pernet_list); static struct list_head *first_device = &pernet_list; +/* Used only if there are !async pernet_operations registered */ DEFINE_MUTEX(net_mutex); LIST_HEAD(net_namespace_list); @@ -41,8 +42,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 +72,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; @@ -426,11 +427,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) { @@ -487,7 +491,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(); @@ -522,7 +527,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) @@ -994,6 +1000,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; @@ -1001,7 +1010,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)