diff options
| author | Robert Richter <robert.richter@amd.com> | 2011-02-11 17:31:44 +0100 | 
|---|---|---|
| committer | Robert Richter <robert.richter@amd.com> | 2011-02-15 11:10:20 +0100 | 
| commit | a0d76247e07abd14968adc4486aaa8e270e9c209 (patch) | |
| tree | bec9fa0f5a3c7b3d1f3c3032900d74f41941ed2d /drivers/oprofile | |
| parent | 997dbb4967da248808850c250182ef2528fff2d1 (diff) | |
| download | linux-a0d76247e07abd14968adc4486aaa8e270e9c209.tar.bz2 | |
oprofile, s390: Rework hwsampler implementation
This patch is a rework of the hwsampler oprofile implementation that
has been applied recently. Now there are less non-architectural
changes. The only changes are:
* introduction of oprofile_add_ext_hw_sample(), and
* removal of section attributes of oprofile_timer_init/_exit().
To setup hwsampler for oprofile we need to modify start()/stop()
callbacks and additional hwsampler control files in oprofilefs. We do
not reinitialize the timer or hwsampler mode by restarting calling
init/exit() anymore, instead hwsampler_running is used to switch the
mode directly in oprofile_hwsampler_start/_stop(). For locking reasons
there is also hwsampler_file that reflects the value in oprofilefs.
The overall diffstat of the oprofile s390 hwsampler implemenation
shows the low impact to non-architectural code:
 arch/Kconfig                         |    3 +
 arch/s390/Kconfig                    |    1 +
 arch/s390/oprofile/Makefile          |    2 +-
 arch/s390/oprofile/hwsampler.c       | 1256 ++++++++++++++++++++++++++++++++++
 arch/s390/oprofile/hwsampler.h       |  113 +++
 arch/s390/oprofile/hwsampler_files.c |  162 +++++
 arch/s390/oprofile/init.c            |    6 +-
 drivers/oprofile/cpu_buffer.c        |   24 +-
 drivers/oprofile/timer_int.c         |    4 +-
 include/linux/oprofile.h             |    7 +
 10 files changed, 1567 insertions(+), 11 deletions(-)
Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'drivers/oprofile')
| -rw-r--r-- | drivers/oprofile/oprof.c | 32 | ||||
| -rw-r--r-- | drivers/oprofile/oprof.h | 2 | ||||
| -rw-r--r-- | drivers/oprofile/timer_int.c | 15 | 
3 files changed, 3 insertions, 46 deletions
| diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index 43b01daa91e1..f9bda64fcd1b 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c @@ -239,38 +239,6 @@ int oprofile_set_ulong(unsigned long *addr, unsigned long val)  	return err;  } -#ifdef CONFIG_HAVE_HWSAMPLER -int oprofile_set_hwsampler(unsigned long val) -{ -	int err = 0; - -	mutex_lock(&start_mutex); - -	if (oprofile_started) { -		err = -EBUSY; -		goto out; -	} - -	switch (val) { -	case 1: -		/* Switch to hardware sampling. */ -		__oprofile_timer_exit(); -		err = oprofile_arch_set_hwsampler(&oprofile_ops); -		break; -	case 0: -		printk(KERN_INFO "oprofile: using timer interrupt.\n"); -		err = __oprofile_timer_init(&oprofile_ops); -		break; -	default: -		err = -EINVAL; -	} - -out: -	mutex_unlock(&start_mutex); -	return err; -} -#endif /* CONFIG_HAVE_HWSAMPLER */ -  static int __init oprofile_init(void)  {  	int err; diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 5a6ceb1954a2..177b73de5e5f 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h @@ -35,9 +35,7 @@ struct dentry;  void oprofile_create_files(struct super_block *sb, struct dentry *root);  int oprofile_timer_init(struct oprofile_operations *ops); -int __oprofile_timer_init(struct oprofile_operations *ops);  void oprofile_timer_exit(void); -void __oprofile_timer_exit(void);  int oprofile_set_ulong(unsigned long *addr, unsigned long val);  int oprofile_set_timeout(unsigned long time); diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c index 0099a458fd37..3ef44624f510 100644 --- a/drivers/oprofile/timer_int.c +++ b/drivers/oprofile/timer_int.c @@ -97,13 +97,14 @@ static struct notifier_block __refdata oprofile_cpu_notifier = {  	.notifier_call = oprofile_cpu_notify,  }; -int  __oprofile_timer_init(struct oprofile_operations *ops) +int oprofile_timer_init(struct oprofile_operations *ops)  {  	int rc;  	rc = register_hotcpu_notifier(&oprofile_cpu_notifier);  	if (rc)  		return rc; +	ops->create_files = NULL;  	ops->setup = NULL;  	ops->shutdown = NULL;  	ops->start = oprofile_hrtimer_start; @@ -112,17 +113,7 @@ int  __oprofile_timer_init(struct oprofile_operations *ops)  	return 0;  } -int __init oprofile_timer_init(struct oprofile_operations *ops) -{ -	return __oprofile_timer_init(ops); -} - -void __oprofile_timer_exit(void) +void oprofile_timer_exit(void)  {  	unregister_hotcpu_notifier(&oprofile_cpu_notifier);  } - -void __exit oprofile_timer_exit(void) -{ -	__oprofile_timer_exit(); -} |