From patchwork Tue Dec 27 09:26:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Shixin X-Patchwork-Id: 13082151 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0E99C46467 for ; Tue, 27 Dec 2022 08:40:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D31908E0002; Tue, 27 Dec 2022 03:40:42 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id CBA778E0001; Tue, 27 Dec 2022 03:40:42 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B5AF48E0002; Tue, 27 Dec 2022 03:40:42 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id A2C248E0001 for ; Tue, 27 Dec 2022 03:40:42 -0500 (EST) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 6EE2E140B8E for ; Tue, 27 Dec 2022 08:40:42 +0000 (UTC) X-FDA: 80287440324.02.6F3C7B8 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf11.hostedemail.com (Postfix) with ESMTP id 41C3C40007 for ; Tue, 27 Dec 2022 08:40:38 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf11.hostedemail.com: domain of liushixin2@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=liushixin2@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1672130440; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references; bh=H425V67LeGiN22+I9QRv8JYpAh6dTKOLjUitzAE7D4k=; b=QZ+Jii/cUwqwmc3bMTg0mdhuRVH9Zq1V6VKWXrSdHTeWDR9faLyV43WhRXAk8Ii08o832Z x5WK79FUjyh5YhgLgVt3n+O3tU+Vk89UcFpYAv4ISkwKD1QPk9zFlmDHxe59gOgqnpNP2S xI4HDaIYzcxp/YG50G3xtoglfLOuD9E= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf11.hostedemail.com: domain of liushixin2@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=liushixin2@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1672130440; a=rsa-sha256; cv=none; b=8nMuyisqEziCIlPGqn6rnYtl6VkV8HrYvfTBDF9w+06D1nNk1TClCiTcPEHjlHuRhOMqeQ 3ZaAqGU3dmuQUduJX0+QUTxBgp3Nw/WABvo0fvFDWWfP+aU7ce4fx43wcIu1Orh0aojIDd mUUFhtX5WRwyAA/AepC1cgy41bWrCYY= Received: from dggpemm100009.china.huawei.com (unknown [172.30.72.53]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Nh7KG5YD5zkWpv; Tue, 27 Dec 2022 16:36:02 +0800 (CST) Received: from huawei.com (10.175.113.32) by dggpemm100009.china.huawei.com (7.185.36.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Tue, 27 Dec 2022 16:40:33 +0800 From: Liu Shixin To: Catalin Marinas , Will Deacon , Andrew Morton , Uladzislau Rezki , Christoph Hellwig CC: , , , Liu Shixin Subject: [PATCH RFC] arm64/vmalloc: use module region only for module_alloc() if CONFIG_RANDOMIZE_BASE is set Date: Tue, 27 Dec 2022 17:26:34 +0800 Message-ID: <20221227092634.445212-1-liushixin2@huawei.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Originating-IP: [10.175.113.32] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpemm100009.china.huawei.com (7.185.36.113) X-CFilter-Loop: Reflected X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 41C3C40007 X-Stat-Signature: docneih9b6tztauhhx8kx8wmqpux78gy X-HE-Tag: 1672130438-874348 X-HE-Meta: U2FsdGVkX1+m3hS07VUhObwhmEKzBmtOSUXJqBE38EqvrcznAar/gYt//85AEVAXYnMP7rQcOZdGXqv4z67i5nDZmpZ5qudY/8JvYa+G9vlluZ7DNZdZS6xteRnkQdDErpaWufMwf7G5o+o3hqSPy50ygu/mInEwaUz58FlLPniB2+1L3ELrHc96Ssy9976/yrYd2ouxp3qadZQi5AZYWbnCQdrQgr3z1vW0lMyCkk9T91Z0ppEksYQ2WRQi1vi0WvVo3kxoacbF0d1zd8lQpcdm3MtD/PjhwfYyxdDFQPSlQ5rG0i4esOJTbMBi9TRa9OZ4kZz43ddHGtWN2meOToZQyNFRKUYYctX123FPSgG3oi/ZeCSg46L6C4caX9/nhNmcOcE0te1uMjPBlPmP2TlJcPhnANlLel1fdkqayKJEfWN0+8bpy7GZ/CGNyXDqIaqoFsIgbKpD1ENGGo2acRfmXz6zxMacTfnwT3ij0fOVz73hEK4mXk7qGfxSlfFT59E9DYngCYPGbAV0YmBXzhFwNBo00kWJdgkhTxEuCVfb8EEMEPP/jhe7j63tiarZBdKT6QRXK7USKQ1iDTMsJwjahi/va3aqY9m7Uc/SWllJbMYXgmCJcjKFAOMAaAM1NEkJAiAgaH7j0WQ89HElE4MLhi47qh/goTTE1J1KJbJ6wZ7MlVc2p14BzeiGllveSnHeNU/LYO8C4PaOuNlBi/NOM5/Z8Bq1Fx6rTJgnVnBWWcAJSt2DZ1pNUO0U31vZtaxFX5BHHauYzSc/gB6rs0OCCF2usTHKX+IjkI4N9KgSzfPWhvWS5PZCS3+bqvjoGnB12nbnCzpWT7CzHAwsVrtmaqaXKEnRsxEM6U0jk0/OTrYKDmsLl4sm4VT099kGFbW1Q9iUIBeO7ajMcjmCMoi8wlttVgqP X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: After I add a 10GB pmem device, I got the following error message when insert module: insmod: vmalloc error: size 16384, vm_struct allocation failed, mode:0xcc0(GFP_KERNEL), nodemask=(null),cpuset=/,mems_allowed=0 If CONFIG_RANDOMIZE_BASE is set, the module region can be located in the vmalloc region entirely. Although module_alloc() can fall back to a 2GB window if ARM64_MODULE_PLTS is set, the module region is still easily exhausted because the module region is located at bottom of vmalloc region and the vmalloc region is allocated from bottom to top. Skip module region if not calling from module_alloc(). Signed-off-by: Liu Shixin Acked-by: Andrew Morton --- arch/arm64/include/asm/vmalloc.h | 26 ++++++++++++++++++++++++++ include/linux/vmalloc.h | 9 +++++++++ mm/vmalloc.c | 4 ++++ 3 files changed, 39 insertions(+) diff --git a/arch/arm64/include/asm/vmalloc.h b/arch/arm64/include/asm/vmalloc.h index 38fafffe699f..4feff546b11b 100644 --- a/arch/arm64/include/asm/vmalloc.h +++ b/arch/arm64/include/asm/vmalloc.h @@ -31,4 +31,30 @@ static inline pgprot_t arch_vmap_pgprot_tagged(pgprot_t prot) return pgprot_tagged(prot); } +#ifdef CONFIG_RANDOMIZE_BASE +extern u64 module_alloc_base; +#define arch_vmap_skip_module_region arch_vmap_skip_module_region +static inline void arch_vmap_skip_module_region(unsigned long *addr, + unsigned long vstart, + unsigned long size, + unsigned long align) +{ + u64 module_alloc_end = module_alloc_base + MODULES_VSIZE; + + if (vstart == module_alloc_base) + return; + + if (IS_ENABLED(CONFIG_KASAN_GENERIC) || + IS_ENABLED(CONFIG_KASAN_SW_TAGS)) + /* don't exceed the static module region - see module_alloc() */ + module_alloc_end = MODULES_END; + + if ((module_alloc_base >= *addr + size) || + (module_alloc_end <= *addr)) + return; + + *addr = ALIGN(module_alloc_end, align); +} +#endif + #endif /* _ASM_ARM64_VMALLOC_H */ diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 096d48aa3437..55ef97325b84 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -122,6 +122,15 @@ static inline pgprot_t arch_vmap_pgprot_tagged(pgprot_t prot) } #endif +#ifndef arch_vmap_skip_module_region +static inline void arch_vmap_skip_module_region(unsigned long *addr, + unsigned long vstart, + unsigned long size, + unsigned long align) +{ +} +#endif + /* * Highlevel APIs for driver use */ diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ca71de7c9d77..c840d673052e 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1236,6 +1236,8 @@ is_within_this_va(struct vmap_area *va, unsigned long size, else nva_start_addr = ALIGN(vstart, align); + arch_vmap_skip_module_region(&nva_start_addr, vstart, size, align); + /* Can be overflowed due to big size or alignment. */ if (nva_start_addr + size < nva_start_addr || nva_start_addr < vstart) @@ -1523,6 +1525,8 @@ __alloc_vmap_area(struct rb_root *root, struct list_head *head, else nva_start_addr = ALIGN(vstart, align); + arch_vmap_skip_module_region(&nva_start_addr, vstart, size, align); + /* Check the "vend" restriction. */ if (nva_start_addr + size > vend) return vend;