summaryrefslogtreecommitdiffstats
path: root/arch/arm/oprofile/common.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-03-22 17:32:09 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-22 17:32:09 -0800
commit591eb85ecd7e6eb8596c6129ae074e16636b99f4 (patch)
tree535fb7e9bc29113ff62fd70b0dcd8ad197ab51e2 /arch/arm/oprofile/common.c
parent4658f79bec0b51222e769e328c2923f39f3bda77 (diff)
parent3a2916aa289504d694072a98876d23ca31d6401e (diff)
downloadkernel-crypto-591eb85ecd7e6eb8596c6129ae074e16636b99f4.tar.gz
kernel-crypto-591eb85ecd7e6eb8596c6129ae074e16636b99f4.tar.xz
kernel-crypto-591eb85ecd7e6eb8596c6129ae074e16636b99f4.zip
Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm: (45 commits) [ARM] 3389/1: typo and grammar fix [ARM] 3386/1: AT91RM9200 Clock update [ARM] 3384/1: AT91RM9200: Timer [ARM] 3382/1: ixp2000: unify defconfigs [ARM] 3381/1: ixp2000: fix slowport write timing control register fields [ARM] 3380/1: ixp2000: simplify ixdp2x00_master_npu() check [ARM] 3379/1: ixp2000: use generic 8250 debug macros [ARM] 3378/1: ixp2000: fix gpio interrupt handling [ARM] Quieten spurious IRQ detection [ARM] Use kcalloc to allocate counter_config array rather than kmalloc [ARM] Oprofile: dynamically allocate counter_config [ARM] Oprofile: Convert semaphore to mutex [ARM] 3376/2: S3C2410 - update defconfig [ARM] 3375/1: S3C2440 - fix osiris machine build [ARM] 3374/1: ep93xx: gpio interrupt support [ARM] 3361/1: S3C24XX - add USB bus clock source [ARM] 3360/1: S3C2440 - add set rate methods and camera clock [ARM] 3359/1: S3C24XX - add support for clk_set_rate [ARM] Convert kmalloc+memset to kzalloc [ARM] 3373/1: move uengine loader to arch/arm/common ...
Diffstat (limited to 'arch/arm/oprofile/common.c')
-rw-r--r--arch/arm/oprofile/common.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c
index 6f8bc1f0e6a..6f833358cd0 100644
--- a/arch/arm/oprofile/common.c
+++ b/arch/arm/oprofile/common.c
@@ -10,17 +10,18 @@
#include <linux/init.h>
#include <linux/oprofile.h>
#include <linux/errno.h>
+#include <linux/slab.h>
#include <linux/sysdev.h>
-#include <asm/semaphore.h>
+#include <linux/mutex.h>
#include "op_counter.h"
#include "op_arm_model.h"
static struct op_arm_model_spec *op_arm_model;
static int op_arm_enabled;
-static struct semaphore op_arm_sem;
+static DEFINE_MUTEX(op_arm_mutex);
-struct op_counter_config counter_config[OP_MAX_COUNTER];
+struct op_counter_config *counter_config;
static int op_arm_create_files(struct super_block *sb, struct dentry *root)
{
@@ -28,7 +29,7 @@ static int op_arm_create_files(struct super_block *sb, struct dentry *root)
for (i = 0; i < op_arm_model->num_counters; i++) {
struct dentry *dir;
- char buf[2];
+ char buf[4];
snprintf(buf, sizeof buf, "%d", i);
dir = oprofilefs_mkdir(sb, root, buf);
@@ -57,40 +58,40 @@ static int op_arm_start(void)
{
int ret = -EBUSY;
- down(&op_arm_sem);
+ mutex_lock(&op_arm_mutex);
if (!op_arm_enabled) {
ret = op_arm_model->start();
op_arm_enabled = !ret;
}
- up(&op_arm_sem);
+ mutex_unlock(&op_arm_mutex);
return ret;
}
static void op_arm_stop(void)
{
- down(&op_arm_sem);
+ mutex_lock(&op_arm_mutex);
if (op_arm_enabled)
op_arm_model->stop();
op_arm_enabled = 0;
- up(&op_arm_sem);
+ mutex_unlock(&op_arm_mutex);
}
#ifdef CONFIG_PM
static int op_arm_suspend(struct sys_device *dev, pm_message_t state)
{
- down(&op_arm_sem);
+ mutex_lock(&op_arm_mutex);
if (op_arm_enabled)
op_arm_model->stop();
- up(&op_arm_sem);
+ mutex_unlock(&op_arm_mutex);
return 0;
}
static int op_arm_resume(struct sys_device *dev)
{
- down(&op_arm_sem);
+ mutex_lock(&op_arm_mutex);
if (op_arm_enabled && op_arm_model->start())
op_arm_enabled = 0;
- up(&op_arm_sem);
+ mutex_unlock(&op_arm_mutex);
return 0;
}
@@ -135,12 +136,15 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
#endif
if (spec) {
- init_MUTEX(&op_arm_sem);
-
ret = spec->init();
if (ret < 0)
return ret;
+ counter_config = kcalloc(spec->num_counters, sizeof(struct op_counter_config),
+ GFP_KERNEL);
+ if (!counter_config)
+ return -ENOMEM;
+
op_arm_model = spec;
init_driverfs();
ops->create_files = op_arm_create_files;
@@ -162,5 +166,5 @@ void oprofile_arch_exit(void)
exit_driverfs();
op_arm_model = NULL;
}
+ kfree(counter_config);
}
-