X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Farm%2Foprofile%2Fcommon.c;h=6f8bc1f0e6a11a9eae95968f7356ed5a2b895a78;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=6f833358cd0612c4c13e5d59619e86ccee2749e5;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 6f833358c..6f8bc1f0e 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c @@ -10,18 +10,17 @@ #include #include #include -#include #include -#include +#include #include "op_counter.h" #include "op_arm_model.h" static struct op_arm_model_spec *op_arm_model; static int op_arm_enabled; -static DEFINE_MUTEX(op_arm_mutex); +static struct semaphore op_arm_sem; -struct op_counter_config *counter_config; +struct op_counter_config counter_config[OP_MAX_COUNTER]; static int op_arm_create_files(struct super_block *sb, struct dentry *root) { @@ -29,7 +28,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[4]; + char buf[2]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); @@ -58,40 +57,40 @@ static int op_arm_start(void) { int ret = -EBUSY; - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (!op_arm_enabled) { ret = op_arm_model->start(); op_arm_enabled = !ret; } - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return ret; } static void op_arm_stop(void) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled) op_arm_model->stop(); op_arm_enabled = 0; - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); } #ifdef CONFIG_PM static int op_arm_suspend(struct sys_device *dev, pm_message_t state) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled) op_arm_model->stop(); - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return 0; } static int op_arm_resume(struct sys_device *dev) { - mutex_lock(&op_arm_mutex); + down(&op_arm_sem); if (op_arm_enabled && op_arm_model->start()) op_arm_enabled = 0; - mutex_unlock(&op_arm_mutex); + up(&op_arm_sem); return 0; } @@ -136,15 +135,12 @@ 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; @@ -166,5 +162,5 @@ void oprofile_arch_exit(void) exit_driverfs(); op_arm_model = NULL; } - kfree(counter_config); } +