From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934185AbeAJPgn (ORCPT + 1 other); Wed, 10 Jan 2018 10:36:43 -0500 Received: from mail-eopbgr60106.outbound.protection.outlook.com ([40.107.6.106]:21472 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933427AbeAJPgT (ORCPT ); Wed, 10 Jan 2018 10:36:19 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; From: Andrey Ryabinin To: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org Cc: kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, Alexander Potapenko , Dmitry Vyukov , kernel test robot , lkp@01.org, Andrey Ryabinin Subject: [PATCH] x86/kasan: panic if there is not enough memory to boot. Date: Wed, 10 Jan 2018 18:36:02 +0300 Message-Id: <20180110153602.18919-1-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR0102CA0016.eurprd01.prod.exchangelabs.com (2603:10a6:802::29) To DB6PR08MB2821.eurprd08.prod.outlook.com (2603:10a6:6:1d::24) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 32aa4e89-b7d2-47e3-736d-08d5583fe40a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:DB6PR08MB2821; X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2821;3:j6qjg2ghsz3UHqViwOyxdCZcafzkhqa8PQbhTxrWFmPMXIQdEhIPASdHueOjS/gfbJXfCkqe9AhpsD2uZ868yR6tHhniQ6559sjj8mbKqDxGGGl9Oa4FKf6xjV2GZ6m/JQfiIzoqSLQUOyapyu4GhNnkbkHwTVYBOnJGBCpxvWAQTLsdXh80ytf0CivbNr7DkDx3c+wKp/TWkWgdcK+0IS+m/R13ZQbEllfu7o1LzKUEEO0fOxeybMkufB38xeeA;25:YgBc4thuaEzVCPQeszxi0y1UaqprjQSYCuaKkWeOHUT+zybrCq0UQxMoZbfcZNSmrJJepsZXeDgnMN0m0C0isfC5Y0Segyqu97JW33zmsRDqOKQBnDs44P5orTIr1HRZv4FPmb3NIBzF4esLXfjhO7kj9E2QUwY8AbDUXoIa5LZIVwCxe9Mt82SqSVxz6NDxoV6CZ67fBTE2VcjNyakHSQOtoRAJ9u71N8I6HTsyC6EO/ONtDy3eedknXMd4PPWmNGGi+1+3W0tnbhiu178kvtXg5EkPi2Rk8vq20dyR//HIp2jSDJGdTFoMnVQ8hFvz+d3wnf6Kg14zXlhukmzzSg==;31:+ivVDBiWM5x07vuZTk4aMfa6nuxCvMIObDPaMc8nqWFGe4mPaBwM3kD3eKWiLvI/iZ4TCPR/62iVGPwPj9mFGGqf5qLO2foSxfgc8tT31/SXXIMAxhXIuUG56l0adcDBv8R70iM53e3DEy+MQ6d09Lw9oabxO/G7YljiLKEDxbgP6osJux2505Zcsc0WknsPNNGfbDsjcBC5Jjp+l1yLNKFkfz8qv7tZradX8o7upFQ= X-MS-TrafficTypeDiagnostic: DB6PR08MB2821: X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2821;20:O/BSx+Z7CblB0MrRAID33MfHRRLwjTNPUMz2SY1i274nEjihu3+LzZB3FDdfW1Xf4coJ3klvv7oaYMU84vvDOicTAsKGlwUSkTlrKhMZThTbYHC93h9DXIZEYbaKTiypT+2tWRVFjN32Cnje30HOt/EzQ8ccETRTxLaEiBNYthWVOB6HGKWran1/yEqRuB6/HGs9WMGPpVypNcXzwFEEPwme5hQOfB2Nu+ijOivT7MSwLnOrEwSat/wagny4qalooe+1IauzNVV1E4i3Q7fuwA8qfO5mB6MrMGT+BHmMILtBjN6Teoubx4PQWyhc7lUgT9vY3sR52Gmb1QLlDv9JaM14zOfOaO/Ep/ANsXiaZX+oB4VulK/LqX7enaMYBebqJNgHvCHACKakJUerxUDfo+seWSfy2ZdLFhQ20hvGQrU=;4:VNwSfy9ZO9LqoCke6sb5VgcIbqv4Ezq8PTamMFD33lPzyGwG6R6kFDFMzfEbqyQVlzP5B+St2ynZluCGzacOjnSyaEkDsXSCiAlCngkQ22M0T7EStmge3B0Y5BRjaU4+LzlbYyVZbudd/Qb0hHg63GG1tzTTJDo2tLwwrglM3HrUaMMhzKm+zK7PhiAp0WZpXfXZoLuvnu9JV0tlj6avLUh4BnW9ImGsvUceKEwAGDUyxUIVwrLbhQ9wBcTyzhp+OQAKTScdWfu9SeRKEPru/srV8NvN3qjg07qPU+0lNcocFbQ/Py5Za5qfVwzoBqWq X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(5005006)(8121501046)(93006095)(93001095)(3231023)(944501075)(10201501046)(3002001)(6041268)(20161123560045)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011);SRVR:DB6PR08MB2821;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DB6PR08MB2821; X-Forefront-PRVS: 0548586081 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6069001)(366004)(39850400004)(376002)(346002)(39380400002)(396003)(199004)(189003)(6486002)(66066001)(53936002)(2950100002)(86362001)(2906002)(59450400001)(97736004)(6512007)(107886003)(106356001)(316002)(575784001)(52116002)(5660300001)(4326008)(6666003)(51416003)(105586002)(76176011)(47776003)(25786009)(50466002)(305945005)(16586007)(36756003)(16526018)(386003)(55236004)(76506005)(53416004)(110136005)(54906003)(50226002)(81156014)(69596002)(68736007)(7416002)(8676002)(1076002)(8936002)(6506007)(478600001)(6116002)(81166006)(7736002)(3846002)(48376002);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR08MB2821;H:localhost.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR08MB2821;23:Pn1n9jv8dXZLMBQpPbrq9fjNph6ReqYeMH3LbiLZ2?= =?us-ascii?Q?efU7ATnizoq2nJIOZKVj3m/4rV8AP31a59uExhhUp7Df1spXDacTI5zAUdU4?= =?us-ascii?Q?W2KTZvt7OPByMZOu2+jfqQbRVKqQni0tHaoUIqlopOYDlm+Hc5xj2IdaTBC2?= =?us-ascii?Q?UgNlEHPPuxab2cgk1aRlNJyqnYVzH+LYq69Ib8Lk8JnF6mdIu6AMsgN3rTtY?= =?us-ascii?Q?KK/bgLV4XiO+1zsGQfStrs0367wV2y9rWOeSIFopnXHRT2A8F0FAlVJMqotz?= =?us-ascii?Q?p11GIzDzKTHE2vThEmkTJkWBFHSZPXb8xCbwRA+TkF4S8Iw4RqUSAllJrqs3?= =?us-ascii?Q?uqKbaZCm2nUXj1B7mbKLYrtWg9XyEna7cSy4sOy4KkxzMK0jobGdvaLA0uja?= =?us-ascii?Q?q2AxxmMrEyXwf/CzZJDHqBbbFR/zOH4crzlv6+WXTP49x0qpqX5Ezf+uETY0?= =?us-ascii?Q?qHVecFDVwqqutrcEPQFDHQbNFwc3pEtAGMs1xiADA1unxNv5hq/Vd8iMQNGI?= =?us-ascii?Q?xtHq7v+7LHQ4twSfrLryy8q2lSskGEDUB+kx9gouPiI+lOmLsxscx4qdSAZ+?= =?us-ascii?Q?GtBi/FHIKOyCVonvRdu33bxMKsb3jrglpJSSQgI2kr7QBWJp29HDW6UrMqUA?= =?us-ascii?Q?kTfz3OLRVhowCK3J1bv8k3YcSo+SFrju8PdqTcXu7b/RJ/6lW1YJz1OZCLD0?= =?us-ascii?Q?gGKGStxu9aHfr6qLrYgaly7oIs+ed0eghnE7zvsf2CwED57MTcnJt96dpgpx?= =?us-ascii?Q?mlzTsGPmBCf90NBNHaeXxri7AKn0ROEDd/GxCJr8d2OcaRVUnAOYIF/q12w+?= =?us-ascii?Q?df8ABQtLBt3e9ehQe32V6oHBWwlAMhBLcIdiqTVdRqVCea21RUglfQsQsZrY?= =?us-ascii?Q?IF8tgYPvEz/TSBhaDbE6Y6m+TLyTKlvKiWHy0Ho1y+22tCnHmF1iZ3BjcC8M?= =?us-ascii?Q?7UrLZmOn+PMDzYMfD/EyjvH7ouKJ9VA7ZF4PDFaPNG5jV3EHHOtQWvacNr22?= =?us-ascii?Q?65BoArxB//5HF4VbIyT+UM2sZ+O4iUSx6ZQ1B+I047dx17k3x0PkCQtEHvqS?= =?us-ascii?Q?iDybYUl79RTTkirMAWjrLSYH/lt8yakflESluK7B6MwZ5ot+JZM3d08fao+z?= =?us-ascii?Q?rFcKwCF/Kqxi29mA0VSfsAlyaYcN8NcUEpkKBW2Evtj+EEmvTDavJ5AsNBYk?= =?us-ascii?Q?/rb4JOoCbL1RxpoESWr51wc+WCNzXG576NAns/okEiFBFmAEY+HoliQtwcHH?= =?us-ascii?Q?Do+NLHPxD9KgSjSfsXaY8HB8GxH7yfQpD3RM7r99ukGHQYW5KjqkMWNAgBmy?= =?us-ascii?Q?jK+eS3w43Unlnr7u87svn8=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2821;6:2oPvqkixCtc7+G21XFUXkaKMmfoF1ZLDFNuFCwV+zI4zLkyU1N3nANGXh2LkTYiVHwB2u2rbVGUL3UP2eJRuPC+i3qxJZPi/f9K/+1uvQLeNKyzxBh2oRVLtF0IzdjPy57TsmFroXV4Plg2VIZp9WiRlZcATqcR7k3Lhdb66kP9Gef77iweCx5iBtqlKdty0aWo8zSLU2gjCiHQDocC5SuL0gLTpQ1peV8ek1Q9t5XmCs4huNglgrSOpX+t0X2t7JG0JfNZkhRwu5/dXf95Dp3itvLH8yTOdzGvu0jZrGNgdlCsyioz7v9FD+1qaRIUVQURZYgytogO7qVU1pIQPCaoluuzmia5JeX+0FL7Nnjw=;5:6Sh5lKOE38nOD3hMduKCmYqNVkyuuZE43h0TGlQc2rhTjBhbxbCq0y80z2yUWha4jw80DoiDlhR/WwlWWqSoSSds7/aClGUx461NnAsqnoPONPm2CMEADYyOFLLt2oVK8yAPsrI+x5It6Agg9iqivhcUNfpNYo+NyYeXYIEHtd8=;24:OpqE+nREaFFbLK3NB+rQO0OIvtU5D32XCkr+tiThqZEpLNFXwRJFI00EM1im9UTUfR/6mPEeos+D42Z3KZVAy7MCj/4q7jhT7XIiTZrIib8=;7:2AgV4GCFlSbsYPE0WUVGYZHRIauMQVZqVEvAML4dOJpktiajcZETZrsGCN3er+SxzNOOsWplQFJ4AYIcPaQ99tbglII4DQn0NOsPYl8jkA6OuFP/pIGO0A8iN21V0STPwyptI19ebrhDSCWBqbnb1TCyp40akFqiZxVZI5HivmxF1Ho7QZryfcTFPWOXTBuFGrwq+Rkjbrv8nntVWzgAtYDrg++d3CTMsohB64grDmVF/c0xL5q8nXdY4FW3Frn8 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2821;20:qXBBnhWuVrn0Cin8VZZWxl/PifY0V3TenVJWFrDoCpS2AobCDMpaFZVoWtbCiMEOhKuhZWesBgI++6F+Hk5s6J2We9n/ZFgDINywq8jFVUsV5jFOBigbnSz7WMsyvVNEzaaeUFDjzpmVs1XrUVeCUARFHlIjUfrfgVomIoEefLg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2018 15:36:16.2367 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 32aa4e89-b7d2-47e3-736d-08d5583fe40a X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR08MB2821 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: Currently KASAN doesn't panic in case it don't have enough memory to boot. Instead, it crashes in some random place: kernel BUG at arch/x86/mm/physaddr.c:27! RIP: 0010:__phys_addr+0x268/0x276 Call Trace: kasan_populate_shadow+0x3f2/0x497 kasan_init+0x12e/0x2b2 setup_arch+0x2825/0x2a2c start_kernel+0xc8/0x15f4 x86_64_start_reservations+0x2a/0x2c x86_64_start_kernel+0x72/0x75 secondary_startup_64+0xa5/0xb0 Use memblock_virt_alloc_try_nid() for allocations without failure fallback. It will panic with an out of memory message. Reported-by: kernel test robot Signed-off-by: Andrey Ryabinin --- arch/x86/mm/kasan_init_64.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c index 47388f0c0e59..af6f2f9c6a26 100644 --- a/arch/x86/mm/kasan_init_64.c +++ b/arch/x86/mm/kasan_init_64.c @@ -21,10 +21,14 @@ extern struct range pfn_mapped[E820_MAX_ENTRIES]; static p4d_t tmp_p4d_table[PTRS_PER_P4D] __initdata __aligned(PAGE_SIZE); -static __init void *early_alloc(size_t size, int nid) +static __init void *early_alloc(size_t size, int nid, bool panic) { - return memblock_virt_alloc_try_nid_nopanic(size, size, - __pa(MAX_DMA_ADDRESS), BOOTMEM_ALLOC_ACCESSIBLE, nid); + if (panic) + return memblock_virt_alloc_try_nid(size, size, + __pa(MAX_DMA_ADDRESS), BOOTMEM_ALLOC_ACCESSIBLE, nid); + else + return memblock_virt_alloc_try_nid_nopanic(size, size, + __pa(MAX_DMA_ADDRESS), BOOTMEM_ALLOC_ACCESSIBLE, nid); } static void __init kasan_populate_pmd(pmd_t *pmd, unsigned long addr, @@ -38,14 +42,14 @@ static void __init kasan_populate_pmd(pmd_t *pmd, unsigned long addr, if (boot_cpu_has(X86_FEATURE_PSE) && ((end - addr) == PMD_SIZE) && IS_ALIGNED(addr, PMD_SIZE)) { - p = early_alloc(PMD_SIZE, nid); + p = early_alloc(PMD_SIZE, nid, false); if (p && pmd_set_huge(pmd, __pa(p), PAGE_KERNEL)) return; else if (p) memblock_free(__pa(p), PMD_SIZE); } - p = early_alloc(PAGE_SIZE, nid); + p = early_alloc(PAGE_SIZE, nid, true); pmd_populate_kernel(&init_mm, pmd, p); } @@ -57,7 +61,7 @@ static void __init kasan_populate_pmd(pmd_t *pmd, unsigned long addr, if (!pte_none(*pte)) continue; - p = early_alloc(PAGE_SIZE, nid); + p = early_alloc(PAGE_SIZE, nid, true); entry = pfn_pte(PFN_DOWN(__pa(p)), PAGE_KERNEL); set_pte_at(&init_mm, addr, pte, entry); } while (pte++, addr += PAGE_SIZE, addr != end); @@ -75,14 +79,14 @@ static void __init kasan_populate_pud(pud_t *pud, unsigned long addr, if (boot_cpu_has(X86_FEATURE_GBPAGES) && ((end - addr) == PUD_SIZE) && IS_ALIGNED(addr, PUD_SIZE)) { - p = early_alloc(PUD_SIZE, nid); + p = early_alloc(PUD_SIZE, nid, false); if (p && pud_set_huge(pud, __pa(p), PAGE_KERNEL)) return; else if (p) memblock_free(__pa(p), PUD_SIZE); } - p = early_alloc(PAGE_SIZE, nid); + p = early_alloc(PAGE_SIZE, nid, true); pud_populate(&init_mm, pud, p); } @@ -101,7 +105,7 @@ static void __init kasan_populate_p4d(p4d_t *p4d, unsigned long addr, unsigned long next; if (p4d_none(*p4d)) { - void *p = early_alloc(PAGE_SIZE, nid); + void *p = early_alloc(PAGE_SIZE, nid, true); p4d_populate(&init_mm, p4d, p); } @@ -122,7 +126,7 @@ static void __init kasan_populate_pgd(pgd_t *pgd, unsigned long addr, unsigned long next; if (pgd_none(*pgd)) { - p = early_alloc(PAGE_SIZE, nid); + p = early_alloc(PAGE_SIZE, nid, true); pgd_populate(&init_mm, pgd, p); } -- 2.13.6