Example #1
0
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;
}
Example #2
0
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;
}
Example #4
0
static void op_powerpc_shutdown(void)
{
	release_pmc_hardware();
}