From patchwork Fri Jan 12 15:28:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kirill Tkhai X-Patchwork-Id: 860004 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="Uvwjjn0f"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zJ68q2lvrz9t3p for ; Sat, 13 Jan 2018 02:28:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933998AbeALP2l (ORCPT ); Fri, 12 Jan 2018 10:28:41 -0500 Received: from mail-eopbgr50103.outbound.protection.outlook.com ([40.107.5.103]:14797 "EHLO EUR03-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933929AbeALP2j (ORCPT ); Fri, 12 Jan 2018 10:28:39 -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=E5J8zVQsVNmPJtE+1FxQKo/aDYoUZ57i4iyQYJD9zUw=; b=Uvwjjn0fVgFQ8zRBdAaRg9p+LmMVa69yqugWMQpwTQ+KfTVPOP6bH8QsJV0hXKzBtP+oMODikHYjwNqxvGw5qOsAEdG9FRSg5fWEKZdOkFMBvxPeup1HeFPa3oNpN7iF/CZn6WdUaEFYlz8TeguQuGaS50gtMsGwsySoL6UcAnk= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Received: from localhost.localdomain (195.214.232.6) by HE1PR0801MB1338.eurprd08.prod.outlook.com (2603:10a6:3:39::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.366.8; Fri, 12 Jan 2018 15:28:34 +0000 Subject: [PATCH] net: Convert atomic_t net::count to refcount_t From: Kirill Tkhai To: netdev@vger.kernel.org Cc: davem@davemloft.net, eric.dumazet@gmail.com, ebiederm@xmission.com, ktkhai@virtuozzo.com Date: Fri, 12 Jan 2018 18:28:31 +0300 Message-ID: <151577086012.22020.9600397187098638726.stgit@localhost.localdomain> User-Agent: StGit/0.18 MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0102CA0068.eurprd01.prod.exchangelabs.com (2603:10a6:7:7d::45) To HE1PR0801MB1338.eurprd08.prod.outlook.com (2603:10a6:3:39::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4d3d4c62-fb67-4f16-e2af-08d559d124e5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020083)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:HE1PR0801MB1338; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1338; 3:3yzSFhhD0chwmMIc3sazEXaSTB7BRrZfKARATiTAlgsHpOptAYWQaEjatZA9nffb7nVfLF+ZE+2Lmw1B0RwaKvqEiZZeR3el+RA3rYK8cuAf8Fhhpc4fxmuK1iAFZYp1CyZaWvVJABjktQRM1CLDKjsOBg3VBcuGybmky706JYQQAEZaeDAnRUAEBm1cuQvXekqdIVW8otC2sxJjuhwZiBZE/YC3hhh27dpMmYSjO8ijmrW8U71mD4TohcIo/0I8; 25:+IO8V83VOaGAlMIUgTjOLxDE9fwf8TbfJDzKSopCDFq2qKvbQVdcqqkdvZkSciR8rpzXyGwLjO0GULFUOI4cBxY1ShLAjqc0U/13SUffD9QoEHtxoEb0roRAZoemCznPRr+mGA3/wHzJrd3AQVzWLlvA++EFwfEXz1lGn/rR6PYobNVci5WyR4UzyVSPDnBsOln9fntUxpqb3LU2Xzsr+ruiEL8Qjs5o7rDfTtAIQmP1cvM3kepZ8djFj1Ww78fH1GpjXpaKLriORT3/8mQBM4RW/RbSgSQFJHAQP3KsYicDCbSBJLleKdACId2usve6kvwf3MiT8CtFUzWOqbc4yg==; 31:sCTT95knW3jXUfJcGjmGNAnOtELNFSNPD1JulSa1nzJl6QJNllUDy2P32zQyvgeLpBHlbOrKh3eRT8SX/ycL8JkbVSIvFzjcaYTaQ+A7m0vv672k+ax/W6ta50/w2mxObtIen/GHlrnI1rJog/CyuOVwP2WFRw/z8CIro8Fm/5lov8Gox98pqsXsu1E10hhQizBJWgyQpbiwp5yc7TmsOT4A4MaynNX/AKF8et4tHiw= X-MS-TrafficTypeDiagnostic: HE1PR0801MB1338: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1338; 20:KnVp076G7sGEhR5W4XExrObvwLnKwlebOTdi/atw/CKXilcdoH/myw6zIV9Ipwz6LhAu95vjyTyCmDFa22K4IosAXkVg/qaJn4oQOEbqjPzIDjSKhJ8ucGheBclqODzeb3IZFU0pDrkO8qtqN2IgCLTwjkyD59HUdEkLPjqLmxC/DSC7AtTvENNRsdmTQFfSyOM9c2syKwafuTs022PBstVRJv4iA4j7KtkA4L5SHOuo3jb2gZoZTWL3gJxJkLmbBSx1OsMN53asL8wPiYiyUZEXnCWOIxzPHlb2peQbG3XzwjrDH2II5C3ncVMvJGpXM4X+wsNhB8FeW7zRkqz70C69IgDeB8qLoIEl+8p7MIu6nv7RDgBXSGV3BbZW49eeLU3QogmFqQ+nzIo4V935ODj+qKlciViuKe30nRBbGbQ=; 4:qVgDJPoG3vqmTIWD0fldPKLmDvmDEfOX9U5GqucSawICB4s60Et5LbpyPGQdkR7y3cCAEeFd54U8Fmrn7KNEuknM8nzBTYJTvMQpD9iTiIk5uhKdR4nZNAdM3ISEUvc525YncZ5KUDoj94qEAr1HYCmcreJo8xPmljz/j4dloCiA7WkWKJ9aeF0bMJh0u/+fLczpfPhrMtEEOm7YNWVgU2GtA5zg3eeUcT2d8Z7zXWTMiSmjWsye28A36SMANJqPQ2l1wW8vcs9NHzZoDN5r669dJnFQumOhoeOuXogIvqb9rikUdXWSdOSOwMkOdMrA X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(85827821059158); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(8121501046)(5005006)(3002001)(3231023)(944501145)(10201501046)(93006095)(93001095)(6041268)(20161123562045)(20161123564045)(20161123560045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0801MB1338; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HE1PR0801MB1338; X-Forefront-PRVS: 0550778858 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(979002)(6069001)(366004)(376002)(396003)(39380400002)(346002)(39850400004)(199004)(189003)(68736007)(55016002)(59450400001)(478600001)(6116002)(8936002)(103116003)(81156014)(16526018)(66066001)(86362001)(81166006)(53936002)(9686003)(8676002)(316002)(58126008)(83506002)(61506002)(50466002)(97736004)(107886003)(25786009)(2486003)(305945005)(39060400002)(230700001)(4326008)(2361001)(105586002)(47776003)(6666003)(52116002)(7736002)(23676004)(2351001)(6506007)(7696005)(106356001)(6916009)(33896004)(2906002)(3846002)(386003)(5660300001)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB1338; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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=3BHE1PR0801MB1338=3B23=3A54?= =?utf-8?q?lsOG85L6/rvEkrpE1gNPda2At7a83irfgiAd1Ed6Dx15Emp3xegrLBPs?= =?utf-8?q?T1x9pMflT8Pqrf4lljBHNvkl6kb3I3XFgFeHbGYADyuqj8f6pnmk6YFO?= =?utf-8?q?7zM0VhD7aQGmD7cSt75mBPt7Z4lt135XbLSBIuNcfqvzcMugHFzlDzRv?= =?utf-8?q?lOuBYZfGWS7Uzpxcc9pDfPyLlII8Qfa5QSrYkwsrgzxUXPb5L3eJXUPO?= =?utf-8?q?4Nfd3ateta2jCBSBo/g4TIzvDnVqF+ijyOopes7RHL7o1orsbJHMwP18?= =?utf-8?q?FQNVRfVlp8FlOaR8B7EN/jTI0jYnnYA3pm17S0FI0lKgwUDpzwzDGO61?= =?utf-8?q?WKZuSXzquP6pitVmWVmY7llIiDKNmDr66GXK/mnTsS0sYm2tgUcyYUmr?= =?utf-8?q?/xGmjKhPiF/45kWK/R3WPlW93/6WE3r8v7NXuGkqgl7MdJkNty+gY2o2?= =?utf-8?q?wYjYCZ6NUM/AFc/8d5dfygcM2YfyghQTrmmE+enV9IOdlVeDCP+7MEAa?= =?utf-8?q?2c0rZ1GwFpQdMY6KIYQc9/dQJnp7KsYiWmHUz97XA5ooL4dDKxoom4qI?= =?utf-8?q?tZXTbJv7+uksqLAiTqE3R5qMEbMxUT5cE9YrLI6rAaGqhtzWJaWqxfeH?= =?utf-8?q?lBRm4X4sGSETyjgG8xjU91nJzSZd6eOhH46hdJxXjqYeQG5fqykYPm83?= =?utf-8?q?xT1qn5pMOC/4STLlpQqMgMhxgqQYOrSrCuAIgRr8jd46nfA6s/JeseoK?= =?utf-8?q?G0zpcOMq6isJktQK6bdzcGcz/sUFug0IuUbREew1qunF1NHq4EHm/3WF?= =?utf-8?q?3vAYpJTmcoG03BaSrNgzoCavhPgaXpy4fypmJsQ9Ee+FLPQerlF7cdmf?= =?utf-8?q?SuwrZLZEGN1EPaQ78vzNzWj2ziQxCGjpXiYbCCHTrMW63CD8GzlzPcUk?= =?utf-8?q?nbixwyEh2R4HEQ1O1Z9zIP725zHWfSgKWoOYNxrYULEMNh+HoS6R2oC4?= =?utf-8?q?ZYVcsnOdTc47tQ4NbvE5+5i1pS/7oP4HmiSqcvE+XKqaVZ91QCBn+UxM?= =?utf-8?q?BooWwHF6Lj2V4uaVpiijmtGhWf61kt17PuZxm4EDJ6BWVNaO4YZnt5II?= =?utf-8?q?lPsQVkBb/YoNa4a7l65ksNOuwrzuZNGzt2ELb5qWBAabNXDOC17XfTXe?= =?utf-8?q?GMoXVJfDvZ9d1eA0JwrhOCwJcsptk95NggufQ0Ua5CnTekEqIxdIWilP?= =?utf-8?q?piRNkbdlTzQcr3r+MSIoI1M567qZ2zOsckGPxS2ulfbstxc88TRnr2VC?= =?utf-8?q?97IBvEyrFX+lugbh0XoSGQmE+Shp0xiUE/M+ynG7Q9D5+MzsXiX7zUxV?= =?utf-8?q?cMrTn5BPyc/8cxyG91jNrAsDdvnHlC8+FoqXhW+CqZZZd/YJZnlrXw?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1338; 6:gLZjFfYU8qpP5718z3IYalGKi+kexZeehTLKejGXpdCRb9PL2/k5Gxr8BokGdVfoDjT3r2ht+LvzNer7hOraLXmbFn2gidZdcnZehC3brjUxUdwgDXInuYeZaS+sVZPrmjIQBW5DKOkhIisJva/0S3w5QcU7wkPWYIA3TjNjBPxsNll/dRMfnbsXpMBylH/OeWE28MDwtODDKodbmvAU0BzbAhvFy00fjPmIXKALQWHVAEa+zyKM1eaQSOj6kP/ndfROSTk818Ax8bcM7n2b2g88BdIqJYUQKW84x9H5yZjso2VdlE93XaiwZsaol/jNT3x/PqZb+Dy8Vu46JYL6PEGy/hTl0UU0J/peLr7JjO0=; 5:9cmOsL/TZCXD3jCZtUXniLvOsx1IlhiwI4WrL33ksOoUuYXMDKPMPIpMIZdLySmnRZvy4Cu5YYKv/vVLaxyjHmh6gN0vgzxhf7uCQN4ThUYkQ8OdwndVJu6lRwV/YgOIV+O0Qcxo+FH3nMiBpEMv4RmHHnLrJm/ioiMc14ZqKPI=; 24:TGMQe43dt87tol6UdfM9znfksV63CWwHh+nPjinhSX23LoxllOBlHAgrmLIequA9RgnX+GLjJtF23IlEaoSPt5mR0FZV+pXvHB2lNUxOz0c=; 7:zYI/AU0671qOcH3GqP8DixmRfl1NemJnaLiINZSKIB8l8JXTw2WopGbfCD0UyurVJ3AY8C/pSFa2ucsdkyP/4tpG1fXovmWmy7Ha2ruRTU6cdR22phWB2+dSTH0aSIm4sxkBoNWVgMxpFfT0fB0Y+wdr+T8IVjZdKkVRWHy+dVzAvpxH9F5GS2Um+f7HxfWF/QuYE2ipcsO4sG1UP5oKv9p/zNmsRIIwpZj8IdJjSEWnorpOWTgdxzzOKVZvNEKa SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1338; 20:RENMD4iH3T2ifOHLFCef8pNvZHiGXx5x/8g4L2lHz3pnF7WNKeVcEAwe6YVF4Ib877YjrR+GTBo/sr6un87MQ6mNVkwoG5LWGsXrhzR0IoTbfgC4LU+4mSiZb6YfBoBN/Oh0NiiyR6zjBaLc/dTXzJL9zeuB+PtBpVyyf2ZUky0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jan 2018 15:28:34.2844 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4d3d4c62-fb67-4f16-e2af-08d559d124e5 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1338 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since net could be obtained from RCU lists, and there is a race with net destruction, the patch converts net::count to refcount_t. This provides sanity checks for the cases of incrementing counter of already dead net, when maybe_get_net() has to used instead of get_net(). Drivers: allyesconfig and allmodconfig are OK. Suggested-by: Eric Dumazet Signed-off-by: Kirill Tkhai Reviewed-by: Eric Dumazet --- include/net/net_namespace.h | 8 ++++---- net/core/net-sysfs.c | 6 +++--- net/core/net_namespace.c | 8 ++++---- net/ipv4/inet_timewait_sock.c | 4 ++-- net/ipv4/tcp_metrics.c | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 10f99dafd5ac..f8a84a2c2341 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -51,7 +51,7 @@ struct net { refcount_t passive; /* To decided when the network * namespace should be freed. */ - atomic_t count; /* To decided when the network + refcount_t count; /* To decided when the network * namespace should be shut down. */ spinlock_t rules_mod_lock; @@ -195,7 +195,7 @@ void __put_net(struct net *net); static inline struct net *get_net(struct net *net) { - atomic_inc(&net->count); + refcount_inc(&net->count); return net; } @@ -206,14 +206,14 @@ static inline struct net *maybe_get_net(struct net *net) * exists. If the reference count is zero this * function fails and returns NULL. */ - if (!atomic_inc_not_zero(&net->count)) + if (!refcount_inc_not_zero(&net->count)) net = NULL; return net; } static inline void put_net(struct net *net) { - if (atomic_dec_and_test(&net->count)) + if (refcount_dec_and_test(&net->count)) __put_net(net); } diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 799b75268291..7bf8b85ade16 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -961,7 +961,7 @@ net_rx_queue_update_kobjects(struct net_device *dev, int old_num, int new_num) while (--i >= new_num) { struct kobject *kobj = &dev->_rx[i].kobj; - if (!atomic_read(&dev_net(dev)->count)) + if (!refcount_read(&dev_net(dev)->count)) kobj->uevent_suppress = 1; if (dev->sysfs_rx_queue_group) sysfs_remove_group(kobj, dev->sysfs_rx_queue_group); @@ -1367,7 +1367,7 @@ netdev_queue_update_kobjects(struct net_device *dev, int old_num, int new_num) while (--i >= new_num) { struct netdev_queue *queue = dev->_tx + i; - if (!atomic_read(&dev_net(dev)->count)) + if (!refcount_read(&dev_net(dev)->count)) queue->kobj.uevent_suppress = 1; #ifdef CONFIG_BQL sysfs_remove_group(&queue->kobj, &dql_group); @@ -1558,7 +1558,7 @@ void netdev_unregister_kobject(struct net_device *ndev) { struct device *dev = &ndev->dev; - if (!atomic_read(&dev_net(ndev)->count)) + if (!refcount_read(&dev_net(ndev)->count)) dev_set_uevent_suppress(dev, 1); kobject_get(&dev->kobj); diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 60a71be75aea..2213d45fcafd 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -35,7 +35,7 @@ LIST_HEAD(net_namespace_list); EXPORT_SYMBOL_GPL(net_namespace_list); struct net init_net = { - .count = ATOMIC_INIT(1), + .count = REFCOUNT_INIT(1), .dev_base_head = LIST_HEAD_INIT(init_net.dev_base_head), }; EXPORT_SYMBOL(init_net); @@ -224,10 +224,10 @@ int peernet2id_alloc(struct net *net, struct net *peer) bool alloc; int id; - if (atomic_read(&net->count) == 0) + if (refcount_read(&net->count) == 0) return NETNSA_NSID_NOT_ASSIGNED; spin_lock_bh(&net->nsid_lock); - alloc = atomic_read(&peer->count) == 0 ? false : true; + alloc = refcount_read(&peer->count) == 0 ? false : true; id = __peernet2id_alloc(net, peer, &alloc); spin_unlock_bh(&net->nsid_lock); if (alloc && id >= 0) @@ -284,7 +284,7 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns) int error = 0; LIST_HEAD(net_exit_list); - atomic_set(&net->count, 1); + refcount_set(&net->count, 1); refcount_set(&net->passive, 1); net->dev_base_seq = 1; net->user_ns = user_ns; diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 277ff69a312d..c3ea4906d237 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c @@ -270,14 +270,14 @@ void inet_twsk_purge(struct inet_hashinfo *hashinfo, int family) continue; tw = inet_twsk(sk); if ((tw->tw_family != family) || - atomic_read(&twsk_net(tw)->count)) + refcount_read(&twsk_net(tw)->count)) continue; if (unlikely(!refcount_inc_not_zero(&tw->tw_refcnt))) continue; if (unlikely((tw->tw_family != family) || - atomic_read(&twsk_net(tw)->count))) { + refcount_read(&twsk_net(tw)->count))) { inet_twsk_put(tw); goto restart; } diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index 759e6bc8327b..03b51cdcc731 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c @@ -892,7 +892,7 @@ static void tcp_metrics_flush_all(struct net *net) pp = &hb->chain; for (tm = deref_locked(*pp); tm; tm = deref_locked(*pp)) { match = net ? net_eq(tm_net(tm), net) : - !atomic_read(&tm_net(tm)->count); + !refcount_read(&tm_net(tm)->count); if (match) { *pp = tm->tcpm_next; kfree_rcu(tm, rcu_head);