Messages in this thread | | | Date | Fri, 24 Apr 2009 01:03:26 -0700 | From | Andrew Morton <> | Subject | Re: [rfc 1/2] x86, bts, mm: buffer allocation |
| |
On Fri, 24 Apr 2009 09:51:43 +0200 Markus Metzger <markus.t.metzger@intel.com> wrote:
> --- a/mm/mlock.c > +++ b/mm/mlock.c > @@ -629,38 +629,36 @@ void user_shm_unlock(size_t size, struct > free_uid(user); > } > > -void *alloc_locked_buffer(size_t size) > +int account_locked_memory(struct mm_struct *mm, struct rlimit *rlim, > + size_t size) > { > - unsigned long rlim, vm, pgsz; > - void *buffer = NULL; > + unsigned long lim, vm, pgsz; > + int error = -ENOMEM; > > pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT; > > - down_write(¤t->mm->mmap_sem); > - > - rlim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; > - vm = current->mm->total_vm + pgsz; > - if (rlim < vm) > - goto out; > + down_write(&mm->mmap_sem); > > - rlim = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; > - vm = current->mm->locked_vm + pgsz; > - if (rlim < vm) > + lim = rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; > + vm = mm->total_vm + pgsz; > + if (lim < vm) > goto out; > > - buffer = kzalloc(size, GFP_KERNEL); > - if (!buffer) > + lim = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; > + vm = mm->locked_vm + pgsz; > + if (lim < vm) > goto out; > > - current->mm->total_vm += pgsz; > - current->mm->locked_vm += pgsz; > + mm->total_vm += pgsz; > + mm->locked_vm += pgsz; > > + error = 0; > out: > - up_write(¤t->mm->mmap_sem); > - return buffer; > + up_write(&mm->mmap_sem); > + return error; > }
Looks OK to me. Getting that GFP_KERNEL allocation out from inside mmap_sem can only be good.
| |