All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: Jason Wessel <jason.wessel@windriver.com>
Cc: linux-kernel@vger.kernel.org,
	kgdb-bugreport@lists.sourceforge.net, mingo@elte.hu,
	"K.Prasad" <prasad@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Alan Stern <stern@rowland.harvard.edu>
Subject: Re: [PATCH 1/4] x86,hw_breakpoint,kgdb: kgdb to use hw_breakpointAPI
Date: Thu, 28 Jan 2010 21:04:23 +0100	[thread overview]
Message-ID: <20100128200418.GC18683@nowhere> (raw)
In-Reply-To: <4B61CD14.7000901@windriver.com>

On Thu, Jan 28, 2010 at 11:44:52AM -0600, Jason Wessel wrote:
> Frederic Weisbecker wrote:
> > Good simplification, but that doesn't appear related to kgdb,
> > this should be done in a separate patch, for the perf/core tree.
> >
> >   
> 
> Specifically this is required so that kgdb can modify the state of dr7
> by installing and removing breakpoints.  Without this change, on return
> from the callback the dr7 was not correct.
> 
> As far as I know, only kgdb was altering the dr registers during a call
> back..



Ok. Well not sure how/where it needs to modify dr7 directly.


 
> > hw_breakpoint_restore() is used by KVM only, for now.
> > The cpu var cpu_debugreg[] contains values that
> > are only saved when KVM switches to a guest, then
> > this function is called when KVM switches back to the
> > host. I bet this is not the function you need.
> > In fact, I don't know what you intended to do there.
> >
> >   
> 
> I was looking to restore the proper contents of the debug registers when
> resuming the general kernel execution.
> 
> As far as I could tell it looked like the right function because
> arch_install_breakpoint() uses the per_cpu vars.  If there is a save
> function that I need to call first that is a different issue.
> 
> IE:
>     __get_cpu_var(cpu_debugreg[i]) = info->address;
> 
> 
> I admit I did not test running a kvm instance, so I don't know what kind
> of conflict there would be here.  I went and further looked at the kvm
> code, and they call the function for the same reason kgdb does.  They
> want the original system values back on resuming normal kernel
> execution.  KVM can modify dr7 or other regs directly on entry for its
> guest execution.  Kgdb does the same sort of thing so as to prevent the
> debugger from interrupting itself.



You mean kgdb needs to disable dr7 while handling a breakpoint to
avoid recursion? In this case this is something already done
from the x86 breakpoint handler.


 
> > Would be nice to have bptype set to the generic flags
> > we have already in linux/hw_breakpoint.h:
> >
> > enum {
> > 	HW_BREAKPOINT_R = 1,
> > 	HW_BREAKPOINT_W = 2,
> > 	HW_BREAKPOINT_X = 4,
> > };
> >
> >
> >   
> 
> These numbers have to get translated somewhere from the GDB version
> which it handed off via the gdb serial protocol.  They could be
> translated in the gdb stub, but for now they are in the arch specific
> stub.  Or you can choose to use the same numbering scheme as gdb for the
> breakpoint types and the values could be used directly.



Ah ok. Well, translating gdb <-> generic values will make you
move this code from x86 to core at least.

 
> > Same here, see arch_build_bp_info().
> > Actually, arch_validate_hwbkpt_settings() would do all
> > that for you. May require few changes though to adapt.
> >
> > Actually, I don't understand why you encumber with this
> > breakinfo thing. Why not just keeping a per cpu array
> > of perf events? You have everything you need inside:
> > the generic breakpoint attributes in the attrs and
> > the arch info in the hw_perf_event struct inside.
> >   
> 
> I think the break info thing will go away via a refactor.  For now I was
> really looking to make it work.   There was no way to tell at the time
> what values were safe to use in attr struct provided by perf.  I would
> have further preferred to be able to use the simple -1 cpu in the bp
> type and let perf do all the work, but there is no way to allocate a
> perf hw wide break like this at the moment.



Ok.


 
> Realize that what is here is well tested, and aimed to first correct the
> regression.


Sure.

 
> >> +		} else if (recieved_hw_brk[raw_smp_processor_id()] == 1) {
> >> +			recieved_hw_brk[raw_smp_processor_id()] = 0;
> >> +			return NOTIFY_STOP;
> >> +		} else if (dr6_p && (*dr6_p & DR_TRAP_BITS) == 0) {
> >> +			return NOTIFY_DONE;
> >> +		}
> >>     
> >
> >
> >
> > So this is the debug handler, right?
> >
> >
> >   
> 
> This ugly bit is all because the patch I had for returning something
> from the event call back was tossed.
> 
> Because perf does not honor the return code from a call back there is no
> way to dismiss an event in the die notifier.  The forces the debug
> handler to do very nasty tricks so as not to handle the same event twice.



Right, we'll need to fix that later from perf, I think.


 
> >>  
> >> +static void kgdb_hw_bp(struct perf_event *bp, int nmi,
> >> +		       struct perf_sample_data *data,
> >> +		       struct pt_regs *regs)
> >> +{
> >> +	struct die_args args;
> >> +	int cpu = raw_smp_processor_id();
> >> +
> >> +	args.trapnr = 0;
> >> +	args.signr = 5;
> >> +	args.err = 0;
> >> +	args.regs = regs;
> >> +	args.str = "debug";
> >> +	recieved_hw_brk[cpu] = 0;
> >> +	if (__kgdb_notify(&args, DIE_DEBUG) == NOTIFY_STOP)
> >> +		recieved_hw_brk[cpu] = 1;
> >> +	else
> >> +		recieved_hw_brk[cpu] = 0;
> >> +}
> >>     
> >
> >
> >
> > And this looks like the perf event handler.
> >
> > I'm confused by the logic here. We have the x86 breakpoint
> > handler which calls perf_bp_event which in turn will call
> > the above. The above calls __kgdb_notify(), but it will
> > also be called later as it is a debug notifier.
> >
> >
> >   
> 
> Perf was eating my events if I had no call back.  If you know a way
> around this let me know.


The problem is not the perf callback. What I did not understand
was the use of __kgdb_notify() from the callback, while it is
still called after as a debug notifier.



> > And then you release these, ok. We should find a proper
> > way for that later, but for now it should work.
> >
> >   
> 
> Previously, I was unable to convince anyone that the kernel debugger
> needed to be able to do this.  I had an API change to perf for it, but
> it was dismissed along with the notify return value on the call back. 
> This is merely a work around to correct the regression.


We'll need to sanitize that after the regression fix.


  parent reply	other threads:[~2010-01-28 20:04 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-26  4:26 [PATCH 0/4] kgdb regression fixes for 2.6.33 Jason Wessel
2010-01-26  4:26 ` [PATCH 1/4] x86,hw_breakpoint,kgdb: kgdb to use hw_breakpoint API Jason Wessel
2010-01-28 17:10   ` Frederic Weisbecker
2010-01-28 17:44     ` [PATCH 1/4] x86,hw_breakpoint,kgdb: kgdb to use hw_breakpointAPI Jason Wessel
2010-01-28 19:58       ` Jason Wessel
2010-01-28 20:17         ` Frederic Weisbecker
2010-01-28 20:23           ` [PATCH 1/4] x86,hw_breakpoint,kgdb: kgdb to usehw_breakpointAPI Jason Wessel
2010-01-28 21:54             ` Frederic Weisbecker
2010-01-28 20:04       ` Frederic Weisbecker [this message]
2010-01-28 20:27         ` Jason Wessel
2010-01-28 21:50           ` Frederic Weisbecker
2010-01-26  4:26 ` [PATCH 2/4] perf,hw_breakpoint: add lockless reservation for hw_breaks Jason Wessel
2010-01-26 19:25   ` Jason Wessel
2010-01-27 17:56     ` Frederic Weisbecker
2010-01-27 22:29       ` [PATCH 2/4] perf,hw_breakpoint: add lockless reservation forhw_breaks Jason Wessel
2010-01-26  4:26 ` [PATCH 3/4] kgdb,clocksource: Prevent kernel hang in kernel debugger Jason Wessel
2010-01-26  4:37   ` Andrew Morton
2010-01-26  8:22   ` Martin Schwidefsky
2010-01-26  8:50     ` Thomas Gleixner
2010-01-26 10:01       ` Dongdong Deng
2010-01-26 10:19         ` Xiaotian Feng
2010-01-26 10:37         ` Thomas Gleixner
2010-01-26 11:16           ` Thomas Gleixner
2010-01-26  8:45   ` Thomas Gleixner
2010-01-26 10:43   ` Thomas Gleixner
2010-01-26 14:09   ` [tip:timers/urgent] clocksource: Prevent potential kgdb dead lock tip-bot for Thomas Gleixner
2010-01-26 20:14     ` Andrew Morton
2010-01-26 20:46       ` Jason Wessel
2010-01-26  4:26 ` [PATCH 4/4] softlockup: add sched_clock_tick() to avoid kernel warning on kgdb resume Jason Wessel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100128200418.GC18683@nowhere \
    --to=fweisbec@gmail.com \
    --cc=jason.wessel@windriver.com \
    --cc=kgdb-bugreport@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=prasad@linux.vnet.ibm.com \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.