diff options
-rw-r--r-- | include/linux/mm.h | 1 | ||||
-rw-r--r-- | mm/mmap.c | 3 | ||||
-rw-r--r-- | mm/mprotect.c | 6 |
3 files changed, 6 insertions, 4 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 196924b657bc..df322fb4df31 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -100,6 +100,7 @@ extern unsigned int kobjsize(const void *objp); | |||
100 | #define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */ | 100 | #define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */ |
101 | #define VM_RESERVED 0x00080000 /* Count as reserved_vm like IO */ | 101 | #define VM_RESERVED 0x00080000 /* Count as reserved_vm like IO */ |
102 | #define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */ | 102 | #define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */ |
103 | #define VM_NORESERVE 0x00200000 /* should the VM suppress accounting */ | ||
103 | #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ | 104 | #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ |
104 | #define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ | 105 | #define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ |
105 | #define VM_MAPPED_COPY 0x01000000 /* T if mapped copy of data (nommu mmap) */ | 106 | #define VM_MAPPED_COPY 0x01000000 /* T if mapped copy of data (nommu mmap) */ |
@@ -1110,6 +1110,9 @@ munmap_back: | |||
1110 | if (!may_expand_vm(mm, len >> PAGE_SHIFT)) | 1110 | if (!may_expand_vm(mm, len >> PAGE_SHIFT)) |
1111 | return -ENOMEM; | 1111 | return -ENOMEM; |
1112 | 1112 | ||
1113 | if (flags & MAP_NORESERVE) | ||
1114 | vm_flags |= VM_NORESERVE; | ||
1115 | |||
1113 | if (accountable && (!(flags & MAP_NORESERVE) || | 1116 | if (accountable && (!(flags & MAP_NORESERVE) || |
1114 | sysctl_overcommit_memory == OVERCOMMIT_NEVER)) { | 1117 | sysctl_overcommit_memory == OVERCOMMIT_NEVER)) { |
1115 | if (vm_flags & VM_SHARED) { | 1118 | if (vm_flags & VM_SHARED) { |
diff --git a/mm/mprotect.c b/mm/mprotect.c index 360d9cc8b38c..abd645a3b0a0 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c | |||
@@ -153,12 +153,10 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, | |||
153 | * If we make a private mapping writable we increase our commit; | 153 | * If we make a private mapping writable we increase our commit; |
154 | * but (without finer accounting) cannot reduce our commit if we | 154 | * but (without finer accounting) cannot reduce our commit if we |
155 | * make it unwritable again. | 155 | * make it unwritable again. |
156 | * | ||
157 | * FIXME? We haven't defined a VM_NORESERVE flag, so mprotecting | ||
158 | * a MAP_NORESERVE private mapping to writable will now reserve. | ||
159 | */ | 156 | */ |
160 | if (newflags & VM_WRITE) { | 157 | if (newflags & VM_WRITE) { |
161 | if (!(oldflags & (VM_ACCOUNT|VM_WRITE|VM_SHARED))) { | 158 | if (!(oldflags & (VM_ACCOUNT|VM_WRITE| |
159 | VM_SHARED|VM_NORESERVE))) { | ||
162 | charged = nrpages; | 160 | charged = nrpages; |
163 | if (security_vm_enough_memory(charged)) | 161 | if (security_vm_enough_memory(charged)) |
164 | return -ENOMEM; | 162 | return -ENOMEM; |