From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751675AbdFAQWs (ORCPT ); Thu, 1 Jun 2017 12:22:48 -0400 Received: from mail-eopbgr50126.outbound.protection.outlook.com ([40.107.5.126]:22720 "EHLO EUR03-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751653AbdFAQWo (ORCPT ); Thu, 1 Jun 2017 12:22:44 -0400 Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none;linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; From: Andrey Ryabinin To: Andrew Morton CC: Alexander Potapenko , Dmitry Vyukov , , , , Andrey Ryabinin Subject: [PATCH 4/4] mm/kasan: Add support for memory hotplug Date: Thu, 1 Jun 2017 19:23:38 +0300 Message-ID: <20170601162338.23540-4-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170601162338.23540-1-aryabinin@virtuozzo.com> References: <20170601162338.23540-1-aryabinin@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1P190CA0007.EURP190.PROD.OUTLOOK.COM (10.165.188.148) To DB5PR0801MB2727.eurprd08.prod.outlook.com (10.166.176.23) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DB5PR0801MB2727: X-MS-Office365-Filtering-Correlation-Id: d4a1cd1a-30ea-475f-7caf-08d4a90a6217 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:DB5PR0801MB2727; X-Microsoft-Exchange-Diagnostics: 1;DB5PR0801MB2727;3:fi7jDNQaSyTaH3E4Kn4nBke70/yD0qmyi4IZ2UnZFlUduDbF4WoSxAEpOelYfihMR/UN9F8YObi+6kyOgL8kFRCzuo+3uSKwXjeAfSQUQLG7cy2wo5EHuglIX6j4T5xeGnZ3mBGPGeSaQaIC4irO6KzmMCvGT7P2/2P+xKtVs+r6ekfkLSvDNbjpgpLgdZodvpQmPb1dEvwIz8cZnnKAu2b9OVRkU9r9wdJ5/gZXWy8ej7n1NvVqdwapOmPnXatyx6T3+mQ4JTBU8TsrDxU2+ez1DJQ9t0t23zJpQi6okEqGugXvrzExtQXUfne13Z55LPVpHjKJRXTsXCrnFAQBpg==;25:OBIKQCWrumBNaZym80zcKbna3unSggSZ7xBH5o85KzpVxXJAJU6VB2uqdbuPE8CVXvhcKvbN96tc+6htsptBvo+QCQMAVxtYc38TOLNJnum5dqXZ39CJNKFKW0S0tr25PANdG4ZS3qONDCIpaZsPCoxOElS9OOxMML1F7fqpMCTBFTXH2R190yICMu3u3deW4eogyytsz+ebCeZKgbHPzShxxezrwGhnKFXrg5oHa4FfG2KXP8gH7BHf/TxLuiUZ/yjMcWpP+K+VldbFxx/yfS9ywnKcM3HAg0VKzZdEaDfFskp+h3739Qm6C2/tEGSYjwU624xdoDAlrX3U9czr10SseLxuthCHd/SDThKjZrWH8FcVgDR/6NgSqXDrxkUslnwfLUwhjuI8gNV96B0IJPjKLTimURUB00KeYSXFXzrwhZ9tZ7d50RckFnXEH9xOg6JOfvorw6i2Qc86JOUCYzB2PHGwGMPS1QLcaZGHi+M= X-Microsoft-Exchange-Diagnostics: 1;DB5PR0801MB2727;31:gTVN9UCw7NKWd5KY+GVq0X40sTd60GP73CIPq8J//d9bz8M6bRMoBNAEaVw6nJugJAkq1ziVkN8QgggONdbgREn9wX38pjs0ikuXaWole8olx0gisSjJbFgzmKYAZ7r1fFruF4rgEKZH4MwROZNxMf+KNqiLhVVKeONgAGEhqq5waNh1lDSo8HqE3YAnMAruBlk8/ZdA57+7zk6P397V3h2kpJo5qZItSuZ3EbU8Akg=;20:wvOZdK1P9j3gtR9FnE5Nv9kbmlwJyexl8oiVuFO8fnrrDK8Kcl4b/TCGp0eVu9D1bY/fHa5Vo3oJ1X6qKkjTL8iMe/9Nea1bSKkj/ljIHOegfCox4Nwlq+ExR86x3y53QEehrVN7tOqs9KfDqAxhGVYc/mloezo6F8YaYF0Ee6GA14k0bIcz5o2D7ma3j1MisfwwHSkeMNz/oa1Im0aomq2trikcp5InqQBXcZKl9pbRWjilBBYIDeLVNwmkuthApiwh9xig8AqPQuSOfDOHJDS0Y7S/IM9BCIqp7rrvNSsKP9T/MZQrqJPO28OPZ69NgrDiF0iGy2YSWuOBqmXqd2YEgikD892Stb+5jaYMRV0MqMK8qK84DEsc1qICkOYW8/4XCNjsykiOZksUJxtn20ZMv9+DLl8y4BX/Qi88A6w= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(209352067349851); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123564025)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DB5PR0801MB2727;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DB5PR0801MB2727; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB5PR0801MB2727;4:QKxxng4iWWjeVtZAU9ThjyDwvS5Nao3LF5Ivleoy?= =?us-ascii?Q?lUbXttIcKsmnNQm1hlXBSSRkpDUJEZgVQw8susaQZHapL+5npTCh4UAZ3KHS?= =?us-ascii?Q?H9fIpI923xVwVN/7g+ClOBUSpSQ6kGGRdxRim1YBEcrWhc2lh7jZlNFTq3tm?= =?us-ascii?Q?Gh9Yo95FLn2mevII8XJ6GEGGGsUMJYe8lO2NH42smKWfQnMaOYQ8ENg94yMW?= =?us-ascii?Q?SUM1yO3kIyNOnbTWhqy5sgOjxqsULIr+bE5ZhEpNlUx0/dE0ZFGqdVEc6Ep8?= =?us-ascii?Q?bHRS0BfDlvcxqSJMFAyGhgVB155e5LB9FO+/UsWZP8SJU+/c6Avw7aFIVuG4?= =?us-ascii?Q?UyyK72LGhKZXarjhlD4ffLEPqsG5mTgCfLoO3NhWsYlml2akHkmK8LAbYpkJ?= =?us-ascii?Q?CdtpK+EHMxUXeHqyFmGCy1GwAbWgIPfieBN+i+a4sbAX1RLwvto6SegLJeGP?= =?us-ascii?Q?RHMfbOtoBBGmDSY3Z2JHLq0FkuL5k73Y+soHLDXEf2vCKipA1arj3ARwEul4?= =?us-ascii?Q?zFMjTrU/DdmjtJxNqSN0Z7RpTdPoHaAsbgmCXaY/D9o3KFpga3TQQvAMoIcv?= =?us-ascii?Q?7e2ziLMKe3XPbnwLBqHrEp/vIYEsE0JKK9n7WHK0KNVuv/PZhKLq0YFuNF8o?= =?us-ascii?Q?dF2KpR/XtL4p59cFuXVzVDGVPGdo1ToOGUcLquuBx9r8GJXEikNVmJ/i4w7B?= =?us-ascii?Q?EfEO6PWmjls26Vwy+1GPUDVRu0OyOBUFH8y/mufUPYr0f5zKbfkw/rT4mkYa?= =?us-ascii?Q?Ct5B/IOoX00aeaKv6Syf9yFZzBn1YnD+Tnk/AtkO9wyQpin6xs5wTCCv6ZqU?= =?us-ascii?Q?xcG/a9dkOLuJVCXXKyMLXaQ7mdB1XqpZrHHFp5rYGhXh5IwSfU1GT9XO1OFv?= =?us-ascii?Q?hjH/ZLl1s83/AqmzoSUixdDovtdeT2paZYRgz1wyD1e4GIMudFg+QWNs2Xvv?= =?us-ascii?Q?v4t6CrwMf72jvtuB2DgCZHS/yvrXLZwrg/dXD4n4RG18XkfMtIMeq7wAsnxJ?= =?us-ascii?Q?srP76sdn+ppMPCAkofSkRmod+VqqehFzlc/qeWjIYzqmokQciztwLllmgB86?= =?us-ascii?Q?yxRrfKmYbUnTjs0h85NIY+yz+77xKxtWTDeY4TxuBn6qoH2z2qL1DbCBTHrV?= =?us-ascii?Q?tDfEQdj/NPhYlr+Uy84bZ1+tLedGQJrGQHKY/IfW7+tbg3abuGV8lnSnt7HT?= =?us-ascii?Q?yCjtrQRyP6LF7/Q=3D?= X-Forefront-PRVS: 0325F6C77B X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(39830400002)(39400400002)(39410400002)(39450400003)(81166006)(305945005)(2950100002)(1076002)(6666003)(6916009)(50986999)(5003940100001)(7736002)(76176999)(36756003)(76506005)(86362001)(42186005)(53416004)(47776003)(5660300001)(66066001)(33646002)(6116002)(3846002)(6506006)(6486002)(48376002)(53936002)(50466002)(110136004)(107886003)(38730400002)(6512007)(189998001)(50226002)(54906002)(8676002)(4326008)(478600001)(2906002)(25786009);DIR:OUT;SFP:1102;SCL:1;SRVR:DB5PR0801MB2727;H:localhost.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB5PR0801MB2727;23:KfG0ctd85Tp8V390F0gyZTPyZIzB2KNSHFRuaK1?= =?us-ascii?Q?GpxBTbfP3UU8yfBovovXQK9s6gAej0ZIYV/KGR4ocM2d93da7QEVDQnH9173?= =?us-ascii?Q?ZXgmxK3v5t0B34pHbPYTaRNtMin7SIVSzSdTSxxhqJHQsINjrycffpMz/DZ+?= =?us-ascii?Q?UMGmZQyIFw8uyiH4rlkLL8vYIUXEjMIml3WI34cqn5igZyNxOer3Oxc1ghVg?= =?us-ascii?Q?asIcZXbJ8EHO3KdQo+phwGWel5kAKI1T4VEoQTW3B9X9OXj1uhhA7Kdv12s8?= =?us-ascii?Q?X1RDMIAuqajqfNEBUWgBB94MpYGu88/mCCr8pKBpIu/gUtj3SPBaEdMdUegz?= =?us-ascii?Q?92ArmR25eBe91S+CQdP5gx270PH4JfZJ8UFa5ptGN8e8ui7UFpsVnFV0Rm3V?= =?us-ascii?Q?/JR5rBrQPODA7CVODmMUqKwCeSnTFX1f5LldmoTSKZg7WHMe+PGSA7Hx+rVb?= =?us-ascii?Q?Yk1J9V5pc2RHxFv5/yZf/dTbAlOi3j+4wqJa4yV79xzTAV+9DwrEGkq5UXRC?= =?us-ascii?Q?iLy2HRs38AIlgaAvIk4ce4NmETDAizokDvv7ML43pCa47WkG/9SJAAWSf5kJ?= =?us-ascii?Q?kpcxfKo3chF/zJ6NDYREnzwfhdKTE5UX4Nu8vgz0Mb/ul/Cwg3tobMf+MXij?= =?us-ascii?Q?pAKUQuBeBhoaEB+dxKvOXv4krmiS4sRjQ62NE52pOgPF8p0ihLs0HLEWE7ts?= =?us-ascii?Q?3FMhbK+kcEs/uTIPoLh0uT+I0H1vaIm0NqUNwX183hJgUnPkbDDDZ5VBxDzs?= =?us-ascii?Q?GORnUECkky9ICQ3AjhMItQ6hydY50KBGwnRgRCT3gQmOb40CKLDZ6pNi//xB?= =?us-ascii?Q?GEsaefiCLWt7GDfJKpaB2vk7suf/AmiReXcReyo1p80qCpdGIyKvtM9uEqyP?= =?us-ascii?Q?ZQiwU9b5nFpoAA8QRlRztpogHAG20xsqipaPo92zqMNlVeghq5YJiBevfLU2?= =?us-ascii?Q?bEj0aIFJMhEmNZlArj+X28uhMwrf1vz2+VE+4pr2ush+RZ1VxoXHpsgKkxJA?= =?us-ascii?Q?bdxNzyUQrqt0qHz6w22M1deAKzCtTrDPOyDeRRe+690GPqr1gzIWxZX+9/P7?= =?us-ascii?Q?YmyR5guZTZLnVYdsRz6v+uDyC1R2jJVe/g51EnkdrqOxubQbSoLZrNYv0sv6?= =?us-ascii?Q?V26c0zCI4SM4=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB5PR0801MB2727;6:tODXQc5zB6dBDGZhAAMVT+WBhtRHvXGKGEXbVdrNo1p3CPg2Q5cHkD5CNTgkt9NSDR+FFLEkdwAfYd6lbmC3QfcUuJDI5H/ykkMWr0KKTa7oPl16HSBrvXgRMVopJ5Kv9bSMpf6Y5eD2e+nTUCkq3UEg4d5tI5MxRuuC9337PR7g2cByGEt/XmzunrLeK7pLSe/fx5MUBBqMN7NCEf5QyxEXR16sZJ4zszh9ITSctyPT1W4bGi9fq5fUpTe+OuYbsgpSOSMbNWB8RubkbWKnPSy9p0GOiQZ2XnlXTI3T4MCKu1baCApZzFrtJ2vuv9xjrVVHrq3komzaBbENbqIpnzBqGn+ixV/UqImxNEgOsJNoyvwQIkBGHXQY6XUsx9IUoRZWDLVO9mOuVFyXnY6gknlAQNSJs5rTlC1bI+I//sp45UsikNm2veZfRyewp4bzJVFpIWGOepSHkNQteT6eno/ZKAECRd26FSXqomPLkAviLNOijjmA15qHQEUzOw9zlcgYqdaiZM0nXeeHVI7Y/g== X-Microsoft-Exchange-Diagnostics: 1;DB5PR0801MB2727;5:6p4ZNNBx2Ba24205pE52A69cYNfDO35b+DjXaGqo4DLKgje74YQs/I4XcmtVceWOHbuj9aLatoJ2EUyhY/14Yz6qPkSubSRimm81iF5cGvBHZfptfBbFYCj8fU38wADes4k1pMj7jJDzK51m/Y12T/nCB/9hisOXiiWAnUxdXdnZ7jY2tguKoCrlmkoHgK6UI9nU0I1Tkkq4zJDsiO3Kst2ywNGJH5+9JujaKnRrci36IFpJXTT47hNQVCFrlFKyi9KvKONjcGvLKEZs68OjPEXObPEN9ASovX4j+dMoUdQYN1Nzk5grr3e6WdwRWck4zD2k0I4N4ddR5FLF8PVF0oTTL4X+DxapcSrNtrp7ydpp/m3JMfHp96tkfVKVcCaJogbHXSRNuGcjuDJgKWLlZz6RXRj3TSKr1EeqNOfX91taN+5JLIR3tuXvLlPnbdAzO2tMth2t92IoJaUaktxra/2v3vAbs3ENDvV3p7cq43oqf5b8DAETJRwgdbVGWo5p;24:u8JrfOI8RcghD8fCLuwO0Er+I8cHIVb0AZLjJPcQf4YIaA+cu3n0Rx1Zv4uedr8aUftNGG5OBhJHfcWoekuJZCQK1FP1fIJ5Y/xaFVnRN+w= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB5PR0801MB2727;7:JpXEMxJGFht6RlPYuLaeCFRxeYo6EegG31ftUOLcjb//baqmiQIcvULB9l2vfhzaPprd7ljcsIeR84FDNDbL3GKlzbbSRydMGQhitW2iYZF/N9iINSVQeATh1x0nnQwnPxkI/HXb33rDymaksR7pXhUs/r4mzhyOGrdIeIh2eaSvF2c1N/7wHBifnOJf94k/JnZsFFjCEJBQ5sElh8fCOPU5jONKrQba5C01DZ7lZkpXNi7beBx9voy34wW6INMu2qENyZE9NbddYr4Si9G7RXJeGEeYlRxyYJO7IwFxjxRb4OSryXrAiWRH3bS6Xz/wZWJZKDNryJU4qj0TbnC3Wg==;20:Wc7McU6gZ1PG+9pDJwbtf44f/jGZw6JWHX0EwESgYwnpdkZxkVAxTHQVWOoGGRIypZRQ/k9C9fVD/absLh/oAzwA3FTj9jQFCzA9A9m0rp4SCERQk7QjDdQ8A8oa3cuWKwfL3EDKfN1GsQVMVFHVgYjOAXACv4AEtcGg5bxzeJY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jun 2017 16:22:21.8118 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR0801MB2727 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org KASAN doesn't happen work with memory hotplug because hotplugged memory doesn't have any shadow memory. So any access to hotplugged memory would cause a crash on shadow check. Use memory hotplug notifier to allocate and map shadow memory when the hotplugged memory is going online and free shadow after the memory offlined. Signed-off-by: Andrey Ryabinin --- mm/Kconfig | 1 - mm/kasan/kasan.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/mm/Kconfig b/mm/Kconfig index f1fbde17d45d..c8df94059974 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -161,7 +161,6 @@ config MEMORY_HOTPLUG bool "Allow for memory hot-add" depends on SPARSEMEM || X86_64_ACPI_NUMA depends on ARCH_ENABLE_MEMORY_HOTPLUG - depends on COMPILE_TEST || !KASAN config MEMORY_HOTPLUG_SPARSE def_bool y diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index e6fe07a98677..ca11bc4ce205 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c @@ -737,17 +737,47 @@ void __asan_unpoison_stack_memory(const void *addr, size_t size) EXPORT_SYMBOL(__asan_unpoison_stack_memory); #ifdef CONFIG_MEMORY_HOTPLUG -static int kasan_mem_notifier(struct notifier_block *nb, +static int __meminit kasan_mem_notifier(struct notifier_block *nb, unsigned long action, void *data) { - return (action == MEM_GOING_ONLINE) ? NOTIFY_BAD : NOTIFY_OK; + struct memory_notify *mem_data = data; + unsigned long nr_shadow_pages, start_kaddr, shadow_start; + unsigned long shadow_end, shadow_size; + + nr_shadow_pages = mem_data->nr_pages >> KASAN_SHADOW_SCALE_SHIFT; + start_kaddr = (unsigned long)pfn_to_kaddr(mem_data->start_pfn); + shadow_start = (unsigned long)kasan_mem_to_shadow((void *)start_kaddr); + shadow_size = nr_shadow_pages << PAGE_SHIFT; + shadow_end = shadow_start + shadow_size; + + if (WARN_ON(mem_data->nr_pages % KASAN_SHADOW_SCALE_SIZE) || + WARN_ON(start_kaddr % (KASAN_SHADOW_SCALE_SIZE << PAGE_SHIFT))) + return NOTIFY_BAD; + + switch (action) { + case MEM_GOING_ONLINE: { + void *ret; + + ret = __vmalloc_node_range(shadow_size, PAGE_SIZE, shadow_start, + shadow_end, GFP_KERNEL, + PAGE_KERNEL, VM_NO_GUARD, + pfn_to_nid(mem_data->start_pfn), + __builtin_return_address(0)); + if (!ret) + return NOTIFY_BAD; + + kmemleak_ignore(ret); + return NOTIFY_OK; + } + case MEM_OFFLINE: + vfree((void *)shadow_start); + } + + return NOTIFY_OK; } static int __init kasan_memhotplug_init(void) { - pr_info("WARNING: KASAN doesn't support memory hot-add\n"); - pr_info("Memory hot-add will be disabled\n"); - hotplug_memory_notifier(kasan_mem_notifier, 0); return 0; -- 2.13.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi0-f72.google.com (mail-oi0-f72.google.com [209.85.218.72]) by kanga.kvack.org (Postfix) with ESMTP id 206726B02F4 for ; Thu, 1 Jun 2017 12:22:26 -0400 (EDT) Received: by mail-oi0-f72.google.com with SMTP id f124so51139036oia.14 for ; Thu, 01 Jun 2017 09:22:26 -0700 (PDT) Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-eopbgr50111.outbound.protection.outlook.com. [40.107.5.111]) by mx.google.com with ESMTPS id n130si8445866oib.181.2017.06.01.09.22.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Jun 2017 09:22:24 -0700 (PDT) From: Andrey Ryabinin Subject: [PATCH 4/4] mm/kasan: Add support for memory hotplug Date: Thu, 1 Jun 2017 19:23:38 +0300 Message-ID: <20170601162338.23540-4-aryabinin@virtuozzo.com> In-Reply-To: <20170601162338.23540-1-aryabinin@virtuozzo.com> References: <20170601162338.23540-1-aryabinin@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain Sender: owner-linux-mm@kvack.org List-ID: To: Andrew Morton Cc: Alexander Potapenko , Dmitry Vyukov , kasan-dev@googlegroups.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Ryabinin KASAN doesn't happen work with memory hotplug because hotplugged memory doesn't have any shadow memory. So any access to hotplugged memory would cause a crash on shadow check. Use memory hotplug notifier to allocate and map shadow memory when the hotplugged memory is going online and free shadow after the memory offlined. Signed-off-by: Andrey Ryabinin --- mm/Kconfig | 1 - mm/kasan/kasan.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/mm/Kconfig b/mm/Kconfig index f1fbde17d45d..c8df94059974 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -161,7 +161,6 @@ config MEMORY_HOTPLUG bool "Allow for memory hot-add" depends on SPARSEMEM || X86_64_ACPI_NUMA depends on ARCH_ENABLE_MEMORY_HOTPLUG - depends on COMPILE_TEST || !KASAN config MEMORY_HOTPLUG_SPARSE def_bool y diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index e6fe07a98677..ca11bc4ce205 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c @@ -737,17 +737,47 @@ void __asan_unpoison_stack_memory(const void *addr, size_t size) EXPORT_SYMBOL(__asan_unpoison_stack_memory); #ifdef CONFIG_MEMORY_HOTPLUG -static int kasan_mem_notifier(struct notifier_block *nb, +static int __meminit kasan_mem_notifier(struct notifier_block *nb, unsigned long action, void *data) { - return (action == MEM_GOING_ONLINE) ? NOTIFY_BAD : NOTIFY_OK; + struct memory_notify *mem_data = data; + unsigned long nr_shadow_pages, start_kaddr, shadow_start; + unsigned long shadow_end, shadow_size; + + nr_shadow_pages = mem_data->nr_pages >> KASAN_SHADOW_SCALE_SHIFT; + start_kaddr = (unsigned long)pfn_to_kaddr(mem_data->start_pfn); + shadow_start = (unsigned long)kasan_mem_to_shadow((void *)start_kaddr); + shadow_size = nr_shadow_pages << PAGE_SHIFT; + shadow_end = shadow_start + shadow_size; + + if (WARN_ON(mem_data->nr_pages % KASAN_SHADOW_SCALE_SIZE) || + WARN_ON(start_kaddr % (KASAN_SHADOW_SCALE_SIZE << PAGE_SHIFT))) + return NOTIFY_BAD; + + switch (action) { + case MEM_GOING_ONLINE: { + void *ret; + + ret = __vmalloc_node_range(shadow_size, PAGE_SIZE, shadow_start, + shadow_end, GFP_KERNEL, + PAGE_KERNEL, VM_NO_GUARD, + pfn_to_nid(mem_data->start_pfn), + __builtin_return_address(0)); + if (!ret) + return NOTIFY_BAD; + + kmemleak_ignore(ret); + return NOTIFY_OK; + } + case MEM_OFFLINE: + vfree((void *)shadow_start); + } + + return NOTIFY_OK; } static int __init kasan_memhotplug_init(void) { - pr_info("WARNING: KASAN doesn't support memory hot-add\n"); - pr_info("Memory hot-add will be disabled\n"); - hotplug_memory_notifier(kasan_mem_notifier, 0); return 0; -- 2.13.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org