static int op_powerpc_setup(void) { int err; op_per_cpu_rc = 0; err = reserve_pmc_hardware(op_handle_interrupt); if (err) return err; op_per_cpu_rc = model->reg_setup(ctr, &sys, model->num_counters); if (op_per_cpu_rc) goto out; on_each_cpu(op_powerpc_cpu_setup, NULL, 1); out: if (op_per_cpu_rc) { release_pmc_hardware(); } return op_per_cpu_rc; }
static int op_powerpc_setup(void) { int err; op_per_cpu_rc = 0; /* Grab the hardware */ err = reserve_pmc_hardware(op_handle_interrupt); if (err) return err; /* Pre-compute the values to stuff in the hardware registers. */ op_per_cpu_rc = model->reg_setup(ctr, &sys, model->num_counters); if (op_per_cpu_rc) goto out; /* Configure the registers on all cpus. If an error occurs on one * of the cpus, op_per_cpu_rc will be set to the error */ on_each_cpu(op_powerpc_cpu_setup, NULL, 1); out: if (op_per_cpu_rc) { /* error on setup release the performance counter hardware */ release_pmc_hardware(); } return op_per_cpu_rc; }
/* * proc handler for /proc/sys/tile/userspace_perf_counters */ int userspace_perf_counters_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { int ret, changed; unsigned int old_userspace_perf_counters; /* Read /proc/sys/tile/userspace_perf_counters */ if (!write) { ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); return ret; } /* Write /proc/sys/tile/userspace_perf_counters */ old_userspace_perf_counters = userspace_perf_counters; ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); changed = userspace_perf_counters != old_userspace_perf_counters; /* * Do something only if the value of userspace_perf_counters * is changed. */ if (ret == 0 && changed) { if (userspace_perf_counters == 1) { if (reserve_pmc_hardware(userspace_perf_handler)) { pr_warning("PMC hardware busy (reserved " "by perf_event or oprofile)\n"); userspace_perf_counters = old_userspace_perf_counters; return -EBUSY; } } else release_pmc_hardware(); /* Set MPL_PERF_COUNT_SET_X on each tile. */ on_each_cpu(set_perf_count_sprs, NULL, 1); } return ret; }
static void op_powerpc_shutdown(void) { release_pmc_hardware(); }