summaryrefslogtreecommitdiff
path: root/kern/perfmon.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/perfmon.c')
-rw-r--r--kern/perfmon.c66
1 files changed, 44 insertions, 22 deletions
diff --git a/kern/perfmon.c b/kern/perfmon.c
index 9c9c257..d42fd09 100644
--- a/kern/perfmon.c
+++ b/kern/perfmon.c
@@ -217,25 +217,29 @@ perfmon_pmc_alloc(struct perfmon_pmc **pmcp, unsigned int raw_event_id)
size_t i;
int error;
- if (perfmon_pmu.nr_pmcs == ARRAY_SIZE(perfmon_pmu.pmcs))
+ if (perfmon_pmu.nr_pmcs == ARRAY_SIZE(perfmon_pmu.pmcs)) {
return EAGAIN;
+ }
for (i = 0; i < ARRAY_SIZE(perfmon_pmu.pmcs); i++) {
pmc = &perfmon_pmu.pmcs[i];
- if (pmc->nr_refs == 0)
+ if (pmc->nr_refs == 0) {
break;
+ }
}
assert(i < ARRAY_SIZE(perfmon_pmu.pmcs));
error = pmu_driver.alloc(&pmc->id, raw_event_id);
- if (error)
+ if (error) {
return error;
+ }
pmc->raw_event_id = raw_event_id;
perfmon_pmu.nr_pmcs++;
*pmcp = pmc;
+
return 0;
}
@@ -245,14 +249,16 @@ perfmon_pmc_lookup(unsigned int raw_event_id)
struct perfmon_pmc *pmc;
size_t i;
- if (perfmon_pmu.nr_pmcs == 0)
+ if (perfmon_pmu.nr_pmcs == 0) {
return NULL;
+ }
for (i = 0; i < ARRAY_SIZE(perfmon_pmu.pmcs); i++) {
pmc = &perfmon_pmu.pmcs[i];
- if ((pmc->nr_refs != 0) && (pmc->raw_event_id == raw_event_id))
+ if ((pmc->nr_refs != 0) && (pmc->raw_event_id == raw_event_id)) {
return pmc;
+ }
}
return NULL;
@@ -272,8 +278,9 @@ perfmon_pmc_get(struct perfmon_pmc **pmcp, const struct perfmon_event *event)
error = perfmon_translate(&raw_event_id, event->type, event->id);
- if (error)
+ if (error) {
return error;
+ }
spinlock_lock(&perfmon_pmu.lock);
@@ -282,8 +289,9 @@ perfmon_pmc_get(struct perfmon_pmc **pmcp, const struct perfmon_event *event)
if (pmc == NULL) {
error = perfmon_pmc_alloc(&pmc, raw_event_id);
- if (error)
+ if (error) {
goto out;
+ }
}
pmc->nr_refs++;
@@ -291,10 +299,11 @@ perfmon_pmc_get(struct perfmon_pmc **pmcp, const struct perfmon_event *event)
out:
spinlock_unlock(&perfmon_pmu.lock);
- if (error)
+ if (error) {
return error;
-
+ }
*pmcp = pmc;
+
return 0;
}
@@ -361,8 +370,9 @@ perfmon_cpu_pmu_init(struct perfmon_cpu_pmu *cpu_pmu)
{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(cpu_pmu->pmcs); i++)
+ for (i = 0; i < ARRAY_SIZE(cpu_pmu->pmcs); i++) {
cpu_pmu->pmcs[i].nr_refs = 0;
+ }
}
static inline struct perfmon_cpu_pmc *
@@ -438,17 +448,20 @@ perfmon_setup(void)
spinlock_init(&perfmon_pmu.lock);
perfmon_pmu.nr_pmcs = 0;
- for (i = 0; i < ARRAY_SIZE(perfmon_pmu.pmcs); i++)
+ for (i = 0; i < ARRAY_SIZE(perfmon_pmu.pmcs); i++) {
perfmon_pmu.pmcs[i].nr_refs = 0;
+ }
- for (i = 0; i < cpu_count(); i++)
+ for (i = 0; i < cpu_count(); i++) {
perfmon_cpu_pmu_init(percpu_ptr(perfmon_cpu_pmu, i));
+ }
for (i = 0; i < cpu_count(); i++) {
grouplist = perfmon_grouplist_create();
- if (grouplist == NULL)
+ if (grouplist == NULL) {
panic("perfmon: unable to create cpu grouplists");
+ }
percpu_var(perfmon_cpu_grouplist, i) = grouplist;
}
@@ -495,8 +508,9 @@ perfmon_event_create(struct perfmon_event **eventp, unsigned int type,
event = kmem_alloc(sizeof(*event));
- if (event == NULL)
+ if (event == NULL) {
return ENOMEM;
+ }
event->count = 0;
list_node_init(&event->node);
@@ -569,8 +583,9 @@ perfmon_group_create(struct perfmon_group **groupp)
group = kmem_alloc(sizeof(*group));
- if (group == NULL)
+ if (group == NULL) {
return ENOMEM;
+ }
list_init(&group->events);
spinlock_init(&group->lock);
@@ -629,8 +644,9 @@ perfmon_group_attach_pmu(struct perfmon_group *group)
list_for_each_entry(&group->events, event, node) {
error = perfmon_pmc_get(&pmc, event);
- if (error)
+ if (error) {
goto error_pmc;
+ }
event->pmc_index = perfmon_pmc_index(pmc);
}
@@ -639,8 +655,9 @@ perfmon_group_attach_pmu(struct perfmon_group *group)
error_pmc:
list_for_each_entry(&group->events, tmp, node) {
- if (tmp == event)
+ if (tmp == event) {
break;
+ }
perfmon_pmc_put(perfmon_pmc_from_index(tmp->pmc_index));
}
@@ -655,8 +672,9 @@ perfmon_group_detach_pmu(struct perfmon_group *group)
assert(perfmon_group_attached(group));
- list_for_each_entry(&group->events, event, node)
+ list_for_each_entry(&group->events, event, node) {
perfmon_pmc_put(perfmon_pmc_from_index(event->pmc_index));
+ }
}
int
@@ -670,8 +688,9 @@ perfmon_group_attach(struct perfmon_group *group, struct thread *thread)
error = perfmon_group_attach_pmu(group);
- if (error)
+ if (error) {
return error;
+ }
thread_ref(thread);
group->thread = thread;
@@ -698,8 +717,9 @@ perfmon_group_attach_cpu(struct perfmon_group *group, unsigned int cpu)
error = perfmon_group_attach_pmu(group);
- if (error)
+ if (error) {
return error;
+ }
group->cpu = cpu;
group->type = PERFMON_GT_CPU;
@@ -750,8 +770,9 @@ perfmon_group_detach(struct perfmon_group *group)
goto out;
}
- if (!perfmon_group_attached(group))
+ if (!perfmon_group_attached(group)) {
goto out;
+ }
perfmon_group_detach_pmu(group);
list_remove(&group->node);
@@ -1092,8 +1113,9 @@ perfmon_thread_init(struct thread *thread)
grouplist = perfmon_grouplist_create();
- if (grouplist == NULL)
+ if (grouplist == NULL) {
return ENOMEM;
+ }
thread->perfmon_groups = grouplist;
return 0;