From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752075AbdBJN5p (ORCPT ); Fri, 10 Feb 2017 08:57:45 -0500 Received: from mail-db5eur01on0094.outbound.protection.outlook.com ([104.47.2.94]:32266 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751577AbdBJN52 (ORCPT ); Fri, 10 Feb 2017 08:57:28 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; Subject: Re: [PATCH] x86/mm/ptdump: Fix soft lockup in page table walker. To: Dmitry Vyukov References: <0d19ac08-88b0-675d-19bd-4cdc543fdb30@virtuozzo.com> <20170210095405.31802-1-aryabinin@virtuozzo.com> <4bdfc6e9-0f68-bc30-fd1c-0def4508b472@virtuozzo.com> CC: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , "x86@kernel.org" , Tobias Regnery , "Paul E . McKenney" , Alexander Potapenko , kasan-dev , LKML , stable , Mark Rutland From: Andrey Ryabinin Message-ID: <730837a1-ee6f-9891-0421-93616dd1c4eb@virtuozzo.com> Date: Fri, 10 Feb 2017 16:56:19 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1P192CA0005.EURP192.PROD.OUTLOOK.COM (10.171.121.143) To HE1PR0801MB2060.eurprd08.prod.outlook.com (10.168.95.136) X-MS-Office365-Filtering-Correlation-Id: 00662b3e-a9e9-4ec8-7b75-08d451bc74e6 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:HE1PR0801MB2060; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2060;3:+P0fNoCgwMcfqobeaBzJ/WmCSPFXVmHRK8qq7ePBXxbinnjbpmgxIYojZgkzvimb2p6DF/85RBMCtXepGx8v16TtvFGz53cNIraR8QVe4XmjP0fSwcSTEUuw4JBzRXcTThrsZiB8Jkq8yQRTQDf4xC+ydTdQOZzRutA7fMF0N3YlWUIqvpzQ9J+PCr3/Zfy3VOIlmRFF4uAniLvPzkEWUH3lIWGTJeYuEGSRbFBbt1MofJAoZi8KUvzQ7zY9DJOcQ5LIAczUvEWxHLOKwDHLOA==;25:NyJNX/ra1p7EJc8S/HMCzM7EX6Ugoxis+rWImCxpkIIbnluMci9DnDupVb5hzO9QztrbRdJx5hrw5fgi/KHBaSRxiNE3bpFdilz53BTv3K8H/PNxlXfQOFyMVZuPoSwiqcnV8/KEVdg4AnSDmeyZ3gX6rFn9Up37+U+uTz5JO1QYU5GdCMHQaKxowp0Ei58/7gWEkDUhZ//1hayCQuXnC7ak3wzjG1nNg66+NS/Bd+KtBwzzeU9E1xWS15oeG/vP2KfHjm7sEvno+x5DgBr8FevM1feYBtByvtoHRWo0ThpaEyrWThS31vO2HJWW6wlGCSGRF98RFQB0tzkEwCYp7LPkq8pXWV82bxPlBqcskUK4HqhTAhd2WOJ1486VS/OOj6W7l9cItt4/8+cq+t7uKOkPwXcYMO9Zw5sy+uk9sxyN7/aWqdkDvHwPwY80ybGUHa4Dc4sGxRpMrXgLFVQ5kg== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2060;31:mARCklyGHuFZlgj0U28J4TF4okQ0quyqLF/9a/0lYUyM1Rymt7LMXqM1nQk9PdsMY/foWUdwVaMLuypIPaMZH/8jJuXW9/iRK2Stlnoc6tdEzztkDB8opCQw+wf1N1bsRMW9uxuyVvU/N0BlODRPh28Va++6dXBZf9EaxCCT0XYZsAC60Jzn0bnYPSz+4nuRwQb1OMPCzs4GIpCDow09WrLVLzXfj9oHfBzIW5DocycIEf2iKBd7AAdY0+KmbtEvDee4OCWhrlM/q85+GTxgbw==;20:lwRiwvkLqW5QtRX5k2IsTlTFywpSuX39v3e33b6+t1DBCisHF+KB8UL+b53+q2fLxmmTcwYzp64yNZQe6/P0DxTObjPm0PckXfCZZPvlpWhAFxf54U9LkmwFDZCO5HMGrbXbJ93UkCQA/b+IQ3Uy4LNfbedYcfJTwiHWsBWfMDVdd4kkutKrfvusgceIv12prWIPSQnM/hRogptGgdi/jgUjDGmoJGbH5HahbLD8jCVkRtpIg/MP0A6foxVuDNptPOrwYLpNyZmrR1ihUwj0xlf8M4O44kST2ZancuiWEzCq0hjGn59vYPO4pvkEsXvbpG8MoFwnienIvsgQ56kmE/7qeF7g/W4tUIEHtvW4qwRszuaQr9yg1wmKink8YCS4L0brx17AhLtAIih5+ZdFOmlzU/Vai6DZlTnIgCLRzUk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(20161123560025)(20161123555025)(20161123562025)(20161123564025)(20161123558025)(6072148);SRVR:HE1PR0801MB2060;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB2060; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2060;4:8D7RM0wS1GScFDbAZp5TvJk5RsgTCmVNTjCqwesYcCCNOOQu8v3D/DJ5bhqEDl1Edn5iJybVOtw0+7bWz7sgj3vD43NjHbWJgQ/aHITayFoRw8cdksINiD6PBVsgmt4wGJgRJWalBz9ge3guOcQMiQ05lUMsOqT7sJGiJalydc7hZGkrG8p/KPxUMSqjUN8HrHzr+9RFZDVj302HtpPhOUbTNslYo2LnRdqc2xTRWBEADrK2lD7bWEIdvHOVBIpYNJ+2BAVNu3Mdi0D4Fq+g9MwcItmqwxbjPTKjAR11ywoHrWnWVdv6Kfay9KyWHgR+nIz5TkdcdZqPb5D0jiLLDiDgZpaq46wMFNLGp6mKSR3Frj+U8Czq0WBIpMFxDXNbxnPUd7GhhrWB2zEZU0vGH0FTPnrQjVEKGv/eai/3ECHmc5wOWz03RBzqJ1b2++cKwlOOazQrFKE8xS5BdhlWc0e2HoNarnm/hArorLFkEWUYjcsWWylpCfywdghAVSGG+Eq/zERGmTIOi6FNKEGbI3l5QlhIv+PtxA5sV65zQ3MYsgbFcg3HZMxOQ/fA3P0QjBIU4lW06KdIlk9+4nJBF1B5ArWKvt7i4iMVZ9rlL/g= X-Forefront-PRVS: 0214EB3F68 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(7916002)(39450400003)(24454002)(199003)(377454003)(189002)(92566002)(36756003)(81166006)(101416001)(68736007)(33646002)(93886004)(4001350100001)(8676002)(81156014)(83506001)(189998001)(305945005)(76176999)(97736004)(53936002)(54356999)(7416002)(50986999)(230700001)(42186005)(5660300001)(86362001)(65826007)(31696002)(6916009)(2950100002)(39060400001)(90366009)(229853002)(25786008)(6486002)(77096006)(6246003)(53546003)(38730400002)(23676002)(3846002)(110136004)(106356001)(7736002)(6116002)(105586002)(31686004)(65806001)(66066001)(2906002)(47776003)(64126003)(50466002)(4326007)(54906002)(6306002)(65956001);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB2060;H:[172.16.25.12];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtIRTFQUjA4MDFNQjIwNjA7MjM6NUFjWDYxN3pXYTdMT1MyMmg2K1Y1M0Nu?= =?utf-8?B?TklxeTd2VzVGU2p6RXl5Lzc2bjdDWFpkQUdzUlZGNW5jcm5nbjFXbE9LYjVZ?= =?utf-8?B?Q1VpZ1dKMXBvQlI5em9UeXY0ZlZSd1Q2UjBLWDVPSnBGZFVmT2dkYW9PZkRW?= =?utf-8?B?MFZzK0NIS3NiNWNLV0J1RUg5a0dEZWJ4QndNdlNWa2YvVENhUDZEYmd5eVA3?= =?utf-8?B?akJYcVR5UDdXb2JuTnVRTTNJYXJ0UHB5V1N3Tm8xRmNIb1VyUWNabGRIcDdY?= =?utf-8?B?WmxUZDRsSldwOXh3b05MOEhLZGF5aEI4bVNCN3h4dSs4bDN0ejhnSDFOT01x?= =?utf-8?B?UzVaelR4VkNMRmxPNTh1cU16YnVsazRjdjFteXFyeUxVWGhXdFlZSndCOVl5?= =?utf-8?B?ejFtd0pDQWQ3WVJXZFFKV1RUb3dwbkxTeHY1a1lDN0RPZVc0MjJMa2VUMTdV?= =?utf-8?B?dGRJY3dsbzZIT2FBVElBNks3ellqdzErM0JubzIxcXlNNGo5NSthMlFpY3lH?= =?utf-8?B?cHpRSCt6MDAzMUJJT21HUDhRZS9jdGx4ZmpvVnJYcUllS24xb3ZOSEVXanBr?= =?utf-8?B?UTlyS3FyNzlDNzhyeFFZbXJIZEtZRTZkZ3ZBVnpWa0hXb2xaQ1N4T1JSYmV6?= =?utf-8?B?NWh2L1dMcElOK0VydS9ySDRxNHBJQ3ErRU01S3k3NkFOci9aOXdONElzQnh5?= =?utf-8?B?VE56UmlLa0NyWDZMTGM4b2tWeFp4Qk1QY2tseUxUd1lNNTFEaU02bk9yVTZv?= =?utf-8?B?Q0lsODYyS00vZ2MzamlVekFSOUNWL285T250dy9sNmYvU3pTQ2RKU2FSYnR2?= =?utf-8?B?U1FDOG9iakp3SmRHRnNOdWFFaFZtUVEzajFqZERHUFova3BhS2k2WVhoYitx?= =?utf-8?B?Y0RDZjZDenNaMHYzN28rUlprQjJ3YVhUTXFMbHcrQzZXNG0zeVByVC9yalY4?= =?utf-8?B?djUwN0cxRDV5QkxSdTV3cUg5ZVBjZEZUK3VUdmZMQzBISnJVaEN4VXFnMmx4?= =?utf-8?B?OGlNZTQ3dmw3MzVhdVJJeFBrTmVFUG1mUzdiNURpUWVvL2NWMFhpWEdFLzBn?= =?utf-8?B?Z3plT25QOVpQc3F6VjRRUm91SGJUTWJFNXZzc3ZZOWVHNnh3ZWFzNWN3aVc3?= =?utf-8?B?T1FTWDBncC9OdU80R0pRV3ZUUE9DQmNiL211VXdlZVlSd0tYM2xZMHJ4YTZz?= =?utf-8?B?dU9IRkRwc2NvTVpadlloZjF4SVpDZmlYbnFnNUNLVWk4RG5xakU3UlhsemMv?= =?utf-8?B?UXgybG9kRmNNTW04eEtNUnUrTTF0N1gybkgySnFPcmFCczFtdnZOYkg0TThM?= =?utf-8?B?ZVNKRHd3V0RmMFNjcEFBQ3dVYW45dU0vaFNHK0lFbUMrb1p0TmdZR3R4ZGRo?= =?utf-8?B?OFpwWk1xQUtaRVJSZGJHLzNwNzJVVHlXODN4TnNvME5JVUp6bldoNWVIai9L?= =?utf-8?B?Z01HUm5yZzcwNEtwMExVZHJsRm9MKzZCek1FK0ZuUndzcTl3TWg1dW1uMXFt?= =?utf-8?B?YjNCRXRWWHRqek94bjVEd0RKdFJ5VUhQWWl0K3BRQnhkMFlNcktnY3RzWnIy?= =?utf-8?B?Sm9ocTMzN1R0VXFZdXNMZFIxU3grNlZwMXp2K0NYOEliL3E3WmM0eE9OZG45?= =?utf-8?B?c1VGNnJCNkg5akJ1YTJidCtHSFNzWnU1N241RGZEWHhINWZZcnRrbU8zTFk2?= =?utf-8?B?SEh5NEd6Y1ZlRXBJaDNJT3NFV1JtUlBhSzR1Z0xITXZ4eGplNUZ6R24zNHd6?= =?utf-8?B?bnBJYUNGNmFZU1huK05OVGRMcU85amtBYzFkRWgrYzVKamxjSUpLcmNnRHlq?= =?utf-8?B?KzBXVXY5b3hUVUw5YnZFK2dKcHloZnpodkU5N3ZEemxUdjJ1WG9kTjdvWXo2?= =?utf-8?B?KzQ3bHpydjRncEpYdERXU1ZiMEZLb01EUmtpWDFKM3AvQ2hCazVFTnkyRzhz?= =?utf-8?B?ak14UkMycUVMWVU2MGJYUzNWUGdma0lkbE10TS9NNlp4TUJtdGdYd093Q2VT?= =?utf-8?B?TUlOSEc2WkRUTEozanlWaWtoSDJlTXk2RWJzVTl3PT0=?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2060;6:3JYhxAnzR4cmmuxVKpDyY3koFrjw9A0vSvwYKF4E/EMRPSkDn3owgbwSgzQEU7PY7e+UOXddr/3HeOYemgRSqa9lsnpa5LtuQ3Cpg8qtEoGsaLgKWjXGWN51ZjEqxY4NP3wM9HzzARhT2VBHyaxCWLR3XmbAoF+Dmi3QcWhZitSDuMX2XfSs0BLm4jZ1g+e/j9EOXISxbvAQUjq97qzVgz1GQrZGmxzGKxSP+yVpacg36HPfCy4+im7y0SSla3JDVVGxZjk/g+DwichZaxs7nVSiRAhxNOtnzN9h48awv2kXK31H7cq6tzsC1DXDz3EaRmLhLjbDhOW31SekdCbbP5uG7pUK7ipGsyRO47bsmUCKUX/1SsaxhkQjf5EoNXKx7KgXhmlh2I8Koujuqk3Hxw==;5:HeTSXtTn2y4HQJl92Yi/zFZnljbr+pQneK83yth9WGtIS1Y/ydfeU5aisqRDrJ96nnJPiuaJTcpNK1/vtFHiTxUa9Fl5t+exCCJcPxi7BtK/d9LLYwhAiTVyV32Ooq/nhb4JzJxb8wG5uuAUu+nByNfXe5tTbcG0acw8lVRkyPw=;24:Z9MSGoSsbjAHzEerZE55vmDBBJtDrD7bpQjzqxBz7VqIydjzXvXP09djlx3DkGWKOXS9mbZXng1+pCQ6Os/KLSiw11OP4EaDb/2gLNUJ6qg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2060;7:WAxLdpd6Ja3JEVHs3IXllNZ14ISqyHktNxjAub9AObAYma3YJ7d1OIwjfmrAtCUVoBCVIh1PFQy/5VDv87XFzy/JwmyhLi8T4PBVuJHy+3bc2qKdRcsDrLMJEU1KWCbaQuwDb4x0paeBTHrrbU6bWLlWrbWi6iwfE6IkAVIZ/ekDL+GjCTCupwgfvbzMqZHTQtEcZK3yJ+Qc3Ksa4CkWD/cGIEqDIPb00ZZPAvH3hRdyJU4Hie6NWEkFpQmkKWLXx2B5yifdVhJKRTWnqyOoyBiCWVogpiUhyJ3yz2p7LWuhFII/iWwDVYtj2qU4PPhJFfzDdXtd6C2KtKljSJPuhu3SMmClsJ8ByNQrFlNrq1jOjMTQsfL/Y6D10wxOaAi5MXOPrOh7rj1OluFAGupaMd8jh/rHO/2F30Swi7AdfAvo9WYSyAnH9HQQP2pl86tWo5lOPSRNghZeRKJ3QGZoZEB3rTfbv9DJIOrLNWCyCTJo+wPDuHiyPT8iJZW8pl48p3tNXBCoHfgcNXNXoHK9pw==;20:IFapbvNdoTNY0+dzcLRRcUkx1bZROzARE07ZcCfk4fbvYw+IRqpHIGzGHBwLLKDC/EmUKD3OJ7b1uwN/aamRnEiNikdJSdcGGmAdVZAXoZRhEWYW7JbuEg+p8KgW38xsyp16UXTqco6tzMuczdGsTbwyZ8PJY3QkkZGg0ZicX11O4WCxI1JHbGJgpZirHmC5YmT74HduajPQkF4xZ8XLcQSXMQXZ6T5nnASoft7YBxUZLH5eujfHTv3o3R3vp8JZ X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2017 13:55:21.6210 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2060 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/10/2017 04:02 PM, Dmitry Vyukov wrote: > On Fri, Feb 10, 2017 at 1:15 PM, Andrey Ryabinin > wrote: >> >> >> On 02/10/2017 02:18 PM, Thomas Gleixner wrote: >>> On Fri, 10 Feb 2017, Dmitry Vyukov wrote: >>>> This is the right thing to do per se, but I am concerned that now >>>> people will just suffers from slow boot (it can take literally >>>> minutes) and will not realize the root cause nor that it's fixable >>>> (e.g. with rodata=n) and will probably just blame KASAN for slowness. >>>> >>>> Could we default this rodata check to n under KASAN? Or at least print >>>> some explanatory warning message before doing marking rodata (it >>>> should be printed right before "hang", so if you stare at it for a >>>> minute during each boot you realize that it may be related)? Or >>>> something along these lines. FWIW in my builds I just always disable >>>> the check. >>> >>> That certainly makes sense and we emit such warnings in other places >>> already (lockdep, trace_printk ...) >>> >> >> Agreed, but perhaps it would be better to make this code faster for KASAN=y? >> The main problem here is that we have many pgd entries containing kasan_zero_pud values >> and ptdump walker checks kasan_zero_pud many times. >> Instead, we could check it only once and skip further kasan_zero_pud's. >> >> I can't say I like this hack very much, but it wins me almost 20 seconds of boot time. >> Any objections? > > > Now I remember that we already discussed it in this thread: > https://lkml.org/lkml/2016/11/8/775 > > Andrey, you proposed: > > "I didn't look at any code, but we probably could can remember last > visited pgd and skip next pgd if it's the same as previous." > > Do you still think it's a good idea? Ah, indeed. It will do roughly the same but with less of code churn, see bellow. > Walking the same pgd multiple times does not make sense (right?). And > it could probably speedup non-kasan builds to some degree in some > contexts. And the code will be free of additional ifdefs. > We could make it without ifdefs but this would be useless for KASAN=n as page table entries normally unique. So I'm thinking to add #ifdef at least for documentation purposes. diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index 8aa6bea..1599a5c 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c @@ -373,6 +373,11 @@ static inline bool is_hypervisor_range(int idx) #endif } +static bool pgd_already_checked(pgd_t *prev_pgd, pgd_t *pgd, bool checkwx) +{ + return checkwx && prev_pgd && (pgd_val(*prev_pgd) == pgd_val(*pgd)); +} + static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, bool checkwx) { @@ -381,6 +386,7 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, #else pgd_t *start = swapper_pg_dir; #endif + pgd_t *prev_pgd = NULL; pgprotval_t prot; int i; struct pg_state st = {}; @@ -396,7 +402,8 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, for (i = 0; i < PTRS_PER_PGD; i++) { st.current_address = normalize_addr(i * PGD_LEVEL_MULT); - if (!pgd_none(*start) && !is_hypervisor_range(i)) { + if (!pgd_none(*start) && !is_hypervisor_range(i) && + !pgd_already_checked(prev_pgd, start, checkwx)) { if (pgd_large(*start) || !pgd_present(*start)) { prot = pgd_flags(*start); note_page(m, &st, __pgprot(prot), 1); @@ -408,6 +415,7 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, note_page(m, &st, __pgprot(0), 1); cond_resched(); + prev_pgd = start; start++; }