diff options
Diffstat (limited to 'kern/perfmon.c')
-rw-r--r-- | kern/perfmon.c | 66 |
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; |