Re: [rfc] x86, ptrace: memory accounting for branch tracing

From: Andrew Morton
Date: Tue Dec 16 2008 - 13:19:25 EST


On Tue, 16 Dec 2008 18:30:59 +0100 Ingo Molnar <mingo@xxxxxxx> wrote:

>
> * Markus Metzger <markus.t.metzger@xxxxxxxxx> wrote:
>
> > Account memory allocated for the BTS buffer to the traced task's
> > total_vm and locked_vm.
>
> Andrew, is this the right (and preferred) way to attach BTS buffer
> allocation overhead to the RLIMIT_MEMLOCK bucket:

Close. I suspect we could refactor mlock.c to avoid all the code
duplication we have there.

There's (almost) nothing BTS-specific in this code, and it would be
better if it lived in mm/mlock.c. Hopefully in a
usable-by-other-parts-of-mlock.c fashion.

> > +static int ptrace_bts_allocate_buffer(struct task_struct *child, size_t size)
> > +{
> > + unsigned long rlim, vm, pgsz;
> > + int error = -ENOMEM;
> > +
> > + pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
> > +
> > + down_write(&child->mm->mmap_sem);
> > +
> > + rlim = child->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT;
> > + vm = child->mm->total_vm + pgsz;
> > + if (rlim < vm)

This is off-by-one, I think. Should be

if (vm > rmlim)

> > + goto out;
> > +
> > + rlim = child->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
> > + vm = child->mm->locked_vm + pgsz;
> > + if (rlim < vm)

ditto

> > + goto out;
> > +
> > + child->bts_buffer = kzalloc(size, GFP_KERNEL);
> > + if (!child->bts_buffer)
> > + goto out;
> > +
> > + child->bts_size = size;
> > +
> > + child->mm->total_vm += pgsz;
> > + child->mm->locked_vm += pgsz;
> > +
> > + error = 0;
> > + out:
> > + up_write(&child->mm->mmap_sem);
> > + return error;
>
> ?
>
> Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/