Re: [mm patch] oprofile: backtrace operation does not initialized

From: Greg Banks
Date: Wed Dec 08 2004 - 20:52:17 EST


On Thu, Dec 09, 2004 at 01:46:22AM +0000, John Levon wrote:
> On Thu, Dec 09, 2004 at 11:39:06AM +1100, Greg Banks wrote:
>
> > But for now I don't see any drama with leaving in the ->setup() and
> > ->shutdown() methods when rewriting the ops structure. Ditto for
> > the ->create_files() methods.
>
> Wouldn't this mean that we try to set up the NMI stuff regardless of
> forcing the timer ? I can imagine a flaky system where somebody needs to
> avoid going near that stuff.
>
> timer_init() making sure to set all fields seems reasonable to me. Or
> oprofile_init() could grab ->backtrace, memset the structure, then
> replace ->backtrace...

Ok, how about this patch?

Greg.
--
Greg Banks, R&D Software Engineer, SGI Australian Software Group.
I don't speak for SGI.
Allow stack tracing to work when sampling on timer is forced
using the timer=1 boot option. Reported by Akinobu Mita.

Signed-off-by: Greg Banks <gnb@xxxxxxxxxxxxxxxxx>
---
oprof.c | 6 ++----
timer_int.c | 3 +++
2 files changed, 5 insertions(+), 4 deletions(-)

Index: linux/drivers/oprofile/oprof.c
===================================================================
--- linux.orig/drivers/oprofile/oprof.c 2004-12-04 19:43:37.%N +1100
+++ linux/drivers/oprofile/oprof.c 2004-12-09 09:25:02.%N +1100
@@ -155,13 +155,11 @@ static int __init oprofile_init(void)
{
int err = 0;

- /* this is our fallback case */
- oprofile_timer_init(&oprofile_ops);
+ oprofile_arch_init(&oprofile_ops);

if (timer) {
printk(KERN_INFO "oprofile: using timer interrupt.\n");
- } else {
- oprofile_arch_init(&oprofile_ops);
+ oprofile_timer_init(&oprofile_ops);
}

err = oprofilefs_register();
Index: linux/drivers/oprofile/timer_int.c
===================================================================
--- linux.orig/drivers/oprofile/timer_int.c 2004-12-04 19:43:37.%N +1100
+++ linux/drivers/oprofile/timer_int.c 2004-12-09 12:48:52.%N +1100
@@ -37,6 +37,9 @@ static void timer_stop(void)

void __init oprofile_timer_init(struct oprofile_operations * ops)
{
+ ops->create_files = NULL;
+ ops->setup = NULL;
+ ops->shutdown = NULL;
ops->start = timer_start;
ops->stop = timer_stop;
ops->cpu_type = "timer";