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 à :

révisé par
Ingo Molnar

Parent
bf53de907d
révision
c5dee6177f
45
mm/mlock.c
45
mm/mlock.c
@@ -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(¤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);
|
||||
}
|
||||
|
Référencer dans un nouveau ticket
Bloquer un utilisateur