mm: use vma_init() to initialize VMAs on stack and data segments
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Thu, 26 Jul 2018 23:37:30 +0000 (16:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 Jul 2018 02:38:03 +0000 (19:38 -0700)
Make sure to initialize all VMAs properly, not only those which come
from vm_area_cachep.

Link: http://lkml.kernel.org/r/20180724121139.62570-3-kirill.shutemov@linux.intel.com
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/arm/kernel/process.c
arch/arm/mach-rpc/ecard.c
arch/arm64/include/asm/tlb.h
arch/arm64/mm/hugetlbpage.c
arch/ia64/include/asm/tlb.h
arch/ia64/mm/init.c
arch/x86/um/mem_32.c
fs/hugetlbfs/inode.c
mm/mempolicy.c
mm/shmem.c

index 225d1c58d2de98d5c4a92de4905052203f1e25b6..d9c2991331111617cc3fce04f38fe17fd1a78f6d 100644 (file)
@@ -338,6 +338,7 @@ static struct vm_area_struct gate_vma = {
 
 static int __init gate_vma_init(void)
 {
+       vma_init(&gate_vma, NULL);
        gate_vma.vm_page_prot = PAGE_READONLY_EXEC;
        return 0;
 }
index 39aef4876ed41346b81ef0d79d4657e8b93fd208..8db62cc54a6acec02fd8a8da6c844de77b8c4b75 100644 (file)
@@ -237,8 +237,8 @@ static void ecard_init_pgtables(struct mm_struct *mm)
 
        memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE));
 
+       vma_init(&vma, mm);
        vma.vm_flags = VM_EXEC;
-       vma.vm_mm = mm;
 
        flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE);
        flush_tlb_range(&vma, EASI_START, EASI_START + EASI_SIZE);
index ffdaea7954bb620daf19aba8b855d4c04b1a33c1..d87f2d646caaaa2dfea2fb7dbec6a6ab45f40877 100644 (file)
@@ -37,7 +37,9 @@ static inline void __tlb_remove_table(void *_table)
 
 static inline void tlb_flush(struct mmu_gather *tlb)
 {
-       struct vm_area_struct vma = { .vm_mm = tlb->mm, };
+       struct vm_area_struct vma;
+
+       vma_init(&vma, tlb->mm);
 
        /*
         * The ASID allocator will either invalidate the ASID or mark
index ecc6818191df961eac49e6ca0c7d8b8d38d0c855..1854e49aa18a7600657c5b70741f56f35f3f4de5 100644 (file)
@@ -108,11 +108,13 @@ static pte_t get_clear_flush(struct mm_struct *mm,
                             unsigned long pgsize,
                             unsigned long ncontig)
 {
-       struct vm_area_struct vma = { .vm_mm = mm };
+       struct vm_area_struct vma;
        pte_t orig_pte = huge_ptep_get(ptep);
        bool valid = pte_valid(orig_pte);
        unsigned long i, saddr = addr;
 
+       vma_init(&vma, mm);
+
        for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) {
                pte_t pte = ptep_get_and_clear(mm, addr, ptep);
 
@@ -145,9 +147,10 @@ static void clear_flush(struct mm_struct *mm,
                             unsigned long pgsize,
                             unsigned long ncontig)
 {
-       struct vm_area_struct vma = { .vm_mm = mm };
+       struct vm_area_struct vma;
        unsigned long i, saddr = addr;
 
+       vma_init(&vma, mm);
        for (i = 0; i < ncontig; i++, addr += pgsize, ptep++)
                pte_clear(mm, addr, ptep);
 
index 44f0ac0df30823d49807d91c4234c6556d0a885b..db89e7306081853277ecea3cb502e10c2d80e4d5 100644 (file)
@@ -120,7 +120,7 @@ ia64_tlb_flush_mmu_tlbonly(struct mmu_gather *tlb, unsigned long start, unsigned
                 */
                struct vm_area_struct vma;
 
-               vma.vm_mm = tlb->mm;
+               vma_init(&vma, tlb->mm);
                /* flush the address range from the tlb: */
                flush_tlb_range(&vma, start, end);
                /* now flush the virt. page-table area mapping the address range: */
index bdb14a3691370c339a538e844847f2b252ae683e..e6c6dfd98de29e021b498683b0a460a03ecb6ff9 100644 (file)
@@ -273,7 +273,7 @@ static struct vm_area_struct gate_vma;
 
 static int __init gate_vma_init(void)
 {
-       gate_vma.vm_mm = NULL;
+       vma_init(&gate_vma, NULL);
        gate_vma.vm_start = FIXADDR_USER_START;
        gate_vma.vm_end = FIXADDR_USER_END;
        gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;
index 744afdc18cf3a0ee8fab8624520fa8b2db2d2fd5..56c44d865f7bedb628aba3f0de218a1b5dcb9ccd 100644 (file)
@@ -16,7 +16,7 @@ static int __init gate_vma_init(void)
        if (!FIXADDR_USER_START)
                return 0;
 
-       gate_vma.vm_mm = NULL;
+       vma_init(&gate_vma, NULL);
        gate_vma.vm_start = FIXADDR_USER_START;
        gate_vma.vm_end = FIXADDR_USER_END;
        gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;
index d508c7844681fb4427ed8f66e2886cd9f39acbad..40d4c66c7751dd895302f42e4ec0d4bc60c1f87b 100644 (file)
@@ -411,6 +411,7 @@ static void remove_inode_hugepages(struct inode *inode, loff_t lstart,
        bool truncate_op = (lend == LLONG_MAX);
 
        memset(&pseudo_vma, 0, sizeof(struct vm_area_struct));
+       vma_init(&pseudo_vma, current->mm);
        pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED);
        pagevec_init(&pvec);
        next = start;
@@ -595,6 +596,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
         * as input to create an allocation policy.
         */
        memset(&pseudo_vma, 0, sizeof(struct vm_area_struct));
+       vma_init(&pseudo_vma, mm);
        pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED);
        pseudo_vma.vm_file = file;
 
index 9ac49ef17b4e1e5128f3db38e0a97bbc067ed1b9..01f1a14facc461c4ca5490adc4060d50887aa053 100644 (file)
@@ -2505,6 +2505,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol)
 
                /* Create pseudo-vma that contains just the policy */
                memset(&pvma, 0, sizeof(struct vm_area_struct));
+               vma_init(&pvma, NULL);
                pvma.vm_end = TASK_SIZE;        /* policy covers entire file */
                mpol_set_shared_policy(sp, &pvma, new); /* adds ref */
 
index 2cab8440305531f8ab97f3a56c95b91516bcd2ea..41b9bbf24e16b49db1da4be286fe7310941ad542 100644 (file)
@@ -1421,6 +1421,7 @@ static void shmem_pseudo_vma_init(struct vm_area_struct *vma,
 {
        /* Create a pseudo vma that just contains the policy */
        memset(vma, 0, sizeof(*vma));
+       vma_init(vma, NULL);
        /* Bias interleave by inode number to distribute better across nodes */
        vma->vm_pgoff = index + info->vfs_inode.i_ino;
        vma->vm_policy = mpol_shared_policy_lookup(&info->policy, index);