From 9e926a0724aac3acaf385e3f60c7730c63023876 Mon Sep 17 00:00:00 2001 From: Mike Kravetz Date: Thu, 14 Jan 2016 15:52:25 -0800 Subject: [PATCH] userfaultfd: add vm_userfaultfd_ctx to the vm_area_struct Orabug: 21685254 This adds the vm_userfaultfd_ctx to the vm_area_struct. Oracle specific changes to maintain KABI also made. Signed-off-by: Andrea Arcangeli Acked-by: Pavel Emelyanov Cc: Sanidhya Kashyap Cc: zhang.zhanghailiang@huawei.com Cc: "Kirill A. Shutemov" Cc: Andres Lagar-Cavilla Cc: Dave Hansen Cc: Paolo Bonzini Cc: Rik van Riel Cc: Mel Gorman Cc: Andy Lutomirski Cc: Hugh Dickins Cc: Peter Feiner Cc: "Dr. David Alan Gilbert" Cc: Johannes Weiner Cc: "Huangpeng (Peter)" Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds (cherry picked from commit 745f234be12b6191b15eae8dd415cc81a9137f47) Signed-off-by: Mike Kravetz Reviewed-by: Nitin Gupta Reviewed-by: Dhaval Giani Signed-off-by: Dhaval Giani Conflicts: include/linux/mm_types.h --- include/linux/mm_types.h | 32 ++++++++++++++++++++++++++++++++ kernel/fork.c | 1 + mm/mm_init.c | 8 ++++++++ 3 files changed, 41 insertions(+) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 8d37e26a1007..c03e144cdae9 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -247,6 +247,16 @@ struct vm_region { * this region */ }; +#ifdef CONFIG_USERFAULTFD +#define NULL_VM_UFFD_CTX ((struct vm_userfaultfd_ctx) { NULL, }) +struct vm_userfaultfd_ctx { + struct userfaultfd_ctx *ctx; +}; +#else /* CONFIG_USERFAULTFD */ +#define NULL_VM_UFFD_CTX ((struct vm_userfaultfd_ctx) {}) +struct vm_userfaultfd_ctx {}; +#endif /* CONFIG_USERFAULTFD */ + /* * This struct defines a memory VMM memory area. There is one of these * per VM-area/task. A VM area is any part of the process virtual memory @@ -313,8 +323,30 @@ struct vm_area_struct { #ifdef CONFIG_NUMA struct mempolicy *vm_policy; /* NUMA policy for the VMA */ #endif + + /* Oracle inc use only + * The following padding has been inserted before ABI freeze to + * allow extending the structure while preserving ABI. + */ +#ifndef __GENKSYMS__ + /* userfaultfd feature using UEK_KABI_RESERVED(1) */ + union { + UEK_KABI_RESERVED(1) + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; + }; +#else + UEK_KABI_RESERVED(1) +#endif + UEK_KABI_RESERVED(2) }; +/* + * Make sure the size of struct vm_userfaultfd_ctx is not greater than + * the size UEK_KABI_RESERVED. They are in an unnamed union. + */ +#define CHECK_VM_AREA_STRUCT_RESERVED_UNION_SIZE_1() \ + BUILD_BUG_ON(sizeof(struct vm_userfaultfd_ctx) > sizeof(unsigned long)) + struct core_thread { struct task_struct *task; struct core_thread *next; diff --git a/kernel/fork.c b/kernel/fork.c index 03c1eaaa6ef5..ba3ef5077455 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -451,6 +451,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) goto fail_nomem_anon_vma_fork; tmp->vm_flags &= ~VM_LOCKED; tmp->vm_next = tmp->vm_prev = NULL; + tmp->vm_userfaultfd_ctx = NULL_VM_UFFD_CTX; file = tmp->vm_file; if (file) { struct inode *inode = file_inode(file); diff --git a/mm/mm_init.c b/mm/mm_init.c index 5f420f7fafa1..6330dc24e78c 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -203,3 +203,11 @@ static int __init mm_sysfs_init(void) return 0; } postcore_initcall(mm_sysfs_init); + +static int __init mm_build_check(void) +{ + CHECK_VM_AREA_STRUCT_RESERVED_UNION_SIZE_1(); + + return 0; +} +core_initcall(mm_build_check); -- 2.50.1