diff options
| -rw-r--r-- | arch/arm/kernel/process.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-rpc/ecard.c | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/tlb.h | 4 | ||||
| -rw-r--r-- | arch/arm64/mm/hugetlbpage.c | 7 | ||||
| -rw-r--r-- | arch/ia64/include/asm/tlb.h | 2 | ||||
| -rw-r--r-- | arch/ia64/mm/init.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/x86/um/mem_32.c | 2 | ||||
| -rw-r--r-- | drivers/char/mem.c | 1 | ||||
| -rw-r--r-- | fs/exec.c | 1 | ||||
| -rw-r--r-- | fs/hugetlbfs/inode.c | 2 | ||||
| -rw-r--r-- | include/linux/delayacct.h | 2 | ||||
| -rw-r--r-- | include/linux/eventfd.h | 1 | ||||
| -rw-r--r-- | include/linux/mm.h | 14 | ||||
| -rw-r--r-- | ipc/sem.c | 2 | ||||
| -rw-r--r-- | kernel/fork.c | 6 | ||||
| -rw-r--r-- | kernel/memremap.c | 22 | ||||
| -rw-r--r-- | lib/Kconfig.kasan | 2 | ||||
| -rw-r--r-- | mm/mempolicy.c | 1 | ||||
| -rw-r--r-- | mm/mmap.c | 3 | ||||
| -rw-r--r-- | mm/nommu.c | 2 | ||||
| -rw-r--r-- | mm/shmem.c | 1 | ||||
| -rw-r--r-- | mm/zswap.c | 9 |
23 files changed, 73 insertions, 18 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 225d1c58d2de..d9c299133111 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
| @@ -338,6 +338,7 @@ static struct vm_area_struct gate_vma = { | |||
| 338 | 338 | ||
| 339 | static int __init gate_vma_init(void) | 339 | static int __init gate_vma_init(void) |
| 340 | { | 340 | { |
| 341 | vma_init(&gate_vma, NULL); | ||
| 341 | gate_vma.vm_page_prot = PAGE_READONLY_EXEC; | 342 | gate_vma.vm_page_prot = PAGE_READONLY_EXEC; |
| 342 | return 0; | 343 | return 0; |
| 343 | } | 344 | } |
diff --git a/arch/arm/mach-rpc/ecard.c b/arch/arm/mach-rpc/ecard.c index 39aef4876ed4..8db62cc54a6a 100644 --- a/arch/arm/mach-rpc/ecard.c +++ b/arch/arm/mach-rpc/ecard.c | |||
| @@ -237,8 +237,8 @@ static void ecard_init_pgtables(struct mm_struct *mm) | |||
| 237 | 237 | ||
| 238 | memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); | 238 | memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); |
| 239 | 239 | ||
| 240 | vma_init(&vma, mm); | ||
| 240 | vma.vm_flags = VM_EXEC; | 241 | vma.vm_flags = VM_EXEC; |
| 241 | vma.vm_mm = mm; | ||
| 242 | 242 | ||
| 243 | flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE); | 243 | flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE); |
| 244 | flush_tlb_range(&vma, EASI_START, EASI_START + EASI_SIZE); | 244 | flush_tlb_range(&vma, EASI_START, EASI_START + EASI_SIZE); |
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h index ffdaea7954bb..d87f2d646caa 100644 --- a/arch/arm64/include/asm/tlb.h +++ b/arch/arm64/include/asm/tlb.h | |||
| @@ -37,7 +37,9 @@ static inline void __tlb_remove_table(void *_table) | |||
| 37 | 37 | ||
| 38 | static inline void tlb_flush(struct mmu_gather *tlb) | 38 | static inline void tlb_flush(struct mmu_gather *tlb) |
| 39 | { | 39 | { |
| 40 | struct vm_area_struct vma = { .vm_mm = tlb->mm, }; | 40 | struct vm_area_struct vma; |
| 41 | |||
| 42 | vma_init(&vma, tlb->mm); | ||
| 41 | 43 | ||
| 42 | /* | 44 | /* |
| 43 | * The ASID allocator will either invalidate the ASID or mark | 45 | * The ASID allocator will either invalidate the ASID or mark |
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c index ecc6818191df..1854e49aa18a 100644 --- a/arch/arm64/mm/hugetlbpage.c +++ b/arch/arm64/mm/hugetlbpage.c | |||
| @@ -108,11 +108,13 @@ static pte_t get_clear_flush(struct mm_struct *mm, | |||
| 108 | unsigned long pgsize, | 108 | unsigned long pgsize, |
| 109 | unsigned long ncontig) | 109 | unsigned long ncontig) |
| 110 | { | 110 | { |
| 111 | struct vm_area_struct vma = { .vm_mm = mm }; | 111 | struct vm_area_struct vma; |
| 112 | pte_t orig_pte = huge_ptep_get(ptep); | 112 | pte_t orig_pte = huge_ptep_get(ptep); |
| 113 | bool valid = pte_valid(orig_pte); | 113 | bool valid = pte_valid(orig_pte); |
| 114 | unsigned long i, saddr = addr; | 114 | unsigned long i, saddr = addr; |
| 115 | 115 | ||
| 116 | vma_init(&vma, mm); | ||
| 117 | |||
| 116 | for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) { | 118 | for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) { |
| 117 | pte_t pte = ptep_get_and_clear(mm, addr, ptep); | 119 | pte_t pte = ptep_get_and_clear(mm, addr, ptep); |
| 118 | 120 | ||
| @@ -145,9 +147,10 @@ static void clear_flush(struct mm_struct *mm, | |||
| 145 | unsigned long pgsize, | 147 | unsigned long pgsize, |
| 146 | unsigned long ncontig) | 148 | unsigned long ncontig) |
| 147 | { | 149 | { |
| 148 | struct vm_area_struct vma = { .vm_mm = mm }; | 150 | struct vm_area_struct vma; |
| 149 | unsigned long i, saddr = addr; | 151 | unsigned long i, saddr = addr; |
| 150 | 152 | ||
| 153 | vma_init(&vma, mm); | ||
| 151 | for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) | 154 | for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) |
| 152 | pte_clear(mm, addr, ptep); | 155 | pte_clear(mm, addr, ptep); |
| 153 | 156 | ||
diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index 44f0ac0df308..db89e7306081 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h | |||
| @@ -120,7 +120,7 @@ ia64_tlb_flush_mmu_tlbonly(struct mmu_gather *tlb, unsigned long start, unsigned | |||
| 120 | */ | 120 | */ |
| 121 | struct vm_area_struct vma; | 121 | struct vm_area_struct vma; |
| 122 | 122 | ||
| 123 | vma.vm_mm = tlb->mm; | 123 | vma_init(&vma, tlb->mm); |
| 124 | /* flush the address range from the tlb: */ | 124 | /* flush the address range from the tlb: */ |
| 125 | flush_tlb_range(&vma, start, end); | 125 | flush_tlb_range(&vma, start, end); |
| 126 | /* now flush the virt. page-table area mapping the address range: */ | 126 | /* now flush the virt. page-table area mapping the address range: */ |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index bdb14a369137..e6c6dfd98de2 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
| @@ -273,7 +273,7 @@ static struct vm_area_struct gate_vma; | |||
| 273 | 273 | ||
| 274 | static int __init gate_vma_init(void) | 274 | static int __init gate_vma_init(void) |
| 275 | { | 275 | { |
| 276 | gate_vma.vm_mm = NULL; | 276 | vma_init(&gate_vma, NULL); |
| 277 | gate_vma.vm_start = FIXADDR_USER_START; | 277 | gate_vma.vm_start = FIXADDR_USER_START; |
| 278 | gate_vma.vm_end = FIXADDR_USER_END; | 278 | gate_vma.vm_end = FIXADDR_USER_END; |
| 279 | gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; | 279 | gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index d594690d8b95..6b8f11521c41 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -890,7 +890,7 @@ static int mmu_topup_memory_cache_page(struct kvm_mmu_memory_cache *cache, | |||
| 890 | if (cache->nobjs >= min) | 890 | if (cache->nobjs >= min) |
| 891 | return 0; | 891 | return 0; |
| 892 | while (cache->nobjs < ARRAY_SIZE(cache->objects)) { | 892 | while (cache->nobjs < ARRAY_SIZE(cache->objects)) { |
| 893 | page = (void *)__get_free_page(GFP_KERNEL); | 893 | page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT); |
| 894 | if (!page) | 894 | if (!page) |
| 895 | return -ENOMEM; | 895 | return -ENOMEM; |
| 896 | cache->objects[cache->nobjs++] = page; | 896 | cache->objects[cache->nobjs++] = page; |
diff --git a/arch/x86/um/mem_32.c b/arch/x86/um/mem_32.c index 744afdc18cf3..56c44d865f7b 100644 --- a/arch/x86/um/mem_32.c +++ b/arch/x86/um/mem_32.c | |||
| @@ -16,7 +16,7 @@ static int __init gate_vma_init(void) | |||
| 16 | if (!FIXADDR_USER_START) | 16 | if (!FIXADDR_USER_START) |
| 17 | return 0; | 17 | return 0; |
| 18 | 18 | ||
| 19 | gate_vma.vm_mm = NULL; | 19 | vma_init(&gate_vma, NULL); |
| 20 | gate_vma.vm_start = FIXADDR_USER_START; | 20 | gate_vma.vm_start = FIXADDR_USER_START; |
| 21 | gate_vma.vm_end = FIXADDR_USER_END; | 21 | gate_vma.vm_end = FIXADDR_USER_END; |
| 22 | gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; | 22 | gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; |
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index ffeb60d3434c..df66a9dd0aae 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
| @@ -708,6 +708,7 @@ static int mmap_zero(struct file *file, struct vm_area_struct *vma) | |||
| 708 | #endif | 708 | #endif |
| 709 | if (vma->vm_flags & VM_SHARED) | 709 | if (vma->vm_flags & VM_SHARED) |
| 710 | return shmem_zero_setup(vma); | 710 | return shmem_zero_setup(vma); |
| 711 | vma_set_anonymous(vma); | ||
| 711 | return 0; | 712 | return 0; |
| 712 | } | 713 | } |
| 713 | 714 | ||
| @@ -293,6 +293,7 @@ static int __bprm_mm_init(struct linux_binprm *bprm) | |||
| 293 | bprm->vma = vma = vm_area_alloc(mm); | 293 | bprm->vma = vma = vm_area_alloc(mm); |
| 294 | if (!vma) | 294 | if (!vma) |
| 295 | return -ENOMEM; | 295 | return -ENOMEM; |
| 296 | vma_set_anonymous(vma); | ||
| 296 | 297 | ||
| 297 | if (down_write_killable(&mm->mmap_sem)) { | 298 | if (down_write_killable(&mm->mmap_sem)) { |
| 298 | err = -EINTR; | 299 | err = -EINTR; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index d508c7844681..40d4c66c7751 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -411,6 +411,7 @@ static void remove_inode_hugepages(struct inode *inode, loff_t lstart, | |||
| 411 | bool truncate_op = (lend == LLONG_MAX); | 411 | bool truncate_op = (lend == LLONG_MAX); |
| 412 | 412 | ||
| 413 | memset(&pseudo_vma, 0, sizeof(struct vm_area_struct)); | 413 | memset(&pseudo_vma, 0, sizeof(struct vm_area_struct)); |
| 414 | vma_init(&pseudo_vma, current->mm); | ||
| 414 | pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED); | 415 | pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED); |
| 415 | pagevec_init(&pvec); | 416 | pagevec_init(&pvec); |
| 416 | next = start; | 417 | next = start; |
| @@ -595,6 +596,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset, | |||
| 595 | * as input to create an allocation policy. | 596 | * as input to create an allocation policy. |
| 596 | */ | 597 | */ |
| 597 | memset(&pseudo_vma, 0, sizeof(struct vm_area_struct)); | 598 | memset(&pseudo_vma, 0, sizeof(struct vm_area_struct)); |
| 599 | vma_init(&pseudo_vma, mm); | ||
| 598 | pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED); | 600 | pseudo_vma.vm_flags = (VM_HUGETLB | VM_MAYSHARE | VM_SHARED); |
| 599 | pseudo_vma.vm_file = file; | 601 | pseudo_vma.vm_file = file; |
| 600 | 602 | ||
diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index e6c0448ebcc7..31c865d1842e 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h | |||
| @@ -124,7 +124,7 @@ static inline void delayacct_blkio_start(void) | |||
| 124 | 124 | ||
| 125 | static inline void delayacct_blkio_end(struct task_struct *p) | 125 | static inline void delayacct_blkio_end(struct task_struct *p) |
| 126 | { | 126 | { |
| 127 | if (current->delays) | 127 | if (p->delays) |
| 128 | __delayacct_blkio_end(p); | 128 | __delayacct_blkio_end(p); |
| 129 | delayacct_clear_flag(DELAYACCT_PF_BLKIO); | 129 | delayacct_clear_flag(DELAYACCT_PF_BLKIO); |
| 130 | } | 130 | } |
diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h index 7094718b653b..ffcc7724ca21 100644 --- a/include/linux/eventfd.h +++ b/include/linux/eventfd.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/fcntl.h> | 12 | #include <linux/fcntl.h> |
| 13 | #include <linux/wait.h> | 13 | #include <linux/wait.h> |
| 14 | #include <linux/err.h> | ||
| 14 | 15 | ||
| 15 | /* | 16 | /* |
| 16 | * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining | 17 | * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining |
diff --git a/include/linux/mm.h b/include/linux/mm.h index d3a3842316b8..7ba6d356d18f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -452,6 +452,20 @@ struct vm_operations_struct { | |||
| 452 | unsigned long addr); | 452 | unsigned long addr); |
| 453 | }; | 453 | }; |
| 454 | 454 | ||
| 455 | static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) | ||
| 456 | { | ||
| 457 | static const struct vm_operations_struct dummy_vm_ops = {}; | ||
| 458 | |||
| 459 | vma->vm_mm = mm; | ||
| 460 | vma->vm_ops = &dummy_vm_ops; | ||
| 461 | INIT_LIST_HEAD(&vma->anon_vma_chain); | ||
| 462 | } | ||
| 463 | |||
| 464 | static inline void vma_set_anonymous(struct vm_area_struct *vma) | ||
| 465 | { | ||
| 466 | vma->vm_ops = NULL; | ||
| 467 | } | ||
| 468 | |||
| 455 | struct mmu_gather; | 469 | struct mmu_gather; |
| 456 | struct inode; | 470 | struct inode; |
| 457 | 471 | ||
| @@ -2118,7 +2118,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops, | |||
| 2118 | } | 2118 | } |
| 2119 | 2119 | ||
| 2120 | do { | 2120 | do { |
| 2121 | queue.status = -EINTR; | 2121 | WRITE_ONCE(queue.status, -EINTR); |
| 2122 | queue.sleeper = current; | 2122 | queue.sleeper = current; |
| 2123 | 2123 | ||
| 2124 | __set_current_state(TASK_INTERRUPTIBLE); | 2124 | __set_current_state(TASK_INTERRUPTIBLE); |
diff --git a/kernel/fork.c b/kernel/fork.c index a191c05e757d..1b27babc4c78 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -312,10 +312,8 @@ struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) | |||
| 312 | { | 312 | { |
| 313 | struct vm_area_struct *vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); | 313 | struct vm_area_struct *vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); |
| 314 | 314 | ||
| 315 | if (vma) { | 315 | if (vma) |
| 316 | vma->vm_mm = mm; | 316 | vma_init(vma, mm); |
| 317 | INIT_LIST_HEAD(&vma->anon_vma_chain); | ||
| 318 | } | ||
| 319 | return vma; | 317 | return vma; |
| 320 | } | 318 | } |
| 321 | 319 | ||
diff --git a/kernel/memremap.c b/kernel/memremap.c index 5857267a4af5..38283363da06 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c | |||
| @@ -176,10 +176,27 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) | |||
| 176 | unsigned long pfn, pgoff, order; | 176 | unsigned long pfn, pgoff, order; |
| 177 | pgprot_t pgprot = PAGE_KERNEL; | 177 | pgprot_t pgprot = PAGE_KERNEL; |
| 178 | int error, nid, is_ram; | 178 | int error, nid, is_ram; |
| 179 | struct dev_pagemap *conflict_pgmap; | ||
| 179 | 180 | ||
| 180 | align_start = res->start & ~(SECTION_SIZE - 1); | 181 | align_start = res->start & ~(SECTION_SIZE - 1); |
| 181 | align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) | 182 | align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) |
| 182 | - align_start; | 183 | - align_start; |
| 184 | align_end = align_start + align_size - 1; | ||
| 185 | |||
| 186 | conflict_pgmap = get_dev_pagemap(PHYS_PFN(align_start), NULL); | ||
| 187 | if (conflict_pgmap) { | ||
| 188 | dev_WARN(dev, "Conflicting mapping in same section\n"); | ||
| 189 | put_dev_pagemap(conflict_pgmap); | ||
| 190 | return ERR_PTR(-ENOMEM); | ||
| 191 | } | ||
| 192 | |||
| 193 | conflict_pgmap = get_dev_pagemap(PHYS_PFN(align_end), NULL); | ||
| 194 | if (conflict_pgmap) { | ||
| 195 | dev_WARN(dev, "Conflicting mapping in same section\n"); | ||
| 196 | put_dev_pagemap(conflict_pgmap); | ||
| 197 | return ERR_PTR(-ENOMEM); | ||
| 198 | } | ||
| 199 | |||
| 183 | is_ram = region_intersects(align_start, align_size, | 200 | is_ram = region_intersects(align_start, align_size, |
| 184 | IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); | 201 | IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); |
| 185 | 202 | ||
| @@ -199,7 +216,6 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) | |||
| 199 | 216 | ||
| 200 | mutex_lock(&pgmap_lock); | 217 | mutex_lock(&pgmap_lock); |
| 201 | error = 0; | 218 | error = 0; |
| 202 | align_end = align_start + align_size - 1; | ||
| 203 | 219 | ||
| 204 | foreach_order_pgoff(res, order, pgoff) { | 220 | foreach_order_pgoff(res, order, pgoff) { |
| 205 | error = __radix_tree_insert(&pgmap_radix, | 221 | error = __radix_tree_insert(&pgmap_radix, |
| @@ -305,7 +321,7 @@ EXPORT_SYMBOL_GPL(get_dev_pagemap); | |||
| 305 | 321 | ||
| 306 | #ifdef CONFIG_DEV_PAGEMAP_OPS | 322 | #ifdef CONFIG_DEV_PAGEMAP_OPS |
| 307 | DEFINE_STATIC_KEY_FALSE(devmap_managed_key); | 323 | DEFINE_STATIC_KEY_FALSE(devmap_managed_key); |
| 308 | EXPORT_SYMBOL_GPL(devmap_managed_key); | 324 | EXPORT_SYMBOL(devmap_managed_key); |
| 309 | static atomic_t devmap_enable; | 325 | static atomic_t devmap_enable; |
| 310 | 326 | ||
| 311 | /* | 327 | /* |
| @@ -346,5 +362,5 @@ void __put_devmap_managed_page(struct page *page) | |||
| 346 | } else if (!count) | 362 | } else if (!count) |
| 347 | __put_page(page); | 363 | __put_page(page); |
| 348 | } | 364 | } |
| 349 | EXPORT_SYMBOL_GPL(__put_devmap_managed_page); | 365 | EXPORT_SYMBOL(__put_devmap_managed_page); |
| 350 | #endif /* CONFIG_DEV_PAGEMAP_OPS */ | 366 | #endif /* CONFIG_DEV_PAGEMAP_OPS */ |
diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan index c253c1b46c6b..befb127507c0 100644 --- a/lib/Kconfig.kasan +++ b/lib/Kconfig.kasan | |||
| @@ -5,7 +5,7 @@ if HAVE_ARCH_KASAN | |||
| 5 | 5 | ||
| 6 | config KASAN | 6 | config KASAN |
| 7 | bool "KASan: runtime memory debugger" | 7 | bool "KASan: runtime memory debugger" |
| 8 | depends on SLUB || (SLAB && !DEBUG_SLAB) | 8 | depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB) |
| 9 | select SLUB_DEBUG if SLUB | 9 | select SLUB_DEBUG if SLUB |
| 10 | select CONSTRUCTORS | 10 | select CONSTRUCTORS |
| 11 | select STACKDEPOT | 11 | select STACKDEPOT |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 9ac49ef17b4e..01f1a14facc4 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -2505,6 +2505,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 2505 | 2505 | ||
| 2506 | /* Create pseudo-vma that contains just the policy */ | 2506 | /* Create pseudo-vma that contains just the policy */ |
| 2507 | memset(&pvma, 0, sizeof(struct vm_area_struct)); | 2507 | memset(&pvma, 0, sizeof(struct vm_area_struct)); |
| 2508 | vma_init(&pvma, NULL); | ||
| 2508 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ | 2509 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ |
| 2509 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ | 2510 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ |
| 2510 | 2511 | ||
| @@ -1778,6 +1778,8 @@ unsigned long mmap_region(struct file *file, unsigned long addr, | |||
| 1778 | error = shmem_zero_setup(vma); | 1778 | error = shmem_zero_setup(vma); |
| 1779 | if (error) | 1779 | if (error) |
| 1780 | goto free_vma; | 1780 | goto free_vma; |
| 1781 | } else { | ||
| 1782 | vma_set_anonymous(vma); | ||
| 1781 | } | 1783 | } |
| 1782 | 1784 | ||
| 1783 | vma_link(mm, vma, prev, rb_link, rb_parent); | 1785 | vma_link(mm, vma, prev, rb_link, rb_parent); |
| @@ -2983,6 +2985,7 @@ static int do_brk_flags(unsigned long addr, unsigned long len, unsigned long fla | |||
| 2983 | return -ENOMEM; | 2985 | return -ENOMEM; |
| 2984 | } | 2986 | } |
| 2985 | 2987 | ||
| 2988 | vma_set_anonymous(vma); | ||
| 2986 | vma->vm_start = addr; | 2989 | vma->vm_start = addr; |
| 2987 | vma->vm_end = addr + len; | 2990 | vma->vm_end = addr + len; |
| 2988 | vma->vm_pgoff = pgoff; | 2991 | vma->vm_pgoff = pgoff; |
diff --git a/mm/nommu.c b/mm/nommu.c index 1d22fdbf7d7c..9fc9e43335b6 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
| @@ -1145,6 +1145,8 @@ static int do_mmap_private(struct vm_area_struct *vma, | |||
| 1145 | if (ret < len) | 1145 | if (ret < len) |
| 1146 | memset(base + ret, 0, len - ret); | 1146 | memset(base + ret, 0, len - ret); |
| 1147 | 1147 | ||
| 1148 | } else { | ||
| 1149 | vma_set_anonymous(vma); | ||
| 1148 | } | 1150 | } |
| 1149 | 1151 | ||
| 1150 | return 0; | 1152 | return 0; |
diff --git a/mm/shmem.c b/mm/shmem.c index 2cab84403055..41b9bbf24e16 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -1421,6 +1421,7 @@ static void shmem_pseudo_vma_init(struct vm_area_struct *vma, | |||
| 1421 | { | 1421 | { |
| 1422 | /* Create a pseudo vma that just contains the policy */ | 1422 | /* Create a pseudo vma that just contains the policy */ |
| 1423 | memset(vma, 0, sizeof(*vma)); | 1423 | memset(vma, 0, sizeof(*vma)); |
| 1424 | vma_init(vma, NULL); | ||
| 1424 | /* Bias interleave by inode number to distribute better across nodes */ | 1425 | /* Bias interleave by inode number to distribute better across nodes */ |
| 1425 | vma->vm_pgoff = index + info->vfs_inode.i_ino; | 1426 | vma->vm_pgoff = index + info->vfs_inode.i_ino; |
| 1426 | vma->vm_policy = mpol_shared_policy_lookup(&info->policy, index); | 1427 | vma->vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
diff --git a/mm/zswap.c b/mm/zswap.c index 7d34e69507e3..cd91fd9d96b8 100644 --- a/mm/zswap.c +++ b/mm/zswap.c | |||
| @@ -1026,6 +1026,15 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, | |||
| 1026 | ret = -ENOMEM; | 1026 | ret = -ENOMEM; |
| 1027 | goto reject; | 1027 | goto reject; |
| 1028 | } | 1028 | } |
| 1029 | |||
| 1030 | /* A second zswap_is_full() check after | ||
| 1031 | * zswap_shrink() to make sure it's now | ||
| 1032 | * under the max_pool_percent | ||
| 1033 | */ | ||
| 1034 | if (zswap_is_full()) { | ||
| 1035 | ret = -ENOMEM; | ||
| 1036 | goto reject; | ||
| 1037 | } | ||
| 1029 | } | 1038 | } |
| 1030 | 1039 | ||
| 1031 | /* allocate entry */ | 1040 | /* allocate entry */ |
