Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Jeremy Fitzhardinge
Chris Wright wrote:
> * Steven Rostedt ([EMAIL PROTECTED]) wrote:
>   
>> Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
>> remember the exact issues, but it did have something to do with the way
>> parameters were passed in.
>>
>> Chris, do you remember what the issues were?
>> 
>
> Yes, paravirt ops have a well-specified calling convention (register
> based).  There was a cleanup that Andi did that caused the problem
> because it removed all the "fastcall" annotations since -mregparm=3
> is now always on for i386.  Since MCOUNT disables REGPARM the calling
> convention changes (caller pushes to stack, callee expects register)
> chaos ensues.  I sent a patch to fix that quite some months back, but
> it went stale and I neglected to update it.  Would you like me to dig
> it up refresh and resend?

Ingo/Andrew have been accepting patches to systematically remove all the
fastcall annotations from the kernel, so adding them back isn't going to
help.

Ingo and I discussed whether we need to reannotate paravirt.h (either
with fastcall or something else indicating a register-only calling
convention), specifically because of the -pg issue, but I think the
conclusion was that whatever problem existed no longer does, and there's
no incompatibility between -pg and regparm.

J
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Chris Wright
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
> On Thu, 3 Jan 2008, Chris Wright wrote:
> > Yes, paravirt ops have a well-specified calling convention (register
> > based).  There was a cleanup that Andi did that caused the problem
> > because it removed all the "fastcall" annotations since -mregparm=3
> > is now always on for i386.  Since MCOUNT disables REGPARM the calling
> > convention changes (caller pushes to stack, callee expects register)
> > chaos ensues.  I sent a patch to fix that quite some months back, but
> > it went stale and I neglected to update it.  Would you like me to dig
> > it up refresh and resend?
> 
> Chris, thanks for the refresher.
> 
> I'm going to see if we can remove the REGPARM hack and change the way
> mcount does its calls. Maybe this will fix things for us.

I don't recall why mcount disables regparm, but I think you're on the
right path to remove that dependency.

thanks,
-chris
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt

On Thu, 3 Jan 2008, Chris Wright wrote:

>
> Yes, paravirt ops have a well-specified calling convention (register
> based).  There was a cleanup that Andi did that caused the problem
> because it removed all the "fastcall" annotations since -mregparm=3
> is now always on for i386.  Since MCOUNT disables REGPARM the calling
> convention changes (caller pushes to stack, callee expects register)
> chaos ensues.  I sent a patch to fix that quite some months back, but
> it went stale and I neglected to update it.  Would you like me to dig
> it up refresh and resend?

Chris, thanks for the refresher.

I'm going to see if we can remove the REGPARM hack and change the way
mcount does its calls. Maybe this will fix things for us.

-- Steve

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Chris Wright
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
> Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
> remember the exact issues, but it did have something to do with the way
> parameters were passed in.
> 
> Chris, do you remember what the issues were?

Yes, paravirt ops have a well-specified calling convention (register
based).  There was a cleanup that Andi did that caused the problem
because it removed all the "fastcall" annotations since -mregparm=3
is now always on for i386.  Since MCOUNT disables REGPARM the calling
convention changes (caller pushes to stack, callee expects register)
chaos ensues.  I sent a patch to fix that quite some months back, but
it went stale and I neglected to update it.  Would you like me to dig
it up refresh and resend?

thanks,
-chris
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt


On Thu, 3 Jan 2008, Mathieu Desnoyers wrote:
> .
> > Index: linux-compile.git/arch/x86/kernel/mcount-wrapper.S
> > ===
> > --- /dev/null   1970-01-01 00:00:00.0 +
> > +++ linux-compile.git/arch/x86/kernel/mcount-wrapper.S  2008-01-03 
> > 01:02:33.0 -0500
> > @@ -0,0 +1,25 @@
> > +/*
> > + *  linux/arch/x86/mcount-wrapper.S
> > + *
> > + *  Copyright (C) 2004 Ingo Molnar
> > + */
> > +
> > +.globl mcount
> > +mcount:
> > +   cmpl $0, mcount_enabled
> > +   jz out
> > +
> > +   push %ebp
> > +   mov %esp, %ebp
> > +   pushl %eax
> > +   pushl %ecx
> > +   pushl %edx
> > +
> > +   call __mcount
> > +
> > +   popl %edx
> > +   popl %ecx
> > +   popl %eax
> > +   popl %ebp
>
> Writing this stack setup in assembly may be the one thing that conflicts
> with REGPARM ?

Could be.

> > +
> > +/** __mcount - hook for profiling
> > + *
> > + * This routine is called from the arch specific mcount routine, that in 
> > turn is
> > + * called from code inserted by gcc -pg.
> > + */
> > +notrace void __mcount(void)
> > +{
> > +   if (mcount_trace_function != dummy_mcount_tracer)
> > +   mcount_trace_function(CALLER_ADDR1, CALLER_ADDR2);
> > +}
>
> I don't see what the mcount_trace_function test gives us here : we
> already tested mcount_enabled.

It's probably me being anal. I did a compare over a function call.
I guess calling dummy_mcount_tracer is OK. I originally had it as NULL
and that had too many races.

> > Index: linux-compile.git/arch/x86/kernel/entry_64.S
> > ===
> > --- linux-compile.git.orig/arch/x86/kernel/entry_64.S   2008-01-03 
> > 01:02:28.0 -0500
> > +++ linux-compile.git/arch/x86/kernel/entry_64.S2008-01-03 
> > 01:02:33.0 -0500
> > @@ -53,6 +53,52 @@
> >
> > .code64
> >
> > +#ifdef CONFIG_MCOUNT
> > +
> > +ENTRY(mcount)
> > +   cmpl $0, mcount_enabled
> > +   jz out
> > +
> > +   push %rbp
> > +
> > +   lea dummy_mcount_tracer, %rbp
> > +   cmpq %rbp, mcount_trace_function
>
>
> Ok, so we normally jump over the function call (with mcount_enabled being 0)
> but we can call it in rare cases when it is being set concurrently (even
> though the mcount_trace_function is there, concurrency could still allow
> the call).
>
> Therefore we have one data cache hit when disabled (mcount_enabled), and
> must do a supplementary comparison before the call when enabled. I
> wonder why the cmpq %rbp, mcount_trace_function test is there at all ?

We can have mcount_enabled on without a tracing function to call. So this
simply saves us from doing another function call.

I've been debating about getting rid of the mcount_enabled, but it makes
it easy for systemtap to disable tracing. We don't even need to modify
systemtap with this, since systemtap already has the ability to turn
mcount_enabled on and off. But it will be a bit uglier to have systemtap
modify the tracing function.

Perhaps calling dummy_mcount_tracer isn't that bad. I'll need to do some
benchmarks between the two.

-- Steve

>
>
> > +   jz out_rbp
> > +
> > +   mov %rsp,%rbp
> > +
> > +   push %r11
> > +   push %r10
> > +   push %r9
> > +   push %r8
> > +   push %rdi
> > +   push %rsi
> > +   push %rdx
> > +   push %rcx
> > +   push %rax
> > +
> > +   mov 0x0(%rbp),%rax
> > +   mov 0x8(%rbp),%rdi
> > +   mov 0x8(%rax),%rsi
> > +
> > +   call   *mcount_trace_function
> > +
> > +   pop %rax
> > +   pop %rcx
> > +   pop %rdx
> > +   pop %rsi
> > +   pop %rdi
> > +   pop %r8
> > +   pop %r9
> > +   pop %r10
> > +   pop %r11
> > +
> > +out_rbp:
> > +   pop %rbp
> > +out:
> > +   ret
> > +#endif
> > +
> >  #ifndef CONFIG_PREEMPT
> >  #define retint_kernel retint_restore_args
> >  #endif
> >
> > --
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Mathieu Desnoyers
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
...
> Index: linux-compile.git/arch/x86/Kconfig
> ===
> --- linux-compile.git.orig/arch/x86/Kconfig   2008-01-03 01:02:28.0 
> -0500
> +++ linux-compile.git/arch/x86/Kconfig2008-01-03 01:02:33.0 
> -0500
> @@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
>   bool
>   default y
>  
> +# function tracing might turn this off:
> +config REGPARM
> + bool
> + depends on !MCOUNT
> + default y
> +
>  config CLOCKSOURCE_WATCHDOG
>   bool
>   default y

> Index: linux-compile.git/arch/x86/kernel/mcount-wrapper.S
> ===
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ linux-compile.git/arch/x86/kernel/mcount-wrapper.S2008-01-03 
> 01:02:33.0 -0500
> @@ -0,0 +1,25 @@
> +/*
> + *  linux/arch/x86/mcount-wrapper.S
> + *
> + *  Copyright (C) 2004 Ingo Molnar
> + */
> +
> +.globl mcount
> +mcount:
> + cmpl $0, mcount_enabled
> + jz out
> +
> + push %ebp
> + mov %esp, %ebp
> + pushl %eax
> + pushl %ecx
> + pushl %edx
> +
> + call __mcount
> +
> + popl %edx
> + popl %ecx
> + popl %eax
> + popl %ebp

Writing this stack setup in assembly may be the one thing that conflicts
with REGPARM ?

> +out:
> + ret
> Index: linux-compile.git/include/linux/linkage.h
> ===
> --- linux-compile.git.orig/include/linux/linkage.h2008-01-03 
> 01:02:28.0 -0500
> +++ linux-compile.git/include/linux/linkage.h 2008-01-03 01:02:33.0 
> -0500
> @@ -3,6 +3,8 @@
>  
>  #include 
>  
> +#define notrace __attribute__((no_instrument_function))
> +
>  #ifdef __cplusplus
>  #define CPP_ASMLINKAGE extern "C"
>  #else
> Index: linux-compile.git/kernel/sysctl.c
> ===
> --- linux-compile.git.orig/kernel/sysctl.c2008-01-03 01:02:28.0 
> -0500
> +++ linux-compile.git/kernel/sysctl.c 2008-01-03 01:02:33.0 -0500
> @@ -46,6 +46,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include 
>  #include 
> @@ -470,6 +471,16 @@ static struct ctl_table kern_table[] = {
>   .mode   = 0644,
>   .proc_handler   = _dointvec,
>   },
> +#ifdef CONFIG_MCOUNT
> + {
> + .ctl_name   = CTL_UNNUMBERED,
> + .procname   = "mcount_enabled",
> + .data   = _enabled,
> + .maxlen = sizeof(int),
> + .mode   = 0644,
> + .proc_handler   = _dointvec,
> + },
> +#endif
>  #ifdef CONFIG_KMOD
>   {
>   .ctl_name   = KERN_MODPROBE,
> Index: linux-compile.git/lib/Kconfig.debug
> ===
> --- linux-compile.git.orig/lib/Kconfig.debug  2008-01-03 01:02:28.0 
> -0500
> +++ linux-compile.git/lib/Kconfig.debug   2008-01-03 01:02:33.0 
> -0500
> @@ -517,4 +517,6 @@ config FAULT_INJECTION_STACKTRACE_FILTER
>   help
> Provide stacktrace filter for fault-injection capabilities
>  
> +source lib/mcount/Kconfig
> +
>  source "samples/Kconfig"
> Index: linux-compile.git/lib/Makefile
> ===
> --- linux-compile.git.orig/lib/Makefile   2008-01-03 01:02:28.0 
> -0500
> +++ linux-compile.git/lib/Makefile2008-01-03 01:02:33.0 -0500
> @@ -66,6 +66,8 @@ obj-$(CONFIG_AUDIT_GENERIC) += audit.o
>  obj-$(CONFIG_SWIOTLB) += swiotlb.o
>  obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o
>  
> +obj-$(CONFIG_MCOUNT) += mcount/
> +
>  lib-$(CONFIG_GENERIC_BUG) += bug.o
>  
>  hostprogs-y  := gen_crc32table
> Index: linux-compile.git/lib/mcount/Kconfig
> ===
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ linux-compile.git/lib/mcount/Kconfig  2008-01-03 01:02:33.0 
> -0500
> @@ -0,0 +1,6 @@
> +
> +# MCOUNT itself is useless, or will just be added overhead.
> +# It needs something to register a function with it.
> +config MCOUNT
> + bool
> + depends on DEBUG_KERNEL
> Index: linux-compile.git/lib/mcount/Makefile
> ===
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ linux-compile.git/lib/mcount/Makefile 2008-01-03 01:02:33.0 
> -0500
> @@ -0,0 +1,3 @@
> +obj-$(CONFIG_MCOUNT) += libmcount.o
> +
> +libmcount-objs := mcount.o
> Index: linux-compile.git/lib/mcount/mcount.c
> ===
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ linux-compile.git/lib/mcount/mcount.c 2008-01-03 01:02:33.0 
> -0500
> @@ -0,0 +1,78 @@
> +/*
> + * Infrastructure for profiling code 

Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Daniel Walker

On Thu, 2008-01-03 at 02:16 -0500, Steven Rostedt wrote:
> Index: linux-compile.git/Makefile
> ===
> --- linux-compile.git.orig/Makefile 2008-01-03 01:02:28.0 -0500
> +++ linux-compile.git/Makefile  2008-01-03 01:02:39.0 -0500
> @@ -509,11 +509,15 @@ endif
>  
>  include $(srctree)/arch/$(SRCARCH)/Makefile
>  
> +ifdef CONFIG_MCOUNT
> +KBUILD_CFLAGS  += -pg -fno-omit-frame-pointer -fno-optimize-sibling-calls
> +else
>  ifdef CONFIG_FRAME_POINTER
>  KBUILD_CFLAGS  += -fno-omit-frame-pointer -fno-optimize-sibling-calls
>  else
>  KBUILD_CFLAGS  += -fomit-frame-pointer
>  endif
> +endif
>  
>  ifdef CONFIG_DEBUG_INFO
>  KBUILD_CFLAGS  += -g

I'd much prefer if you used -finstrument-function since it's already
architecture independent .. It was suggested not too long ago.. There is
also another tracing patchset that is similar to this one which uses it
(KFT)..

Daniel

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt

Hi Sam!

On Thu, 3 Jan 2008, Sam Ravnborg wrote:
> > ---
> >
> > Index: linux-compile.git/Documentation/stable_api_nonsense.txt
> > ===
> > --- linux-compile.git.orig/Documentation/stable_api_nonsense.txt
> > 2008-01-03 01:02:28.0 -0500
> > +++ linux-compile.git/Documentation/stable_api_nonsense.txt 2008-01-03 
> > 01:02:33.0 -0500
> > @@ -62,6 +62,9 @@ consider the following facts about the L
> >- different structures can contain different fields
> >- Some functions may not be implemented at all, (i.e. some locks
> > compile away to nothing for non-SMP builds.)
> > +  - Parameter passing of variables from function to function can be
> > +   done in different ways (the CONFIG_REGPARM option controls
> > +   this.)
>
> As CONFIG_REGPARM affects calling convention we should add it to the
> list of symbols checked when loading modules (vermagic.h).

Good point, thanks for mentioning this.

> > Index: linux-compile.git/Makefile
> > ===
> > --- linux-compile.git.orig/Makefile 2008-01-03 01:02:28.0 -0500
> > +++ linux-compile.git/Makefile  2008-01-03 01:02:39.0 -0500
> > @@ -509,11 +509,15 @@ endif
> >
> >  include $(srctree)/arch/$(SRCARCH)/Makefile
> >
> > +ifdef CONFIG_MCOUNT
> > +KBUILD_CFLAGS  += -pg -fno-omit-frame-pointer 
> > -fno-optimize-sibling-calls
> > +else
> >  ifdef CONFIG_FRAME_POINTER
> >  KBUILD_CFLAGS  += -fno-omit-frame-pointer -fno-optimize-sibling-calls
> >  else
> >  KBUILD_CFLAGS  += -fomit-frame-pointer
> >  endif
> > +endif
> Could we please move these relations to Kconfig. So we do not end up in a 
> situation
> where CONFIG_FRAME_POINTER is set but the flag is not added.

Yes, most definitely. I thought this part was a bit sloppy, but it
"worked".  My next series will clean this up.

>
>
> >
> >  ifdef CONFIG_DEBUG_INFO
> >  KBUILD_CFLAGS  += -g
> > Index: linux-compile.git/arch/x86/Kconfig
> > ===
> > --- linux-compile.git.orig/arch/x86/Kconfig 2008-01-03 01:02:28.0 
> > -0500
> > +++ linux-compile.git/arch/x86/Kconfig  2008-01-03 01:02:33.0 
> > -0500
> > @@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
> > bool
> > default y
> >
> > +# function tracing might turn this off:
> > +config REGPARM
> > +   bool
> > +   depends on !MCOUNT
> > +   default y
> > +
>
> Could we please define config REGPARM in _one_ Kconfig file
> and let those who want it select it.
> If you consider this x86 spacific this should be included in the naming
> as in CONFIG_X86_REGPARM - and then the above is OK.

This is pending on resolving what effects REGPARM really has on mcount.
But, I'll keep REGPARM until it's solved, and in the mean time I'll clean
it up as you asked.


>
> Defining the same config variable in several files is not good (but done too 
> often these days).
>
> > Index: linux-compile.git/lib/mcount/Makefile
> > ===
> > --- /dev/null   1970-01-01 00:00:00.0 +
> > +++ linux-compile.git/lib/mcount/Makefile   2008-01-03 01:02:33.0 
> > -0500
> > @@ -0,0 +1,3 @@
> > +obj-$(CONFIG_MCOUNT) += libmcount.o
> > +
> > +libmcount-objs := mcount.o
>
> Preferred syntax is now:
> libmcount-y := mcount.o

Ah! I learn something new every day :-)  Yeah, I stumbled over a few
updates in formats with the makefiles.

Thanks!

-- Steve

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt

[Added Chris Wright, Rusty and Virt list because they were involved with
this issue before]

On Thu, 3 Jan 2008, Ingo Molnar wrote:

>
> * Steven Rostedt <[EMAIL PROTECTED]> wrote:
>
> > +# function tracing might turn this off:
> > +config REGPARM
> > +   bool
> > +   depends on !MCOUNT
> > +   default y
>
> are you sure -pg really needs this?

Nope! Arnaldo and I only carried it because you had it ;-)

> I just carried this along the years
> and went the path of least resistence, but we should not be
> reintroducing the !REGPARM build mode for the kernel. I'd not be
> surprised if there were a few issues with REGPARM + mcount, but we have
> to figure it out before merging ...

Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
remember the exact issues, but it did have something to do with the way
parameters were passed in.

Chris, do you remember what the issues were?

I'm also thinking that this is only an i386 issue.

Thanks,

-- Steve

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Ingo Molnar

* Steven Rostedt <[EMAIL PROTECTED]> wrote:

> +# function tracing might turn this off:
> +config REGPARM
> + bool
> + depends on !MCOUNT
> + default y

are you sure -pg really needs this? I just carried this along the years 
and went the path of least resistence, but we should not be 
reintroducing the !REGPARM build mode for the kernel. I'd not be 
surprised if there were a few issues with REGPARM + mcount, but we have 
to figure it out before merging ...

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Sam Ravnborg
Hi Steven.

On Thu, Jan 03, 2008 at 02:16:10AM -0500, Steven Rostedt wrote:
> If CONFIG_MCOUNT is selected and /proc/sys/kernel/mcount_enabled is set to a
> non-zero value the mcount routine will be called everytime we enter a kernel
> function that is not marked with the "notrace" attribute.
> 
> The mcount routine will then call a registered function if a function
> happens to be registered.
> 
> [This code has been highly hacked by Steven Rostedt, so don't
>  blame Arnaldo for all of this ;-) ]
> 
> Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
> Signed-off-by: Steven Rostedt <[EMAIL PROTECTED]>
> ---
> 
> Index: linux-compile.git/Documentation/stable_api_nonsense.txt
> ===
> --- linux-compile.git.orig/Documentation/stable_api_nonsense.txt  
> 2008-01-03 01:02:28.0 -0500
> +++ linux-compile.git/Documentation/stable_api_nonsense.txt   2008-01-03 
> 01:02:33.0 -0500
> @@ -62,6 +62,9 @@ consider the following facts about the L
>- different structures can contain different fields
>- Some functions may not be implemented at all, (i.e. some locks
>   compile away to nothing for non-SMP builds.)
> +  - Parameter passing of variables from function to function can be
> + done in different ways (the CONFIG_REGPARM option controls
> + this.)

As CONFIG_REGPARM affects calling convention we should add it to the
list of symbols checked when loading modules (vermagic.h).


>- Memory within the kernel can be aligned in different ways,
>   depending on the build options.
>- Linux runs on a wide range of different processor architectures.
> Index: linux-compile.git/Makefile
> ===
> --- linux-compile.git.orig/Makefile   2008-01-03 01:02:28.0 -0500
> +++ linux-compile.git/Makefile2008-01-03 01:02:39.0 -0500
> @@ -509,11 +509,15 @@ endif
>  
>  include $(srctree)/arch/$(SRCARCH)/Makefile
>  
> +ifdef CONFIG_MCOUNT
> +KBUILD_CFLAGS+= -pg -fno-omit-frame-pointer 
> -fno-optimize-sibling-calls
> +else
>  ifdef CONFIG_FRAME_POINTER
>  KBUILD_CFLAGS+= -fno-omit-frame-pointer -fno-optimize-sibling-calls
>  else
>  KBUILD_CFLAGS+= -fomit-frame-pointer
>  endif
> +endif
Could we please move these relations to Kconfig. So we do not end up in a 
situation
where CONFIG_FRAME_POINTER is set but the flag is not added.



>  
>  ifdef CONFIG_DEBUG_INFO
>  KBUILD_CFLAGS+= -g
> Index: linux-compile.git/arch/x86/Kconfig
> ===
> --- linux-compile.git.orig/arch/x86/Kconfig   2008-01-03 01:02:28.0 
> -0500
> +++ linux-compile.git/arch/x86/Kconfig2008-01-03 01:02:33.0 
> -0500
> @@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
>   bool
>   default y
>  
> +# function tracing might turn this off:
> +config REGPARM
> + bool
> + depends on !MCOUNT
> + default y
> +

Could we please define config REGPARM in _one_ Kconfig file
and let those who want it select it.
If you consider this x86 spacific this should be included in the naming
as in CONFIG_X86_REGPARM - and then the above is OK.

Defining the same config variable in several files is not good (but done too 
often these days).

> Index: linux-compile.git/lib/mcount/Makefile
> ===
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ linux-compile.git/lib/mcount/Makefile 2008-01-03 01:02:33.0 
> -0500
> @@ -0,0 +1,3 @@
> +obj-$(CONFIG_MCOUNT) += libmcount.o
> +
> +libmcount-objs := mcount.o

Preferred syntax is now:
libmcount-y := mcount.o

Sam
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Sam Ravnborg
Hi Steven.

On Thu, Jan 03, 2008 at 02:16:10AM -0500, Steven Rostedt wrote:
 If CONFIG_MCOUNT is selected and /proc/sys/kernel/mcount_enabled is set to a
 non-zero value the mcount routine will be called everytime we enter a kernel
 function that is not marked with the notrace attribute.
 
 The mcount routine will then call a registered function if a function
 happens to be registered.
 
 [This code has been highly hacked by Steven Rostedt, so don't
  blame Arnaldo for all of this ;-) ]
 
 Signed-off-by: Arnaldo Carvalho de Melo [EMAIL PROTECTED]
 Signed-off-by: Steven Rostedt [EMAIL PROTECTED]
 ---
 
 Index: linux-compile.git/Documentation/stable_api_nonsense.txt
 ===
 --- linux-compile.git.orig/Documentation/stable_api_nonsense.txt  
 2008-01-03 01:02:28.0 -0500
 +++ linux-compile.git/Documentation/stable_api_nonsense.txt   2008-01-03 
 01:02:33.0 -0500
 @@ -62,6 +62,9 @@ consider the following facts about the L
- different structures can contain different fields
- Some functions may not be implemented at all, (i.e. some locks
   compile away to nothing for non-SMP builds.)
 +  - Parameter passing of variables from function to function can be
 + done in different ways (the CONFIG_REGPARM option controls
 + this.)

As CONFIG_REGPARM affects calling convention we should add it to the
list of symbols checked when loading modules (vermagic.h).


- Memory within the kernel can be aligned in different ways,
   depending on the build options.
- Linux runs on a wide range of different processor architectures.
 Index: linux-compile.git/Makefile
 ===
 --- linux-compile.git.orig/Makefile   2008-01-03 01:02:28.0 -0500
 +++ linux-compile.git/Makefile2008-01-03 01:02:39.0 -0500
 @@ -509,11 +509,15 @@ endif
  
  include $(srctree)/arch/$(SRCARCH)/Makefile
  
 +ifdef CONFIG_MCOUNT
 +KBUILD_CFLAGS+= -pg -fno-omit-frame-pointer 
 -fno-optimize-sibling-calls
 +else
  ifdef CONFIG_FRAME_POINTER
  KBUILD_CFLAGS+= -fno-omit-frame-pointer -fno-optimize-sibling-calls
  else
  KBUILD_CFLAGS+= -fomit-frame-pointer
  endif
 +endif
Could we please move these relations to Kconfig. So we do not end up in a 
situation
where CONFIG_FRAME_POINTER is set but the flag is not added.



  
  ifdef CONFIG_DEBUG_INFO
  KBUILD_CFLAGS+= -g
 Index: linux-compile.git/arch/x86/Kconfig
 ===
 --- linux-compile.git.orig/arch/x86/Kconfig   2008-01-03 01:02:28.0 
 -0500
 +++ linux-compile.git/arch/x86/Kconfig2008-01-03 01:02:33.0 
 -0500
 @@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
   bool
   default y
  
 +# function tracing might turn this off:
 +config REGPARM
 + bool
 + depends on !MCOUNT
 + default y
 +

Could we please define config REGPARM in _one_ Kconfig file
and let those who want it select it.
If you consider this x86 spacific this should be included in the naming
as in CONFIG_X86_REGPARM - and then the above is OK.

Defining the same config variable in several files is not good (but done too 
often these days).

 Index: linux-compile.git/lib/mcount/Makefile
 ===
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ linux-compile.git/lib/mcount/Makefile 2008-01-03 01:02:33.0 
 -0500
 @@ -0,0 +1,3 @@
 +obj-$(CONFIG_MCOUNT) += libmcount.o
 +
 +libmcount-objs := mcount.o

Preferred syntax is now:
libmcount-y := mcount.o

Sam
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Ingo Molnar

* Steven Rostedt [EMAIL PROTECTED] wrote:

 +# function tracing might turn this off:
 +config REGPARM
 + bool
 + depends on !MCOUNT
 + default y

are you sure -pg really needs this? I just carried this along the years 
and went the path of least resistence, but we should not be 
reintroducing the !REGPARM build mode for the kernel. I'd not be 
surprised if there were a few issues with REGPARM + mcount, but we have 
to figure it out before merging ...

Ingo
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt

[Added Chris Wright, Rusty and Virt list because they were involved with
this issue before]

On Thu, 3 Jan 2008, Ingo Molnar wrote:


 * Steven Rostedt [EMAIL PROTECTED] wrote:

  +# function tracing might turn this off:
  +config REGPARM
  +   bool
  +   depends on !MCOUNT
  +   default y

 are you sure -pg really needs this?

Nope! Arnaldo and I only carried it because you had it ;-)

 I just carried this along the years
 and went the path of least resistence, but we should not be
 reintroducing the !REGPARM build mode for the kernel. I'd not be
 surprised if there were a few issues with REGPARM + mcount, but we have
 to figure it out before merging ...

Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
remember the exact issues, but it did have something to do with the way
parameters were passed in.

Chris, do you remember what the issues were?

I'm also thinking that this is only an i386 issue.

Thanks,

-- Steve

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Daniel Walker

On Thu, 2008-01-03 at 02:16 -0500, Steven Rostedt wrote:
 Index: linux-compile.git/Makefile
 ===
 --- linux-compile.git.orig/Makefile 2008-01-03 01:02:28.0 -0500
 +++ linux-compile.git/Makefile  2008-01-03 01:02:39.0 -0500
 @@ -509,11 +509,15 @@ endif
  
  include $(srctree)/arch/$(SRCARCH)/Makefile
  
 +ifdef CONFIG_MCOUNT
 +KBUILD_CFLAGS  += -pg -fno-omit-frame-pointer -fno-optimize-sibling-calls
 +else
  ifdef CONFIG_FRAME_POINTER
  KBUILD_CFLAGS  += -fno-omit-frame-pointer -fno-optimize-sibling-calls
  else
  KBUILD_CFLAGS  += -fomit-frame-pointer
  endif
 +endif
  
  ifdef CONFIG_DEBUG_INFO
  KBUILD_CFLAGS  += -g

I'd much prefer if you used -finstrument-function since it's already
architecture independent .. It was suggested not too long ago.. There is
also another tracing patchset that is similar to this one which uses it
(KFT)..

Daniel

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Mathieu Desnoyers
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
...
 Index: linux-compile.git/arch/x86/Kconfig
 ===
 --- linux-compile.git.orig/arch/x86/Kconfig   2008-01-03 01:02:28.0 
 -0500
 +++ linux-compile.git/arch/x86/Kconfig2008-01-03 01:02:33.0 
 -0500
 @@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
   bool
   default y
  
 +# function tracing might turn this off:
 +config REGPARM
 + bool
 + depends on !MCOUNT
 + default y
 +
  config CLOCKSOURCE_WATCHDOG
   bool
   default y

 Index: linux-compile.git/arch/x86/kernel/mcount-wrapper.S
 ===
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ linux-compile.git/arch/x86/kernel/mcount-wrapper.S2008-01-03 
 01:02:33.0 -0500
 @@ -0,0 +1,25 @@
 +/*
 + *  linux/arch/x86/mcount-wrapper.S
 + *
 + *  Copyright (C) 2004 Ingo Molnar
 + */
 +
 +.globl mcount
 +mcount:
 + cmpl $0, mcount_enabled
 + jz out
 +
 + push %ebp
 + mov %esp, %ebp
 + pushl %eax
 + pushl %ecx
 + pushl %edx
 +
 + call __mcount
 +
 + popl %edx
 + popl %ecx
 + popl %eax
 + popl %ebp

Writing this stack setup in assembly may be the one thing that conflicts
with REGPARM ?

 +out:
 + ret
 Index: linux-compile.git/include/linux/linkage.h
 ===
 --- linux-compile.git.orig/include/linux/linkage.h2008-01-03 
 01:02:28.0 -0500
 +++ linux-compile.git/include/linux/linkage.h 2008-01-03 01:02:33.0 
 -0500
 @@ -3,6 +3,8 @@
  
  #include asm/linkage.h
  
 +#define notrace __attribute__((no_instrument_function))
 +
  #ifdef __cplusplus
  #define CPP_ASMLINKAGE extern C
  #else
 Index: linux-compile.git/kernel/sysctl.c
 ===
 --- linux-compile.git.orig/kernel/sysctl.c2008-01-03 01:02:28.0 
 -0500
 +++ linux-compile.git/kernel/sysctl.c 2008-01-03 01:02:33.0 -0500
 @@ -46,6 +46,7 @@
  #include linux/nfs_fs.h
  #include linux/acpi.h
  #include linux/reboot.h
 +#include linux/mcount.h
  
  #include asm/uaccess.h
  #include asm/processor.h
 @@ -470,6 +471,16 @@ static struct ctl_table kern_table[] = {
   .mode   = 0644,
   .proc_handler   = proc_dointvec,
   },
 +#ifdef CONFIG_MCOUNT
 + {
 + .ctl_name   = CTL_UNNUMBERED,
 + .procname   = mcount_enabled,
 + .data   = mcount_enabled,
 + .maxlen = sizeof(int),
 + .mode   = 0644,
 + .proc_handler   = proc_dointvec,
 + },
 +#endif
  #ifdef CONFIG_KMOD
   {
   .ctl_name   = KERN_MODPROBE,
 Index: linux-compile.git/lib/Kconfig.debug
 ===
 --- linux-compile.git.orig/lib/Kconfig.debug  2008-01-03 01:02:28.0 
 -0500
 +++ linux-compile.git/lib/Kconfig.debug   2008-01-03 01:02:33.0 
 -0500
 @@ -517,4 +517,6 @@ config FAULT_INJECTION_STACKTRACE_FILTER
   help
 Provide stacktrace filter for fault-injection capabilities
  
 +source lib/mcount/Kconfig
 +
  source samples/Kconfig
 Index: linux-compile.git/lib/Makefile
 ===
 --- linux-compile.git.orig/lib/Makefile   2008-01-03 01:02:28.0 
 -0500
 +++ linux-compile.git/lib/Makefile2008-01-03 01:02:33.0 -0500
 @@ -66,6 +66,8 @@ obj-$(CONFIG_AUDIT_GENERIC) += audit.o
  obj-$(CONFIG_SWIOTLB) += swiotlb.o
  obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o
  
 +obj-$(CONFIG_MCOUNT) += mcount/
 +
  lib-$(CONFIG_GENERIC_BUG) += bug.o
  
  hostprogs-y  := gen_crc32table
 Index: linux-compile.git/lib/mcount/Kconfig
 ===
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ linux-compile.git/lib/mcount/Kconfig  2008-01-03 01:02:33.0 
 -0500
 @@ -0,0 +1,6 @@
 +
 +# MCOUNT itself is useless, or will just be added overhead.
 +# It needs something to register a function with it.
 +config MCOUNT
 + bool
 + depends on DEBUG_KERNEL
 Index: linux-compile.git/lib/mcount/Makefile
 ===
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ linux-compile.git/lib/mcount/Makefile 2008-01-03 01:02:33.0 
 -0500
 @@ -0,0 +1,3 @@
 +obj-$(CONFIG_MCOUNT) += libmcount.o
 +
 +libmcount-objs := mcount.o
 Index: linux-compile.git/lib/mcount/mcount.c
 ===
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ linux-compile.git/lib/mcount/mcount.c 2008-01-03 01:02:33.0 
 -0500
 @@ -0,0 +1,78 @@
 +/*
 + * Infrastructure for profiling code inserted by 'gcc -pg'.
 + *
 + * Copyright (C) 2007 

Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt


On Thu, 3 Jan 2008, Mathieu Desnoyers wrote:
 .
  Index: linux-compile.git/arch/x86/kernel/mcount-wrapper.S
  ===
  --- /dev/null   1970-01-01 00:00:00.0 +
  +++ linux-compile.git/arch/x86/kernel/mcount-wrapper.S  2008-01-03 
  01:02:33.0 -0500
  @@ -0,0 +1,25 @@
  +/*
  + *  linux/arch/x86/mcount-wrapper.S
  + *
  + *  Copyright (C) 2004 Ingo Molnar
  + */
  +
  +.globl mcount
  +mcount:
  +   cmpl $0, mcount_enabled
  +   jz out
  +
  +   push %ebp
  +   mov %esp, %ebp
  +   pushl %eax
  +   pushl %ecx
  +   pushl %edx
  +
  +   call __mcount
  +
  +   popl %edx
  +   popl %ecx
  +   popl %eax
  +   popl %ebp

 Writing this stack setup in assembly may be the one thing that conflicts
 with REGPARM ?

Could be.

  +
  +/** __mcount - hook for profiling
  + *
  + * This routine is called from the arch specific mcount routine, that in 
  turn is
  + * called from code inserted by gcc -pg.
  + */
  +notrace void __mcount(void)
  +{
  +   if (mcount_trace_function != dummy_mcount_tracer)
  +   mcount_trace_function(CALLER_ADDR1, CALLER_ADDR2);
  +}

 I don't see what the mcount_trace_function test gives us here : we
 already tested mcount_enabled.

It's probably me being anal. I did a compare over a function call.
I guess calling dummy_mcount_tracer is OK. I originally had it as NULL
and that had too many races.

  Index: linux-compile.git/arch/x86/kernel/entry_64.S
  ===
  --- linux-compile.git.orig/arch/x86/kernel/entry_64.S   2008-01-03 
  01:02:28.0 -0500
  +++ linux-compile.git/arch/x86/kernel/entry_64.S2008-01-03 
  01:02:33.0 -0500
  @@ -53,6 +53,52 @@
 
  .code64
 
  +#ifdef CONFIG_MCOUNT
  +
  +ENTRY(mcount)
  +   cmpl $0, mcount_enabled
  +   jz out
  +
  +   push %rbp
  +
  +   lea dummy_mcount_tracer, %rbp
  +   cmpq %rbp, mcount_trace_function


 Ok, so we normally jump over the function call (with mcount_enabled being 0)
 but we can call it in rare cases when it is being set concurrently (even
 though the mcount_trace_function is there, concurrency could still allow
 the call).

 Therefore we have one data cache hit when disabled (mcount_enabled), and
 must do a supplementary comparison before the call when enabled. I
 wonder why the cmpq %rbp, mcount_trace_function test is there at all ?

We can have mcount_enabled on without a tracing function to call. So this
simply saves us from doing another function call.

I've been debating about getting rid of the mcount_enabled, but it makes
it easy for systemtap to disable tracing. We don't even need to modify
systemtap with this, since systemtap already has the ability to turn
mcount_enabled on and off. But it will be a bit uglier to have systemtap
modify the tracing function.

Perhaps calling dummy_mcount_tracer isn't that bad. I'll need to do some
benchmarks between the two.

-- Steve



  +   jz out_rbp
  +
  +   mov %rsp,%rbp
  +
  +   push %r11
  +   push %r10
  +   push %r9
  +   push %r8
  +   push %rdi
  +   push %rsi
  +   push %rdx
  +   push %rcx
  +   push %rax
  +
  +   mov 0x0(%rbp),%rax
  +   mov 0x8(%rbp),%rdi
  +   mov 0x8(%rax),%rsi
  +
  +   call   *mcount_trace_function
  +
  +   pop %rax
  +   pop %rcx
  +   pop %rdx
  +   pop %rsi
  +   pop %rdi
  +   pop %r8
  +   pop %r9
  +   pop %r10
  +   pop %r11
  +
  +out_rbp:
  +   pop %rbp
  +out:
  +   ret
  +#endif
  +
   #ifndef CONFIG_PREEMPT
   #define retint_kernel retint_restore_args
   #endif
 
  --
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Chris Wright
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
 Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
 remember the exact issues, but it did have something to do with the way
 parameters were passed in.
 
 Chris, do you remember what the issues were?

Yes, paravirt ops have a well-specified calling convention (register
based).  There was a cleanup that Andi did that caused the problem
because it removed all the fastcall annotations since -mregparm=3
is now always on for i386.  Since MCOUNT disables REGPARM the calling
convention changes (caller pushes to stack, callee expects register)
chaos ensues.  I sent a patch to fix that quite some months back, but
it went stale and I neglected to update it.  Would you like me to dig
it up refresh and resend?

thanks,
-chris
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Chris Wright
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
 On Thu, 3 Jan 2008, Chris Wright wrote:
  Yes, paravirt ops have a well-specified calling convention (register
  based).  There was a cleanup that Andi did that caused the problem
  because it removed all the fastcall annotations since -mregparm=3
  is now always on for i386.  Since MCOUNT disables REGPARM the calling
  convention changes (caller pushes to stack, callee expects register)
  chaos ensues.  I sent a patch to fix that quite some months back, but
  it went stale and I neglected to update it.  Would you like me to dig
  it up refresh and resend?
 
 Chris, thanks for the refresher.
 
 I'm going to see if we can remove the REGPARM hack and change the way
 mcount does its calls. Maybe this will fix things for us.

I don't recall why mcount disables regparm, but I think you're on the
right path to remove that dependency.

thanks,
-chris
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Steven Rostedt

On Thu, 3 Jan 2008, Chris Wright wrote:


 Yes, paravirt ops have a well-specified calling convention (register
 based).  There was a cleanup that Andi did that caused the problem
 because it removed all the fastcall annotations since -mregparm=3
 is now always on for i386.  Since MCOUNT disables REGPARM the calling
 convention changes (caller pushes to stack, callee expects register)
 chaos ensues.  I sent a patch to fix that quite some months back, but
 it went stale and I neglected to update it.  Would you like me to dig
 it up refresh and resend?

Chris, thanks for the refresher.

I'm going to see if we can remove the REGPARM hack and change the way
mcount does its calls. Maybe this will fix things for us.

-- Steve

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-03 Thread Jeremy Fitzhardinge
Chris Wright wrote:
 * Steven Rostedt ([EMAIL PROTECTED]) wrote:
   
 Hmm, I know paravirt-ops had an issue with mcount in the RT tree. I can't
 remember the exact issues, but it did have something to do with the way
 parameters were passed in.

 Chris, do you remember what the issues were?
 

 Yes, paravirt ops have a well-specified calling convention (register
 based).  There was a cleanup that Andi did that caused the problem
 because it removed all the fastcall annotations since -mregparm=3
 is now always on for i386.  Since MCOUNT disables REGPARM the calling
 convention changes (caller pushes to stack, callee expects register)
 chaos ensues.  I sent a patch to fix that quite some months back, but
 it went stale and I neglected to update it.  Would you like me to dig
 it up refresh and resend?

Ingo/Andrew have been accepting patches to systematically remove all the
fastcall annotations from the kernel, so adding them back isn't going to
help.

Ingo and I discussed whether we need to reannotate paravirt.h (either
with fastcall or something else indicating a register-only calling
convention), specifically because of the -pg issue, but I think the
conclusion was that whatever problem existed no longer does, and there's
no incompatibility between -pg and regparm.

J
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-02 Thread Steven Rostedt
If CONFIG_MCOUNT is selected and /proc/sys/kernel/mcount_enabled is set to a
non-zero value the mcount routine will be called everytime we enter a kernel
function that is not marked with the "notrace" attribute.

The mcount routine will then call a registered function if a function
happens to be registered.

[This code has been highly hacked by Steven Rostedt, so don't
 blame Arnaldo for all of this ;-) ]

Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
Signed-off-by: Steven Rostedt <[EMAIL PROTECTED]>
---
 Documentation/stable_api_nonsense.txt |3 +
 Makefile  |4 +
 arch/x86/Kconfig  |6 ++
 arch/x86/Makefile_32  |4 +
 arch/x86/kernel/Makefile_32   |1 
 arch/x86/kernel/entry_64.S|   46 
 arch/x86/kernel/mcount-wrapper.S  |   25 ++
 include/linux/linkage.h   |2 
 include/linux/mcount.h|   21 +
 kernel/sysctl.c   |   11 
 lib/Kconfig.debug |2 
 lib/Makefile  |2 
 lib/mcount/Kconfig|6 ++
 lib/mcount/Makefile   |3 +
 lib/mcount/mcount.c   |   78 ++
 15 files changed, 213 insertions(+), 1 deletion(-)
 create mode 100644 arch/i386/kernel/mcount-wrapper.S
 create mode 100644 lib/mcount/Kconfig
 create mode 100644 lib/mcount/Makefile
 create mode 100644 lib/mcount/mcount.c
 create mode 100644 lib/mcount/mcount.h

Index: linux-compile.git/Documentation/stable_api_nonsense.txt
===
--- linux-compile.git.orig/Documentation/stable_api_nonsense.txt
2008-01-03 01:02:28.0 -0500
+++ linux-compile.git/Documentation/stable_api_nonsense.txt 2008-01-03 
01:02:33.0 -0500
@@ -62,6 +62,9 @@ consider the following facts about the L
   - different structures can contain different fields
   - Some functions may not be implemented at all, (i.e. some locks
compile away to nothing for non-SMP builds.)
+  - Parameter passing of variables from function to function can be
+   done in different ways (the CONFIG_REGPARM option controls
+   this.)
   - Memory within the kernel can be aligned in different ways,
depending on the build options.
   - Linux runs on a wide range of different processor architectures.
Index: linux-compile.git/Makefile
===
--- linux-compile.git.orig/Makefile 2008-01-03 01:02:28.0 -0500
+++ linux-compile.git/Makefile  2008-01-03 01:02:39.0 -0500
@@ -509,11 +509,15 @@ endif
 
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
+ifdef CONFIG_MCOUNT
+KBUILD_CFLAGS  += -pg -fno-omit-frame-pointer -fno-optimize-sibling-calls
+else
 ifdef CONFIG_FRAME_POINTER
 KBUILD_CFLAGS  += -fno-omit-frame-pointer -fno-optimize-sibling-calls
 else
 KBUILD_CFLAGS  += -fomit-frame-pointer
 endif
+endif
 
 ifdef CONFIG_DEBUG_INFO
 KBUILD_CFLAGS  += -g
Index: linux-compile.git/arch/x86/Kconfig
===
--- linux-compile.git.orig/arch/x86/Kconfig 2008-01-03 01:02:28.0 
-0500
+++ linux-compile.git/arch/x86/Kconfig  2008-01-03 01:02:33.0 -0500
@@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
bool
default y
 
+# function tracing might turn this off:
+config REGPARM
+   bool
+   depends on !MCOUNT
+   default y
+
 config CLOCKSOURCE_WATCHDOG
bool
default y
Index: linux-compile.git/arch/x86/Makefile_32
===
--- linux-compile.git.orig/arch/x86/Makefile_32 2008-01-03 01:02:28.0 
-0500
+++ linux-compile.git/arch/x86/Makefile_32  2008-01-03 01:02:33.0 
-0500
@@ -37,7 +37,7 @@ LDFLAGS_vmlinux := --emit-relocs
 endif
 CHECKFLAGS += -D__i386__
 
-KBUILD_CFLAGS += -pipe -msoft-float -mregparm=3 -freg-struct-return
+KBUILD_CFLAGS += -pipe -msoft-float
 
 # prevent gcc from keeping the stack 16 byte aligned
 KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
@@ -45,6 +45,8 @@ KBUILD_CFLAGS += $(call cc-option,-mpref
 # CPU-specific tuning. Anything which can be shared with UML should go here.
 include $(srctree)/arch/x86/Makefile_32.cpu
 
+cflags-$(CONFIG_REGPARM) += -mregparm=3 -freg-struct-return
+
 # temporary until string.h is fixed
 cflags-y += -ffreestanding
 
Index: linux-compile.git/arch/x86/kernel/Makefile_32
===
--- linux-compile.git.orig/arch/x86/kernel/Makefile_32  2008-01-03 
01:02:28.0 -0500
+++ linux-compile.git/arch/x86/kernel/Makefile_32   2008-01-03 
01:02:33.0 -0500
@@ -23,6 +23,7 @@ obj-$(CONFIG_APM) += apm_32.o
 obj-$(CONFIG_X86_SMP)  += smp_32.o smpboot_32.o 

[RFC PATCH 01/11] Add basic support for gcc profiler instrumentation

2008-01-02 Thread Steven Rostedt
If CONFIG_MCOUNT is selected and /proc/sys/kernel/mcount_enabled is set to a
non-zero value the mcount routine will be called everytime we enter a kernel
function that is not marked with the notrace attribute.

The mcount routine will then call a registered function if a function
happens to be registered.

[This code has been highly hacked by Steven Rostedt, so don't
 blame Arnaldo for all of this ;-) ]

Signed-off-by: Arnaldo Carvalho de Melo [EMAIL PROTECTED]
Signed-off-by: Steven Rostedt [EMAIL PROTECTED]
---
 Documentation/stable_api_nonsense.txt |3 +
 Makefile  |4 +
 arch/x86/Kconfig  |6 ++
 arch/x86/Makefile_32  |4 +
 arch/x86/kernel/Makefile_32   |1 
 arch/x86/kernel/entry_64.S|   46 
 arch/x86/kernel/mcount-wrapper.S  |   25 ++
 include/linux/linkage.h   |2 
 include/linux/mcount.h|   21 +
 kernel/sysctl.c   |   11 
 lib/Kconfig.debug |2 
 lib/Makefile  |2 
 lib/mcount/Kconfig|6 ++
 lib/mcount/Makefile   |3 +
 lib/mcount/mcount.c   |   78 ++
 15 files changed, 213 insertions(+), 1 deletion(-)
 create mode 100644 arch/i386/kernel/mcount-wrapper.S
 create mode 100644 lib/mcount/Kconfig
 create mode 100644 lib/mcount/Makefile
 create mode 100644 lib/mcount/mcount.c
 create mode 100644 lib/mcount/mcount.h

Index: linux-compile.git/Documentation/stable_api_nonsense.txt
===
--- linux-compile.git.orig/Documentation/stable_api_nonsense.txt
2008-01-03 01:02:28.0 -0500
+++ linux-compile.git/Documentation/stable_api_nonsense.txt 2008-01-03 
01:02:33.0 -0500
@@ -62,6 +62,9 @@ consider the following facts about the L
   - different structures can contain different fields
   - Some functions may not be implemented at all, (i.e. some locks
compile away to nothing for non-SMP builds.)
+  - Parameter passing of variables from function to function can be
+   done in different ways (the CONFIG_REGPARM option controls
+   this.)
   - Memory within the kernel can be aligned in different ways,
depending on the build options.
   - Linux runs on a wide range of different processor architectures.
Index: linux-compile.git/Makefile
===
--- linux-compile.git.orig/Makefile 2008-01-03 01:02:28.0 -0500
+++ linux-compile.git/Makefile  2008-01-03 01:02:39.0 -0500
@@ -509,11 +509,15 @@ endif
 
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
+ifdef CONFIG_MCOUNT
+KBUILD_CFLAGS  += -pg -fno-omit-frame-pointer -fno-optimize-sibling-calls
+else
 ifdef CONFIG_FRAME_POINTER
 KBUILD_CFLAGS  += -fno-omit-frame-pointer -fno-optimize-sibling-calls
 else
 KBUILD_CFLAGS  += -fomit-frame-pointer
 endif
+endif
 
 ifdef CONFIG_DEBUG_INFO
 KBUILD_CFLAGS  += -g
Index: linux-compile.git/arch/x86/Kconfig
===
--- linux-compile.git.orig/arch/x86/Kconfig 2008-01-03 01:02:28.0 
-0500
+++ linux-compile.git/arch/x86/Kconfig  2008-01-03 01:02:33.0 -0500
@@ -28,6 +28,12 @@ config GENERIC_CMOS_UPDATE
bool
default y
 
+# function tracing might turn this off:
+config REGPARM
+   bool
+   depends on !MCOUNT
+   default y
+
 config CLOCKSOURCE_WATCHDOG
bool
default y
Index: linux-compile.git/arch/x86/Makefile_32
===
--- linux-compile.git.orig/arch/x86/Makefile_32 2008-01-03 01:02:28.0 
-0500
+++ linux-compile.git/arch/x86/Makefile_32  2008-01-03 01:02:33.0 
-0500
@@ -37,7 +37,7 @@ LDFLAGS_vmlinux := --emit-relocs
 endif
 CHECKFLAGS += -D__i386__
 
-KBUILD_CFLAGS += -pipe -msoft-float -mregparm=3 -freg-struct-return
+KBUILD_CFLAGS += -pipe -msoft-float
 
 # prevent gcc from keeping the stack 16 byte aligned
 KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
@@ -45,6 +45,8 @@ KBUILD_CFLAGS += $(call cc-option,-mpref
 # CPU-specific tuning. Anything which can be shared with UML should go here.
 include $(srctree)/arch/x86/Makefile_32.cpu
 
+cflags-$(CONFIG_REGPARM) += -mregparm=3 -freg-struct-return
+
 # temporary until string.h is fixed
 cflags-y += -ffreestanding
 
Index: linux-compile.git/arch/x86/kernel/Makefile_32
===
--- linux-compile.git.orig/arch/x86/kernel/Makefile_32  2008-01-03 
01:02:28.0 -0500
+++ linux-compile.git/arch/x86/kernel/Makefile_32   2008-01-03 
01:02:33.0 -0500
@@ -23,6 +23,7 @@ obj-$(CONFIG_APM) += apm_32.o
 obj-$(CONFIG_X86_SMP)  += smp_32.o smpboot_32.o