RE: [patch 03/20] x86, ptrace, bts: defer branch trace stopping

From: Peter Zijlstra
Date: Tue Apr 07 2009 - 04:28:26 EST


On Tue, 2009-04-07 at 09:12 +0100, Metzger, Markus T wrote:
> >-----Original Message-----
> >From: Peter Zijlstra [mailto:a.p.zijlstra@xxxxxxxxx]
> >Sent: Saturday, April 04, 2009 1:13 PM
> >To: Metzger, Markus T
> >Cc: mingo@xxxxxxx; tglx@xxxxxxxxxxxxx; hpa@xxxxxxxxx; markus.t.metzger@xxxxxxxxx; roland@xxxxxxxxxx;
> >eranian@xxxxxxxxxxxxxx; oleg@xxxxxxxxxx; Villacis, Juan; ak@xxxxxxxxxxxxxxxxxxx; linux-
> >kernel@xxxxxxxxxxxxxxx; Andrew Morton
> >Subject: RE: [patch 03/20] x86, ptrace, bts: defer branch trace stopping
> >
> >On Sat, 2009-04-04 at 08:17 +0100, Metzger, Markus T wrote:
> >> >-----Original Message-----
> >> >From: Peter Zijlstra [mailto:a.p.zijlstra@xxxxxxxxx]
> >> >Sent: Friday, April 03, 2009 5:01 PM
> >> >To: Metzger, Markus T
> >>
> >>
> >> >Also, I can't say I like the name, what about something like:
> >> >
> >> >void account_locked_buffer(struct mm_struct *mm, long pages)
> >> >{
> >> > down_write(&mm->mmap_sem);
> >> >
> >> > mm->total_vm += pages;
> >> > mm->locked_vm += pages;
> >> >
> >> > up_write(&mm->mmap_sem);
> >> >}
> >> >
> >> >but looking more closely at that alloc_locked_buffer() stuff, I really
> >> >hate it, who in his right mind does a multi-page kmalloc() -- that's
> >> >crazy.
> >>
> >> I need a non-pageable chunk of memory to give to the cpu to store branch
> >> trace data in. Kmalloc() is easy to use and gives me what I need.
> >>
> >> How would I do this correctly?
> >
> >Well, how large should this buffer be and must it be physically
> >contiguous?
>
> The size is set by the user. It is limited by (locked memory) RLIMIT.
>
> The buffer need not be physically contiguous, but it must not be paged out
> and should be marked accessed and dirty.
> (see Â18.7.8.2 in vol. 3b, Software Developer's Manual).

The Intel one I presume?

Ok, if you must mark the pages accessed and dirty you should get whole
pages, otherwise you cannot make that promise on the ptes, right?

> >Apparently its large enough to account in pages, that would suggest you
> >should use the page allocator to get memory.
>
> Wouldn't kmalloc forward the request to the page allocator for large memory?

It may, but doesn't need to.

> >Furthermore, if it needs to be physically contiguous and its more than
> >say 8 pages worth, you're basically up shit creek.
>
> If not enough memory is available, I would expect users to request smaller
> buffers until the request can be satisfied.

Sounds like a very bad interface, esp since you don't need physically
contiguous memory.

So what you need to do is allocate pages, order-0, grab a reference,
then vmap them into a linear piece, poke at the ptes to set the young
and dirty bits and provide that to your hardware.



--
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/