From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934848AbeAKPxR (ORCPT + 1 other); Thu, 11 Jan 2018 10:53:17 -0500 Received: from mail-eopbgr00136.outbound.protection.outlook.com ([40.107.0.136]:16743 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934483AbeAKPxM (ORCPT ); Thu, 11 Jan 2018 10:53:12 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: [PATCH 4/4] tty: Use RCU read lock to iterate tasks in __do_SAK() From: Kirill Tkhai To: linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, jslaby@suse.com, viro@zeniv.linux.org.uk, keescook@chromium.org, serge@hallyn.com, james.l.morris@oracle.com, luto@kernel.org, john.johansen@canonical.com, oleg@redhat.com, mingo@kernel.org, akpm@linux-foundation.org, mhocko@suse.com, peterz@infradead.org, ktkhai@virtuozzo.com Date: Thu, 11 Jan 2018 18:50:33 +0300 Message-ID: <151568583381.6090.14102384047887581598.stgit@localhost.localdomain> In-Reply-To: <151568564127.6090.3546718160925256054.stgit@localhost.localdomain> References: <151568564127.6090.3546718160925256054.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: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To HE1PR0801MB1337.eurprd08.prod.outlook.com (2603:10a6:3:39::27) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fe180e1d-7f38-49f1-9055-08d5590b0f94 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:HE1PR0801MB1337; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;3:DE7y+Sdn1BwzZQ2LeuiA8y4TRStDEi3x124aHZTW/e7+DZDtiAcEy1pF7Dg5bctL2k3SnGZLNU0VvUFWa48DLBWn7OG3bnYYbpJ+Ui953TsQJLlz6+aLjD59tcxkcAPtYzhpkTAZJbA6lZxkuXFrwSj4JXRll01QBs41/hOBi++p7R+jt3mKNelHSG2mnPrZtZzqx9ftER6jwOqVRZ6R/CjiimcIf2BRkNrcy3Uw+o1y0omoGdLU+eCGdfCFzTlx;25:zgRFs8RhrifPVf18sEvbehDCrrnJO3lHWBadx9fzMtkBv8MWXffTl05P0lVpEu5i0Ju9f+8Cx3TkyhxEC4WmA4qAXmOcWcPlxJhoDXhnn8acGyC3pg0rwk5kSD2ZLvwt54oFf+i38v9uQGcBBTz1rkSuMNtMgthA1T07laKmCRmexfPYljoikSdfR1Z3n6K0cM3FkSXH7ys2lA9OwXCi/dRoAGVsYFp2I/x5F+owremOvYnNc9i6EdWi5n+xoFnuhGzD2H24SFIFTvJl0gwDARmSpbidAetn9naXXfHeeZLV4KFnZqt5K7r8FDPRX+Z0+hnvRx9Vtd2pQzfNxX3MRA==;31:0M0XvKZiNcFPSUthbcpn4ZRzEYmW9KgMCSvu6znE4Vhk99wMMrmf4rfMRPCaUt77dsGoBs/BaMPTfp1DBlvkkW12d9xqNCNtZ10h6NgsKDOKSH2A6YzPg/ei64R8Q1GNGdVEN/1y2XfZqs/rjZ0wdXEVdCQCJ91DRcv6x1YDM7qOnr3HCEl2cWqyZLWk4+SGKABSKbXcEtZ65W2dVvHQpE1BldPGDbZdIbMnQnctTKs= X-MS-TrafficTypeDiagnostic: HE1PR0801MB1337: X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;20:zmmMn6bJVlj9xoaYqetYN3zWedwbOH4NKFKz5yvjmHv1KSFCoILJThJ4X7B6jl2P29h6scfX/fF0d+BNyXvy0bqki2S+VchkpgnTzP0MkjQSwaqK9U3MzAnBOMzq1NSRJ1YutyjGUi2L6IGtvVNStCwoxxAM729fMiX7HIhnR5PDqzJQF5UNUtGDBERUVCruVpKJuTFINIVxakDCLp7fTZkcXgYt+QS9IRngQX3kEH7GluvTJeZRwjmduqZdO1c+Um44n5IydeB/ukmAOuMKTF7DgfaAv+PCCKmNyPVzoz1Q2stULpK2dfT1RXt36seHiCjGq/yTn6kj47VvbqS8cvYEKGIYZmKpAITjo04LDsbjcZM+XX3ilNmpSrJ3mjF338AspVyz8cf4uSJPlglyXQPwoXyL/1PflHTOqrbqbCY=;4:oGFB92+S4U7VCCu8mu/kTYBP2zAIpaOcdBV1N4QOXIWp4c3DqZoBFtjpPjOyT/i/E5r/Ipa7HEMbnqRoiwb3+7Ngg1/rhAPBCxtU2Bhn3X1a4+CHh/rPlkENiySRCnslUnfTaAsquFWWGiy7K1Js9cH70+OOrfu3DWiR8N/6Pj5MOCALxXBZr1EvJttqLYQFkV93bzVyRF6PJrKKiAwba0n8SPTykr3xGp11SvfQ5irt8JTZcGx1uCmIg6G7FmR+MBrAGIugqKgenMFOqYE+MA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(8121501046)(5005006)(3002001)(3231023)(944501075)(93006095)(93001095)(10201501046)(6041268)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123564045)(6072148)(201708071742011);SRVR:HE1PR0801MB1337;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:HE1PR0801MB1337; X-Forefront-PRVS: 0549E6FD50 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6069001)(376002)(346002)(366004)(39380400002)(396003)(39850400004)(199004)(189003)(59450400001)(58126008)(86362001)(50466002)(2906002)(5660300001)(478600001)(386003)(6116002)(103116003)(76176011)(16526018)(316002)(6506007)(230700001)(7416002)(83506002)(3846002)(33896004)(55236004)(52116002)(55016002)(66066001)(53936002)(7696005)(9686003)(105586002)(8936002)(106356001)(305945005)(68736007)(6666003)(61506002)(2486003)(47776003)(81156014)(81166006)(8676002)(23676004)(25786009)(2950100002)(7736002)(97736004)(921003)(1121003);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1337;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtIRTFQUjA4MDFNQjEzMzc7MjM6cnJvV2ZQQTg0MktUMlRSOTZrSmxtdmNE?= =?utf-8?B?eEJiMC9FTkQxeXlTYkNxMURhWFdGVmVkSTRReDdIaTRVK1l6U09KeDFESGp3?= =?utf-8?B?RXczV0xWWjNaUnFPN0ovM1FVREVseHYwbXhqeTFxTkU3L0p6aXRYSTMzU0dq?= =?utf-8?B?cWRIbFFlTTdaK05TU0UrNTdwQytmY0plZCtqUHRPV0JGTVhXMHNqODNRMkhW?= =?utf-8?B?ZklVRmp0dlV2cTFaTHZJTWQyTjRCZVJZbzlRZXhZaFk3cWRZQVo4azJnMXFp?= =?utf-8?B?MzBxTW5JeG9NMDFYMm9GcVdFWTdBM3R6dFBRbEJOODY1NlpDS1VDVzFaREda?= =?utf-8?B?ck9FMEQwS2NDaW1zVXNGdWREMDRLcGtnWmZBNnJUNDVCa2krN0s0Z0dyVWt6?= =?utf-8?B?aS9IWXUyNjVuSzViazRCWStQNmhuVTJxYmZMWkQvdUxlUnJOZXJwVjRwd0FU?= =?utf-8?B?d2Y5RkhJbW5EMmFsNENHdStJdTVEWTNMUWcyWHlJTkJyTVl1ZENLeGxMYVlD?= =?utf-8?B?TjF5RFhMcitNMldpdjh0MXhGOTR1Y0hnZlNFakJYRXFzaklENy9IOGtIQzFI?= =?utf-8?B?eEdBWW9xQ3dKTE5aTDJXNUgrcmlVTS9sT25aZHJtSW9XanQwVFlYejFVWkdy?= =?utf-8?B?ZWpjcVA1emxPNzgxRGM5Y3lQaGdPUXY3WWEwZTNUZWJZeUxHSTdDZVZJUENa?= =?utf-8?B?NVdSYlRySkdIejN6dlA3aUFjeTlZS1lxSHprSWdlbXQ0TVhSYkdrV1A3a1p3?= =?utf-8?B?eUs1UTVCVDgwVDh4RXdMWkdSa3Q4R3ZNdDBDRnFKVWpMSGJQdDcwbEtkS09z?= =?utf-8?B?ZlY3L2d1UitrZldUMm5tamg4ckFzd1UwVjI1bXRtUVdFVGtZWVdFWk5vc0Rh?= =?utf-8?B?QUU1TXpaejNSYm5HNU90a2EwSGRvYmZ6dEFUQ3FnbS95NFFsdk5WWGRwRTdD?= =?utf-8?B?K0U2ZjJPYlVzVVE3OUpXQjZiTkR3WlcwVktndnhvdkZXc1E5Y0d0S24xN2Yx?= =?utf-8?B?T0xLaEZpNWNrbVVDd0ZLOHFaZEJWR2tYanZzbEJhNWMwazBGamE2WnBScFQ2?= =?utf-8?B?bTZqOE9GWUtoT1VVMWZmMFNFc1pLUGpxeVdpamhYUFhJcExhSjlOSWxjdWNT?= =?utf-8?B?Qm80a1dUNUxvaXBZR0dhVE5iTlo5cXFIZE5yMFJMVWttekxGRmVlUzcwMUZJ?= =?utf-8?B?UE94VVZhMHNMVjdHakNYQytBMmFXRU5yUFZHcERwc3VqN2drdG1HeVpPSGtz?= =?utf-8?B?bHB0ODl5bnRsQk42Y21lY3F5b3RHTmIrMWtwKzBSREhqd0VLNks1bkh2aEdX?= =?utf-8?B?YVE2NUN3YS9EQjYzbTlBR1JXNHZwOHRZQXpnZWxGZFpEaGlvWFNhdVUwSURk?= =?utf-8?B?QUlvUS9MZDNoWVRCakNMZTd1N2g4SWYwQUp5TE9tTnhyeTBzK1dlZDdOZGZ3?= =?utf-8?B?OExyb05sN0s5MTg3Zm5hMFdpMUNKYXlCVEVaNGo4bzAzcDYyQ3VCNk85c1pE?= =?utf-8?B?Tit0aG5Jbnd5R2JSenJXeHAyVlBCMXc4cVQxRXRiS1hrR0lJdkVFY0Y1SGFH?= =?utf-8?B?UGhwN0lpZGp1UkVtSFhZVEdpZy9XS09reVhISnhubDIyRVFJQjllM3hrZUVD?= =?utf-8?B?cWx0aXZFTWVHc2FGbkk5Y3BydEYwYytCQVBiNXJZNmZEYmhENnRuWFVJNVYr?= =?utf-8?Q?+1T9BS9yqdl01hQ/BijU=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;6:xKIFES4RIv+00BiPV4tYq/afs8GIIzanzzGfS9BOEiFr1bQzI27SShVCq/FLwP0nBHMyXk+Z0G9a74KNg8i0PLNbye3f5mqJ41KMNiolz1UqlZ7qTxh4LXyyc3KtNnVr3+a21eFt7R0MJqLdkhNKiEGuLv/iGssY42d9KSBLecZufNs9EA+V9pXkbvwFlnaf5o9w9OqgZZMQDqT+WLrZwktpdXXrmKV06NkviaPaq9V/EOXXSTfXtyyn0ek+H0XW3+OstP11LNtu7jVJVjDmuxMMLXj3kAmZlONPc0x/5slerfZHAaGHzM1cMNkwqaPZiik7fT6xpNseQeOUqC9jfftqohYkP3bd4/5KJ1Z3fuY=;5:l+CKc7JxdsYBhl1rvZc13+zvmtn3il166/YZa5wuNLFdudJ8D0YV3RSzRAy6U4PY8VVM5ZFlNzKysnA83NFDFNcuEYYGaXNBcKUkHrWQZPyhJZqSeXdDvCGRkH++vjXzbWf01tDefNvYB0GgeOSFV5jBj0tQ9RyJF1h02Epi7AQ=;24:I0dnvyej/3nD7sJI6GgAqz8RE+BYZwqxldGHH7B1tBGLLNXX0ACJNspQrfhpckNG2FNotITw1Q42PlWzv3tgNwqiWpftMAQOMMNa+lbc61M=;7:1eOTSHZTCMRYyfMUa16qle19jfEPq5yaOmUWMnjhpBdaA+MG9XLzJ4Oh/u5z05QpqRlwS8qgzcMl48Bs3RmyBHAJEuyf1R3EDzdgtCZfaPL32lGuCpM0K3ErWhTTfXXD4kK7cRvQ+BMxD+BMFscOOcJC5fiqPCqziVl0Ww49aV2QeNqeV9oeVbJtu2MihfLkjCpL3JEK03CP3luWbGYdcbsNPRi4hT9/vAZWbe+3NyXJFdQBMgU0nk4oHC8FsSB9 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;20:6TEns6HHdGYSfKWQC/HZqhwG9YBWoK4WpcK1i+F8U/5pS6pvUQ4A4Bd/GLi3gxs29MC2nE7luALacNFKx1Mf69v5XHOUzeGIFIUVDHCpp9timhOltu0i/HDtMhMJLIvmDEcLPdnOwCrIC70+OZC6nhnk2Qn4yrb58FTg4mx+w8g= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2018 15:50:36.8074 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fe180e1d-7f38-49f1-9055-08d5590b0f94 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1337 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: There were made several efforts to make __do_SAK() working in process context long ago, but it does not solves the problem completely. Since __do_SAK() may take tasklist_lock for a long time, the concurent processes waiting for write lock with interrupts disabled (e.g., forking), get into the same situation like __do_SAK() would have been executed in interrupt context. I've observed several hard lockups on 3.10 kernel running 200 containers, caused by long duration of copy_process()->write_lock_irq() after SAK was sent to a tty. Current mainline kernel has the same problem. So, this patch solves the problem and makes __do_SAK() to be not greedy of tasklist_lock. The solution is to use RCU to iterate processes and files. Task list integrity is the only reason we taken tasklist_lock before, as tty subsys primitives mostly take it for reading also (e.g., __proc_set_tty). RCU read lock is enough for that. Task list lock is taken for a small duration to check we've iterated all the list and do not race with newly forked children. It's not really useful, but we iterated the whole list before, so let's save the old behaviour. This patch covers all the cases, when __do_SAK() used to find a tty-related task before. Also, I reordered file iterations and p->signal->tty check and added tty_lock() to close small race with the case, when task obtains tty fd and then calls __proc_set_tty() in parallel with its processing. The patch is aimed to prevent hard lockups I've pointed above. Signed-off-by: Kirill Tkhai --- drivers/tty/tty_io.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 94813ae40983..2b6afe9e7bbb 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -2707,6 +2707,7 @@ void __do_SAK(struct tty_struct *tty) struct task_struct *p; struct pid *session; int i; + bool locked = false; if (!tty) return; @@ -2723,15 +2724,12 @@ void __do_SAK(struct tty_struct *tty) task_pid_nr(p), p->comm); send_sig(SIGKILL, p, 1); } while_each_pid_task(session, PIDTYPE_SID, p); + read_unlock(&tasklist_lock); + tty_lock(tty); + rcu_read_lock(); /* Now kill any processes that happen to have the tty open */ for_each_process(p) { - if (p->signal->tty == tty) { - tty_notice(tty, "SAK: killed process %d (%s): by controlling tty\n", - task_pid_nr(p), p->comm); - send_sig(SIGKILL, p, 1); - continue; - } task_lock(p); i = iterate_fd(p->files, 0, this_tty, tty); if (i != 0) { @@ -2740,8 +2738,26 @@ void __do_SAK(struct tty_struct *tty) force_sig(SIGKILL, p); } task_unlock(p); + + /* + * p->signal is always valid for task_struct obtained + * from the task list under rcu_read_lock(). + */ + if (!i && p->signal->tty == tty) { + tty_notice(tty, "SAK: killed process %d (%s): by controlling tty\n", + task_pid_nr(p), p->comm); + send_sig(SIGKILL, p, 1); + } + + if (unlikely(next_task(p) == &init_task && !locked)) { + /* Take the lock to pick newly forked tasks */ + read_lock(&tasklist_lock); + locked = true; + } } read_unlock(&tasklist_lock); + rcu_read_unlock(); + tty_unlock(tty); #endif }