x86, bts: memory accounting

Impact: move the BTS buffer accounting to the mlock bucket

Add alloc_locked_buffer() and free_locked_buffer() functions to mm/mlock.c
to kalloc a buffer and account the locked memory to current.

Account the memory for the BTS buffer to the tracer.

Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cette révision appartient à :
Markus Metzger
2008-12-19 15:17:02 +01:00
révisé par Ingo Molnar
Parent bf53de907d
révision c5dee6177f
3 fichiers modifiés avec 81 ajouts et 11 suppressions

Voir le fichier

@@ -667,3 +667,48 @@ void user_shm_unlock(size_t size, struct user_struct *user)
spin_unlock(&shmlock_user_lock);
free_uid(user);
}
void *alloc_locked_buffer(size_t size)
{
unsigned long rlim, vm, pgsz;
void *buffer = NULL;
pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
down_write(&current->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(&current->mm->mmap_sem);
return buffer;
}
void free_locked_buffer(void *buffer, size_t size)
{
unsigned long pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
down_write(&current->mm->mmap_sem);
current->mm->total_vm -= pgsz;
current->mm->locked_vm -= pgsz;
up_write(&current->mm->mmap_sem);
kfree(buffer);
}