-
-void *alloc_locked_buffer(size_t size)
-{
- unsigned long rlim, vm, pgsz;
- void *buffer = NULL;
-
- 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;
-
- rlim = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
- vm = current->mm->locked_vm + pgsz;
- if (rlim < vm)
- goto out;
-
- buffer = kzalloc(size, GFP_KERNEL);
- if (!buffer)
- goto out;
-
- current->mm->total_vm += pgsz;
- current->mm->locked_vm += pgsz;
-
- out:
- up_write(¤t->mm->mmap_sem);
- return buffer;
-}
-
-void free_locked_buffer(void *buffer, size_t size)
-{
- unsigned long pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
-
- down_write(¤t->mm->mmap_sem);
-
- current->mm->total_vm -= pgsz;
- current->mm->locked_vm -= pgsz;
-
- up_write(¤t->mm->mmap_sem);
-
- kfree(buffer);
-}