git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git]
/
arch
/
arm
/
oprofile
/
common.c
diff --git
a/arch/arm/oprofile/common.c
b/arch/arm/oprofile/common.c
index
6f83335
..
6f8bc1f
100644
(file)
--- a/
arch/arm/oprofile/common.c
+++ b/
arch/arm/oprofile/common.c
@@
-10,18
+10,17
@@
#include <linux/init.h>
#include <linux/oprofile.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/oprofile.h>
#include <linux/errno.h>
-#include <linux/slab.h>
#include <linux/sysdev.h>
#include <linux/sysdev.h>
-#include <
linux/mutex
.h>
+#include <
asm/semaphore
.h>
#include "op_counter.h"
#include "op_arm_model.h"
static struct op_arm_model_spec *op_arm_model;
static int op_arm_enabled;
#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)
{
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;
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);
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;
{
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;
}
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)
{
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;
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)
{
}
#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();
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)
{
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;
if (op_arm_enabled && op_arm_model->start())
op_arm_enabled = 0;
-
mutex_unlock(&op_arm_mutex
);
+
up(&op_arm_sem
);
return 0;
}
return 0;
}
@@
-136,15
+135,12
@@
int __init oprofile_arch_init(struct oprofile_operations *ops)
#endif
if (spec) {
#endif
if (spec) {
+ init_MUTEX(&op_arm_sem);
+
ret = spec->init();
if (ret < 0)
return ret;
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;
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;
}
exit_driverfs();
op_arm_model = NULL;
}
- kfree(counter_config);
}
}
+