aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Lespinasse <walken@google.com>2013-02-22 19:32:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 20:50:11 -0500
commit41badc15cbad0350de34408c1b0c690f9df76d4b (patch)
tree2545134398b99b37259bf6412a0bb56442f120fa
parent1869305009857cdeaabe6283bcdc2359c5784543 (diff)
mm: make do_mmap_pgoff return populate as a size in bytes, not as a bool
do_mmap_pgoff() rounds up the desired size to the next PAGE_SIZE multiple, however there was no equivalent code in mm_populate(), which caused issues. This could be fixed by introduced the same rounding in mm_populate(), however I think it's preferable to make do_mmap_pgoff() return populate as a size rather than as a boolean, so we don't have to duplicate the size rounding logic in mm_populate(). Signed-off-by: Michel Lespinasse <walken@google.com> Acked-by: Rik van Riel <riel@redhat.com> Tested-by: Andy Lutomirski <luto@amacapital.net> Cc: Greg Ungerer <gregungerer@westnet.com.au> Cc: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/aio.c5
-rw-r--r--include/linux/mm.h2
-rw-r--r--ipc/shm.c4
-rw-r--r--mm/mmap.c6
-rw-r--r--mm/nommu.c4
-rw-r--r--mm/util.c6
6 files changed, 13 insertions, 14 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 82eec7c7b4bb..064bfbe37566 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -101,9 +101,8 @@ static int aio_setup_ring(struct kioctx *ctx)
101 struct aio_ring *ring; 101 struct aio_ring *ring;
102 struct aio_ring_info *info = &ctx->ring_info; 102 struct aio_ring_info *info = &ctx->ring_info;
103 unsigned nr_events = ctx->max_reqs; 103 unsigned nr_events = ctx->max_reqs;
104 unsigned long size; 104 unsigned long size, populate;
105 int nr_pages; 105 int nr_pages;
106 bool populate;
107 106
108 /* Compensate for the ring buffer's head/tail overlap entry */ 107 /* Compensate for the ring buffer's head/tail overlap entry */
109 nr_events += 2; /* 1 is required, 2 for good luck */ 108 nr_events += 2; /* 1 is required, 2 for good luck */
@@ -150,7 +149,7 @@ static int aio_setup_ring(struct kioctx *ctx)
150 return -EAGAIN; 149 return -EAGAIN;
151 } 150 }
152 if (populate) 151 if (populate)
153 mm_populate(info->mmap_base, info->mmap_size); 152 mm_populate(info->mmap_base, populate);
154 153
155 ctx->user_id = info->mmap_base; 154 ctx->user_id = info->mmap_base;
156 155
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 9a5fcdeaa3a0..95db68e34b18 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1475,7 +1475,7 @@ extern unsigned long mmap_region(struct file *file, unsigned long addr,
1475 unsigned long len, vm_flags_t vm_flags, unsigned long pgoff); 1475 unsigned long len, vm_flags_t vm_flags, unsigned long pgoff);
1476extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, 1476extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
1477 unsigned long len, unsigned long prot, unsigned long flags, 1477 unsigned long len, unsigned long prot, unsigned long flags,
1478 unsigned long pgoff, bool *populate); 1478 unsigned long pgoff, unsigned long *populate);
1479extern int do_munmap(struct mm_struct *, unsigned long, size_t); 1479extern int do_munmap(struct mm_struct *, unsigned long, size_t);
1480 1480
1481#ifdef CONFIG_MMU 1481#ifdef CONFIG_MMU
diff --git a/ipc/shm.c b/ipc/shm.c
index 9f047ba69e62..be3ec9ae454e 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -971,7 +971,7 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,
971 struct shm_file_data *sfd; 971 struct shm_file_data *sfd;
972 struct path path; 972 struct path path;
973 fmode_t f_mode; 973 fmode_t f_mode;
974 bool populate = false; 974 unsigned long populate = 0;
975 975
976 err = -EINVAL; 976 err = -EINVAL;
977 if (shmid < 0) 977 if (shmid < 0)
@@ -1078,7 +1078,7 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,
1078invalid: 1078invalid:
1079 up_write(&current->mm->mmap_sem); 1079 up_write(&current->mm->mmap_sem);
1080 if (populate) 1080 if (populate)
1081 mm_populate(addr, size); 1081 mm_populate(addr, populate);
1082 1082
1083out_fput: 1083out_fput:
1084 fput(file); 1084 fput(file);
diff --git a/mm/mmap.c b/mm/mmap.c
index 39a3944e1658..44bb4d869884 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1163,13 +1163,13 @@ static inline unsigned long round_hint_to_min(unsigned long hint)
1163unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, 1163unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
1164 unsigned long len, unsigned long prot, 1164 unsigned long len, unsigned long prot,
1165 unsigned long flags, unsigned long pgoff, 1165 unsigned long flags, unsigned long pgoff,
1166 bool *populate) 1166 unsigned long *populate)
1167{ 1167{
1168 struct mm_struct * mm = current->mm; 1168 struct mm_struct * mm = current->mm;
1169 struct inode *inode; 1169 struct inode *inode;
1170 vm_flags_t vm_flags; 1170 vm_flags_t vm_flags;
1171 1171
1172 *populate = false; 1172 *populate = 0;
1173 1173
1174 /* 1174 /*
1175 * Does the application expect PROT_READ to imply PROT_EXEC? 1175 * Does the application expect PROT_READ to imply PROT_EXEC?
@@ -1307,7 +1307,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
1307 1307
1308 addr = mmap_region(file, addr, len, vm_flags, pgoff); 1308 addr = mmap_region(file, addr, len, vm_flags, pgoff);
1309 if (!IS_ERR_VALUE(addr) && (vm_flags & VM_POPULATE)) 1309 if (!IS_ERR_VALUE(addr) && (vm_flags & VM_POPULATE))
1310 *populate = true; 1310 *populate = len;
1311 return addr; 1311 return addr;
1312} 1312}
1313 1313
diff --git a/mm/nommu.c b/mm/nommu.c
index 7296a5a280e7..18c1b932e2c4 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1251,7 +1251,7 @@ unsigned long do_mmap_pgoff(struct file *file,
1251 unsigned long prot, 1251 unsigned long prot,
1252 unsigned long flags, 1252 unsigned long flags,
1253 unsigned long pgoff, 1253 unsigned long pgoff,
1254 bool *populate) 1254 unsigned long *populate)
1255{ 1255{
1256 struct vm_area_struct *vma; 1256 struct vm_area_struct *vma;
1257 struct vm_region *region; 1257 struct vm_region *region;
@@ -1261,7 +1261,7 @@ unsigned long do_mmap_pgoff(struct file *file,
1261 1261
1262 kenter(",%lx,%lx,%lx,%lx,%lx", addr, len, prot, flags, pgoff); 1262 kenter(",%lx,%lx,%lx,%lx,%lx", addr, len, prot, flags, pgoff);
1263 1263
1264 *populate = false; 1264 *populate = 0;
1265 1265
1266 /* decide whether we should attempt the mapping, and if so what sort of 1266 /* decide whether we should attempt the mapping, and if so what sort of
1267 * mapping */ 1267 * mapping */
diff --git a/mm/util.c b/mm/util.c
index 13467e043e9e..3704bf1bef94 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -355,7 +355,7 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
355{ 355{
356 unsigned long ret; 356 unsigned long ret;
357 struct mm_struct *mm = current->mm; 357 struct mm_struct *mm = current->mm;
358 bool populate; 358 unsigned long populate;
359 359
360 ret = security_mmap_file(file, prot, flag); 360 ret = security_mmap_file(file, prot, flag);
361 if (!ret) { 361 if (!ret) {
@@ -363,8 +363,8 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
363 ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff, 363 ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff,
364 &populate); 364 &populate);
365 up_write(&mm->mmap_sem); 365 up_write(&mm->mmap_sem);
366 if (!IS_ERR_VALUE(ret) && populate) 366 if (populate)
367 mm_populate(ret, len); 367 mm_populate(ret, populate);
368 } 368 }
369 return ret; 369 return ret;
370} 370}