Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966632AbbBCRqN (ORCPT ); Tue, 3 Feb 2015 12:46:13 -0500 Received: from mailout3.w1.samsung.com ([210.118.77.13]:52621 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966472AbbBCRns (ORCPT ); Tue, 3 Feb 2015 12:43:48 -0500 X-AuditID: cbfec7f5-b7fc86d0000066b7-b5-54d10840b132 From: Andrey Ryabinin To: linux-kernel@vger.kernel.org Cc: Andrey Ryabinin , Dmitry Vyukov , Konstantin Serebryany , Dmitry Chernenkov , Andrey Konovalov , Yuri Gribov , Konstantin Khlebnikov , Sasha Levin , Christoph Lameter , Joonsoo Kim , Andrew Morton , Dave Hansen , Andi Kleen , x86@kernel.org, linux-mm@kvack.org Subject: [PATCH v11 15/19] mm: vmalloc: add flag preventing guard hole allocation Date: Tue, 03 Feb 2015 20:43:08 +0300 Message-id: <1422985392-28652-16-git-send-email-a.ryabinin@samsung.com> X-Mailer: git-send-email 2.2.2 In-reply-to: <1422985392-28652-1-git-send-email-a.ryabinin@samsung.com> References: <1404905415-9046-1-git-send-email-a.ryabinin@samsung.com> <1422985392-28652-1-git-send-email-a.ryabinin@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCLMWRmVeSWpSXmKPExsVy+t/xK7oOHBdDDOZ0W1ps+/WIzeL33pms FnPWr2GzOHLtO7vF9W9vGC0+vXzAaPH84UN2iwkP29gtVnY3s1lsf/aWyWJl5wNWi8u75rBZ 3Fvzn9Vi8ZHbzBbvnk1mtvix4TGrg4DH/J0fGT12zrrL7rFgU6nH4j0vmTw2repk89j0aRK7 R9fbK0weJ2b8ZvF4cmU6k8fHp7dYPPq2rGL0+LxJLoAnissmJTUnsyy1SN8ugSvj9qsJTAXX hCqOHlRqYOzl72Lk5JAQMJFoWNHODmGLSVy4t56ti5GLQ0hgKaNE2++ZjBBOH5PE9f+PwKrY BPQk/s3azgZiiwgoSGzufcYKUsQssIJF4su1FYwgCWGBYInOay+ZQGwWAVWJUwdWAzVzcPAK uEsse10OYkoIyElc+BgPUsEJFN3X/wxqVxOjxJvFLcwTGHkXMDKsYhRNLU0uKE5KzzXSK07M LS7NS9dLzs/dxAgJ+a87GJceszrEKMDBqMTDq/HuQogQa2JZcWXuIUYJDmYlEd49v4FCvCmJ lVWpRfnxRaU5qcWHGJk4OKUaGGWELz4PaNL+IC3qws/AvfvjulKt0w+OH9SIf7Dn1nHrk3xF 0uubVd6Gzjq+WnbhpG/OWzL6vcWDq9WWRoismBTwOl391rqZJqHTbsyR/rvnnIcw409PZscz c6NmnJFZ/Lgm4NYZhd/Td3v6XQ3/yB5qfFitam95d/v0zvU7Xky74Lg4OPDkKhUlluKMREMt 5qLiRACimVuKVwIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2567 Lines: 73 For instrumenting global variables KASan will shadow memory backing memory for modules. So on module loading we will need to allocate memory for shadow and map it at address in shadow that corresponds to the address allocated in module_alloc(). __vmalloc_node_range() could be used for this purpose, except it puts a guard hole after allocated area. Guard hole in shadow memory should be a problem because at some future point we might need to have a shadow memory at address occupied by guard hole. So we could fail to allocate shadow for module_alloc(). Add a new vm_struct flag 'VM_NO_GUARD' indicating that vm area doesn't have a guard hole. Signed-off-by: Andrey Ryabinin --- include/linux/vmalloc.h | 9 +++++++-- mm/vmalloc.c | 6 ++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index b87696f..1526fe7 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -16,6 +16,7 @@ struct vm_area_struct; /* vma defining user mapping in mm_types.h */ #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ #define VM_VPAGES 0x00000010 /* buffer for pages was vmalloc'ed */ #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ +#define VM_NO_GUARD 0x00000040 /* don't add guard page */ /* bits [20..32] reserved for arch specific ioremap internals */ /* @@ -96,8 +97,12 @@ void vmalloc_sync_all(void); static inline size_t get_vm_area_size(const struct vm_struct *area) { - /* return actual size without guard page */ - return area->size - PAGE_SIZE; + if (!(area->flags & VM_NO_GUARD)) + /* return actual size without guard page */ + return area->size - PAGE_SIZE; + else + return area->size; + } extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags); diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 39c3388..2e74e99 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1324,10 +1324,8 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, if (unlikely(!area)) return NULL; - /* - * We always allocate a guard page. - */ - size += PAGE_SIZE; + if (!(flags & VM_NO_GUARD)) + size += PAGE_SIZE; va = alloc_vmap_area(size, align, start, end, node, gfp_mask); if (IS_ERR(va)) { -- 2.2.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/