mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
s390/cpum_cf: Corrected return code for unauthorized counter sets
Previously, the cpum_cf PMU returned -EPERM if a counter is requested and the counter set to which the counter belongs is not authorized. According to the perf_event_open() system call manual, an error code of EPERM indicates an unsupported exclude setting or CAP_SYS_ADMIN is missing. Use ENOENT to indicate that particular counters are not available when the counter set which contains the counter is not authorized. For generic events, this might trigger a fall back, for example, to a software event. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
8d4bd0ed04
commit
58f8e9da33
@ -157,10 +157,14 @@ static int validate_ctr_auth(const struct hw_perf_event *hwc)
|
||||
|
||||
cpuhw = &get_cpu_var(cpu_hw_events);
|
||||
|
||||
/* check authorization for cpu counter sets */
|
||||
/* Check authorization for cpu counter sets.
|
||||
* If the particular CPU counter set is not authorized,
|
||||
* return with -ENOENT in order to fall back to other
|
||||
* PMUs that might suffice the event request.
|
||||
*/
|
||||
ctrs_state = cpumf_state_ctl[hwc->config_base];
|
||||
if (!(ctrs_state & cpuhw->info.auth_ctl))
|
||||
err = -EPERM;
|
||||
err = -ENOENT;
|
||||
|
||||
put_cpu_var(cpu_hw_events);
|
||||
return err;
|
||||
@ -536,7 +540,7 @@ static int cpumf_pmu_add(struct perf_event *event, int flags)
|
||||
*/
|
||||
if (!(cpuhw->flags & PERF_EVENT_TXN))
|
||||
if (validate_ctr_auth(&event->hw))
|
||||
return -EPERM;
|
||||
return -ENOENT;
|
||||
|
||||
ctr_set_enable(&cpuhw->state, event->hw.config_base);
|
||||
event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
|
||||
@ -611,7 +615,7 @@ static int cpumf_pmu_commit_txn(struct pmu *pmu)
|
||||
state = cpuhw->state & ~((1 << CPUMF_LCCTL_ENABLE_SHIFT) - 1);
|
||||
state >>= CPUMF_LCCTL_ENABLE_SHIFT;
|
||||
if ((state & cpuhw->info.auth_ctl) != state)
|
||||
return -EPERM;
|
||||
return -ENOENT;
|
||||
|
||||
cpuhw->flags &= ~PERF_EVENT_TXN;
|
||||
perf_pmu_enable(pmu);
|
||||
|
Loading…
Reference in New Issue
Block a user