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>
This commit is contained in:
Robert Richter
2011-02-11 17:31:44 +01:00
parent 997dbb4967
commit a0d76247e0
6 changed files with 41 additions and 90 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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();
}