Messages in this thread | | | Date | Fri, 21 Nov 2008 09:47:50 +0100 | From | "stephane eranian" <> | Subject | Re: debugctl msr |
| |
Markus,
On Fri, Nov 21, 2008 at 9:22 AM, Metzger, Markus T <markus.t.metzger@intel.com> wrote: >>-----Original Message----- >>From: stephane eranian [mailto:eranian@googlemail.com] >>Sent: Donnerstag, 20. November 2008 22:19 >>To: Markus Metzger > >>- in ds_put_context(), you need to mark task->thread.ds_ctx = NULL or >>this_system_context = NULL when you are >> done, otherwise a subsequent session on the same task or CPU will >>think there is already a context allocated but >> the pointer will be stale. > > This should happen in: > *(context->this) = NULL; > Ah, I missed that. I admit this code is hard to follow. Maybe it would easier to explicitly use the actual fields. > >>- in ptrace.c:ptrace_disable(), you systematically invoke ds_release() >>without checking if TIF_BTS_TRACE_TS >> is set. That causes extraneous calls to ds_release() which messes up >>the reference counting if PEBS is in use. > > That TIF only triggers the recording of scheduling timestamps. > > That ds_release_bts() call should: > - get the context > - fail the ownership validation in ds_validate() > - put the context > > If ds_validate() is disabled, it would put the context twice. > Yes, that was my case.
> > I am currently working on a patch to replace the validation > mechanism by using a handle returned from ds_request(). > Yes, that's the solution.
> I also added the interrupt threshold to the parameters of ds_request(). > It will be fix for one tracing session, if that's OK with you. > Yes.
I found the reason why in system-wide my kernel was crashing. It was due to the way you are writing DS_AREA_MSR in ds_allocate_context():
if (!task || (task == current)) wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0);
This does not work in 64-bit, you truncate the DS address. You must use wrmsrl() and let the macro break it down in two halves.
I am still seeing an issue whereby I have a buffer with > 100 entries but I get an interrupt or each sample, which is wrong. I am investigating why this is. There should only be one interrupt per buffer full. This use to work with my old ways of handling PEBS.
Thanks.
| |