2005-01-22 09:52:52

by Akinobu Mita

[permalink] [raw]
Subject: [PATCH] oprofile: falling back on timer interrupt mode

Hello.

When some hardware setups or architectures do not allow OProfile to use
performance counters, OProfile operates in timer mode.

But, from 2.6.11-rc1, we need to specify the module parameter "timer=1"
to work on timer interrupt mode. Furthermore we can easily get oops by
reading /dev/oprofile/cpu_type.

Signed-off-by: Akinobu Mita <[email protected]>

arch/alpha/oprofile/common.c | 6 ++++--
arch/arm/oprofile/common.c | 7 +++++--
arch/arm/oprofile/init.c | 8 ++++++--
arch/i386/oprofile/init.c | 4 +++-
arch/ia64/oprofile/init.c | 8 ++++++--
arch/m32r/oprofile/init.c | 3 ++-
arch/parisc/oprofile/init.c | 3 ++-
arch/ppc64/oprofile/common.c | 6 ++++--
arch/s390/oprofile/init.c | 3 ++-
arch/sh/oprofile/op_model_null.c | 3 ++-
arch/sparc64/oprofile/init.c | 3 ++-
drivers/oprofile/oprof.c | 6 +++---
include/linux/oprofile.h | 2 +-
13 files changed, 42 insertions(+), 20 deletions(-)


diff -rup 2.6-bk.orig/arch/alpha/oprofile/common.c 2.6-bk/arch/alpha/oprofile/common.c
--- 2.6-bk.orig/arch/alpha/oprofile/common.c 2005-01-15 16:01:59.000000000 +0900
+++ 2.6-bk/arch/alpha/oprofile/common.c 2005-01-15 16:16:16.000000000 +0900
@@ -138,7 +138,7 @@ op_axp_create_files(struct super_block *
return 0;
}

-void __init
+int __init
oprofile_arch_init(struct oprofile_operations *ops)
{
struct op_axp_model *lmodel = NULL;
@@ -166,7 +166,7 @@ oprofile_arch_init(struct oprofile_opera
}

if (!lmodel)
- return;
+ return -ENODEV;
model = lmodel;

ops->create_files = op_axp_create_files;
@@ -178,6 +178,8 @@ oprofile_arch_init(struct oprofile_opera

printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
lmodel->cpu_type);
+
+ return 0;
}


diff -rup 2.6-bk.orig/arch/arm/oprofile/common.c 2.6-bk/arch/arm/oprofile/common.c
--- 2.6-bk.orig/arch/arm/oprofile/common.c 2005-01-15 16:02:03.000000000 +0900
+++ 2.6-bk/arch/arm/oprofile/common.c 2005-01-15 16:33:03.000000000 +0900
@@ -105,12 +105,13 @@ static void pmu_stop(void)
up(&pmu_sem);
}

-void __init pmu_init(struct oprofile_operations *ops, struct op_arm_model_spec *spec)
+int __init
+pmu_init(struct oprofile_operations *ops, struct op_arm_model_spec *spec)
{
init_MUTEX(&pmu_sem);

if (spec->init() < 0)
- return;
+ return -ENODEV;

pmu_model = spec;
init_driverfs();
@@ -121,6 +122,8 @@ void __init pmu_init(struct oprofile_ope
ops->stop = pmu_stop;
ops->cpu_type = pmu_model->name;
printk(KERN_INFO "oprofile: using %s PMU\n", spec->name);
+
+ return 0;
}

void pmu_exit(void)
diff -rup 2.6-bk.orig/arch/arm/oprofile/init.c 2.6-bk/arch/arm/oprofile/init.c
--- 2.6-bk.orig/arch/arm/oprofile/init.c 2005-01-15 16:02:03.000000000 +0900
+++ 2.6-bk/arch/arm/oprofile/init.c 2005-01-15 16:33:42.000000000 +0900
@@ -12,11 +12,15 @@
#include <linux/errno.h>
#include "op_arm_model.h"

-void __init oprofile_arch_init(struct oprofile_operations *ops)
+int __init oprofile_arch_init(struct oprofile_operations *ops)
{
+ int ret = -ENODEV;
+
#ifdef CONFIG_CPU_XSCALE
- pmu_init(ops, &op_xscale_spec);
+ ret = pmu_init(ops, &op_xscale_spec);
#endif
+
+ return ret;
}

void oprofile_arch_exit(void)
diff -rup 2.6-bk.orig/arch/i386/oprofile/init.c 2.6-bk/arch/i386/oprofile/init.c
--- 2.6-bk.orig/arch/i386/oprofile/init.c 2005-01-15 16:01:39.000000000 +0900
+++ 2.6-bk/arch/i386/oprofile/init.c 2005-01-15 16:07:27.000000000 +0900
@@ -21,7 +21,7 @@ extern void nmi_exit(void);
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);


-void __init oprofile_arch_init(struct oprofile_operations * ops)
+int __init oprofile_arch_init(struct oprofile_operations * ops)
{
int ret;

@@ -35,6 +35,8 @@ void __init oprofile_arch_init(struct op
ret = nmi_timer_init(ops);
#endif
ops->backtrace = x86_backtrace;
+
+ return ret;
}


diff -rup 2.6-bk.orig/arch/ia64/oprofile/init.c 2.6-bk/arch/ia64/oprofile/init.c
--- 2.6-bk.orig/arch/ia64/oprofile/init.c 2005-01-15 16:01:58.000000000 +0900
+++ 2.6-bk/arch/ia64/oprofile/init.c 2005-01-15 16:23:49.000000000 +0900
@@ -16,13 +16,17 @@ extern int perfmon_init(struct oprofile_
extern void perfmon_exit(void);
extern void ia64_backtrace(struct pt_regs * const regs, unsigned int depth);

-void __init oprofile_arch_init(struct oprofile_operations * ops)
+int __init oprofile_arch_init(struct oprofile_operations * ops)
{
+ int ret = -ENODEV;
+
#ifdef CONFIG_PERFMON
/* perfmon_init() can fail, but we have no way to report it */
- perfmon_init(ops);
+ ret = perfmon_init(ops);
#endif
ops->backtrace = ia64_backtrace;
+
+ return ret;
}


diff -rup 2.6-bk.orig/arch/m32r/oprofile/init.c 2.6-bk/arch/m32r/oprofile/init.c
--- 2.6-bk.orig/arch/m32r/oprofile/init.c 2005-01-15 16:02:07.000000000 +0900
+++ 2.6-bk/arch/m32r/oprofile/init.c 2005-01-15 16:24:23.000000000 +0900
@@ -12,8 +12,9 @@
#include <linux/errno.h>
#include <linux/init.h>

-void __init oprofile_arch_init(struct oprofile_operations * ops)
+int __init oprofile_arch_init(struct oprofile_operations * ops)
{
+ return -ENODEV;
}

void oprofile_arch_exit(void)
diff -rup 2.6-bk.orig/arch/parisc/oprofile/init.c 2.6-bk/arch/parisc/oprofile/init.c
--- 2.6-bk.orig/arch/parisc/oprofile/init.c 2005-01-15 16:02:04.000000000 +0900
+++ 2.6-bk/arch/parisc/oprofile/init.c 2005-01-15 16:24:59.000000000 +0900
@@ -12,8 +12,9 @@
#include <linux/kernel.h>
#include <linux/oprofile.h>

-void __init oprofile_arch_init(struct oprofile_operations * ops)
+int __init oprofile_arch_init(struct oprofile_operations * ops)
{
+ return -ENODEV;
}


diff -rup 2.6-bk.orig/arch/ppc64/oprofile/common.c 2.6-bk/arch/ppc64/oprofile/common.c
--- 2.6-bk.orig/arch/ppc64/oprofile/common.c 2005-01-15 16:02:00.000000000 +0900
+++ 2.6-bk/arch/ppc64/oprofile/common.c 2005-01-15 16:26:01.000000000 +0900
@@ -125,7 +125,7 @@ static int op_ppc64_create_files(struct
return 0;
}

-void __init oprofile_arch_init(struct oprofile_operations *ops)
+int __init oprofile_arch_init(struct oprofile_operations *ops)
{
unsigned int pvr;

@@ -170,7 +170,7 @@ void __init oprofile_arch_init(struct op
break;

default:
- return;
+ return -ENODEV;
}

ops->create_files = op_ppc64_create_files;
@@ -181,6 +181,8 @@ void __init oprofile_arch_init(struct op

printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
ops->cpu_type);
+
+ return 0;
}

void oprofile_arch_exit(void)
diff -rup 2.6-bk.orig/arch/s390/oprofile/init.c 2.6-bk/arch/s390/oprofile/init.c
--- 2.6-bk.orig/arch/s390/oprofile/init.c 2005-01-15 16:02:06.000000000 +0900
+++ 2.6-bk/arch/s390/oprofile/init.c 2005-01-15 16:26:19.000000000 +0900
@@ -12,8 +12,9 @@
#include <linux/init.h>
#include <linux/errno.h>

-void __init oprofile_arch_init(struct oprofile_operations* ops)
+int __init oprofile_arch_init(struct oprofile_operations* ops)
{
+ return -ENODEV;
}

void oprofile_arch_exit(void)
diff -rup 2.6-bk.orig/arch/sh/oprofile/op_model_null.c 2.6-bk/arch/sh/oprofile/op_model_null.c
--- 2.6-bk.orig/arch/sh/oprofile/op_model_null.c 2005-01-15 16:01:52.000000000 +0900
+++ 2.6-bk/arch/sh/oprofile/op_model_null.c 2005-01-15 16:26:41.000000000 +0900
@@ -12,8 +12,9 @@
#include <linux/init.h>
#include <linux/errno.h>

-void __init oprofile_arch_init(struct oprofile_operations *ops)
+int __init oprofile_arch_init(struct oprofile_operations *ops)
{
+ return -ENODEV;
}

void oprofile_arch_exit(void)
diff -rup 2.6-bk.orig/arch/sparc64/oprofile/init.c 2.6-bk/arch/sparc64/oprofile/init.c
--- 2.6-bk.orig/arch/sparc64/oprofile/init.c 2005-01-15 16:01:40.000000000 +0900
+++ 2.6-bk/arch/sparc64/oprofile/init.c 2005-01-15 16:27:14.000000000 +0900
@@ -12,8 +12,9 @@
#include <linux/errno.h>
#include <linux/init.h>

-void __init oprofile_arch_init(struct oprofile_operations * ops)
+int __init oprofile_arch_init(struct oprofile_operations * ops)
{
+ return -ENODEV;
}


diff -rup 2.6-bk.orig/drivers/oprofile/oprof.c 2.6-bk/drivers/oprofile/oprof.c
--- 2.6-bk.orig/drivers/oprofile/oprof.c 2005-01-15 16:02:50.000000000 +0900
+++ 2.6-bk/drivers/oprofile/oprof.c 2005-01-15 16:14:58.000000000 +0900
@@ -153,11 +153,11 @@ out:

static int __init oprofile_init(void)
{
- int err = 0;
+ int err;

- oprofile_arch_init(&oprofile_ops);
+ err = oprofile_arch_init(&oprofile_ops);

- if (timer) {
+ if (err < 0 || timer) {
printk(KERN_INFO "oprofile: using timer interrupt.\n");
oprofile_timer_init(&oprofile_ops);
}
diff -rup 2.6-bk.orig/include/linux/oprofile.h 2.6-bk/include/linux/oprofile.h
--- 2.6-bk.orig/include/linux/oprofile.h 2005-01-15 16:03:21.000000000 +0900
+++ 2.6-bk/include/linux/oprofile.h 2005-01-15 16:06:27.000000000 +0900
@@ -48,7 +48,7 @@ struct oprofile_operations {
*
* If an error occurs, the fields should be left untouched.
*/
-void oprofile_arch_init(struct oprofile_operations * ops);
+int oprofile_arch_init(struct oprofile_operations * ops);

/**
* One-time exit/cleanup for the arch.






2005-01-27 02:18:14

by Olaf Hering

[permalink] [raw]
Subject: Re: [PATCH] oprofile: falling back on timer interrupt mode

On Wed, Jan 26, Linux Kernel Mailing List wrote:

> ChangeSet 1.2038, 2005/01/25 20:31:01-08:00, [email protected]
>
> [PATCH] oprofile: falling back on timer interrupt mode

>
> arch/alpha/oprofile/common.c | 6 ++++--
> arch/arm/oprofile/common.c | 7 +++++--
> arch/arm/oprofile/init.c | 8 ++++++--
> arch/i386/oprofile/init.c | 4 +++-
> arch/ia64/oprofile/init.c | 8 ++++++--
> arch/m32r/oprofile/init.c | 3 ++-
> arch/parisc/oprofile/init.c | 3 ++-
> arch/ppc64/oprofile/common.c | 6 ++++--
> arch/s390/oprofile/init.c | 3 ++-
> arch/sh/oprofile/op_model_null.c | 3 ++-
> arch/sparc64/oprofile/init.c | 3 ++-
> drivers/oprofile/oprof.c | 6 +++---
> include/linux/oprofile.h | 2 +-
> 13 files changed, 42 insertions(+), 20 deletions(-)

This misses arch/ppc

2005-01-27 14:53:30

by Akinobu Mita

[permalink] [raw]
Subject: Re: [PATCH] oprofile: falling back on timer interrupt mode

On Thursday 27 January 2005 04:05, Olaf Hering wrote:
> On Wed, Jan 26, Linux Kernel Mailing List wrote:
> > ChangeSet 1.2038, 2005/01/25 20:31:01-08:00, [email protected]
> >
> > [PATCH] oprofile: falling back on timer interrupt mode

> This misses arch/ppc


Thanks for pointing that out.

This is opofile timer-mode fallback fix for ppc.

Signed-off-by: Akinobu Mita <[email protected]>

--- 2.6-bk/arch/ppc/oprofile/common.c.orig 2005-01-27 23:28:44.000000000 +0900
+++ 2.6-bk/arch/ppc/oprofile/common.c 2005-01-27 23:32:27.000000000 +0900
@@ -124,7 +124,7 @@ static struct oprofile_operations oprof_
.cpu_type = NULL /* To be filled in below. */
};

-void __init oprofile_arch_init(struct oprofile_operations *ops)
+int __init oprofile_arch_init(struct oprofile_operations *ops)
{
char *name;
int cpu_id = smp_processor_id();
@@ -132,14 +132,13 @@ void __init oprofile_arch_init(struct op
#ifdef CONFIG_FSL_BOOKE
model = &op_model_fsl_booke;
#else
- printk(KERN_ERR "oprofile enabled on unsupported processor!\n");
- return;
+ return -ENODEV;
#endif

name = kmalloc(32, GFP_KERNEL);

if (NULL == name)
- return;
+ return -ENOMEM;

sprintf(name, "ppc/%s", cur_cpu_spec[cpu_id]->cpu_name);

@@ -151,6 +150,8 @@ void __init oprofile_arch_init(struct op

printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
oprof_ppc32_ops.cpu_type);
+
+ return 0;
}

void oprofile_arch_exit(void)