mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>,
	Peter Zijlstra <peterz@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH] ftrace: x86 use copy to and from user functions
Date: Thu, 21 Aug 2008 08:08:58 +1000	[thread overview]
Message-ID: <1219270138.21386.73.camel@pasglop> (raw)
In-Reply-To: <alpine.DEB.1.10.0808201742370.18551@gandalf.stny.rr.com>

On Wed, 2008-08-20 at 17:43 -0400, Steven Rostedt wrote:
> 
> 
> On Thu, 21 Aug 2008, Benjamin Herrenschmidt wrote:
> 
> > On Wed, 2008-08-20 at 12:55 -0400, Steven Rostedt wrote:
> > > The modification of code is performed either by kstop_machine, before
> > > SMP starts, or on module code before the module is executed. There is
> > > no reason to do the modifications from assembly. The copy to and from
> > > user functions are sufficient and produces cleaner and easier to read
> > > code.
> > > 
> > > Thanks to Benjamin Herrenschmidt for suggesting the idea.
> > 
> > Haven't we lost the dcache/icache synchronisation somewhere ?
> 
> This is the x86 version, sync_core should be fine.

Oh oops, I didn't look well enough :-)

Ben.

> -- Steve
> 
> > 
> > > Signed-off-by: Steven Rostedt <srostedt@redhat.com>
> > > ---
> > >  arch/x86/kernel/ftrace.c |   38 +++++++++++++-------------------------
> > >  1 file changed, 13 insertions(+), 25 deletions(-)
> > > 
> > > Index: linux-tip.git/arch/x86/kernel/ftrace.c
> > > ===================================================================
> > > --- linux-tip.git.orig/arch/x86/kernel/ftrace.c	2008-08-20 12:39:41.000000000 -0400
> > > +++ linux-tip.git/arch/x86/kernel/ftrace.c	2008-08-20 12:40:17.000000000 -0400
> > > @@ -11,6 +11,7 @@
> > >  
> > >  #include <linux/spinlock.h>
> > >  #include <linux/hardirq.h>
> > > +#include <linux/uaccess.h>
> > >  #include <linux/ftrace.h>
> > >  #include <linux/percpu.h>
> > >  #include <linux/init.h>
> > > @@ -60,11 +61,7 @@ notrace int
> > >  ftrace_modify_code(unsigned long ip, unsigned char *old_code,
> > >  		   unsigned char *new_code)
> > >  {
> > > -	unsigned replaced;
> > > -	unsigned old = *(unsigned *)old_code; /* 4 bytes */
> > > -	unsigned new = *(unsigned *)new_code; /* 4 bytes */
> > > -	unsigned char newch = new_code[4];
> > > -	int faulted = 0;
> > > +	unsigned char replaced[MCOUNT_INSN_SIZE];
> > >  
> > >  	/*
> > >  	 * Note: Due to modules and __init, code can
> > > @@ -72,29 +69,20 @@ ftrace_modify_code(unsigned long ip, uns
> > >  	 *  as well as code changing.
> > >  	 *
> > >  	 * No real locking needed, this code is run through
> > > -	 * kstop_machine.
> > > +	 * kstop_machine, or before SMP starts.
> > >  	 */
> > > -	asm volatile (
> > > -		"1: lock\n"
> > > -		"   cmpxchg %3, (%2)\n"
> > > -		"   jnz 2f\n"
> > > -		"   movb %b4, 4(%2)\n"
> > > -		"2:\n"
> > > -		".section .fixup, \"ax\"\n"
> > > -		"3:	movl $1, %0\n"
> > > -		"	jmp 2b\n"
> > > -		".previous\n"
> > > -		_ASM_EXTABLE(1b, 3b)
> > > -		: "=r"(faulted), "=a"(replaced)
> > > -		: "r"(ip), "r"(new), "c"(newch),
> > > -		  "0"(faulted), "a"(old)
> > > -		: "memory");
> > > -	sync_core();
> > > +	if (__copy_from_user(replaced, (char __user *)ip, MCOUNT_INSN_SIZE))
> > > +		return 1;
> > >  
> > > -	if (replaced != old && replaced != new)
> > > -		faulted = 2;
> > > +	if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0)
> > > +		return 2;
> > >  
> > > -	return faulted;
> > > +	WARN_ON_ONCE(__copy_to_user((char __user *)ip, new_code,
> > > +				    MCOUNT_INSN_SIZE));
> > > +
> > > +	sync_core();
> > > +
> > > +	return 0;
> > >  }
> > >  
> > >  notrace int ftrace_update_ftrace_func(ftrace_func_t func)
> > 
> > 


  reply	other threads:[~2008-08-20 22:09 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-20 16:55 Steven Rostedt
2008-08-20 21:39 ` Benjamin Herrenschmidt
2008-08-20 21:43   ` Steven Rostedt
2008-08-20 22:08     ` Benjamin Herrenschmidt [this message]
2008-08-21 10:31 ` Ingo Molnar

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=1219270138.21386.73.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®