Commit 58f8e9da authored by Hendrik Brueckner's avatar Hendrik Brueckner Committed by Martin Schwidefsky

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: default avatarHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 8d4bd0ed
...@@ -157,10 +157,14 @@ static int validate_ctr_auth(const struct hw_perf_event *hwc) ...@@ -157,10 +157,14 @@ static int validate_ctr_auth(const struct hw_perf_event *hwc)
cpuhw = &get_cpu_var(cpu_hw_events); 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]; ctrs_state = cpumf_state_ctl[hwc->config_base];
if (!(ctrs_state & cpuhw->info.auth_ctl)) if (!(ctrs_state & cpuhw->info.auth_ctl))
err = -EPERM; err = -ENOENT;
put_cpu_var(cpu_hw_events); put_cpu_var(cpu_hw_events);
return err; return err;
...@@ -536,7 +540,7 @@ static int cpumf_pmu_add(struct perf_event *event, int flags) ...@@ -536,7 +540,7 @@ static int cpumf_pmu_add(struct perf_event *event, int flags)
*/ */
if (!(cpuhw->flags & PERF_EVENT_TXN)) if (!(cpuhw->flags & PERF_EVENT_TXN))
if (validate_ctr_auth(&event->hw)) if (validate_ctr_auth(&event->hw))
return -EPERM; return -ENOENT;
ctr_set_enable(&cpuhw->state, event->hw.config_base); ctr_set_enable(&cpuhw->state, event->hw.config_base);
event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED; event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
...@@ -611,7 +615,7 @@ static int cpumf_pmu_commit_txn(struct pmu *pmu) ...@@ -611,7 +615,7 @@ static int cpumf_pmu_commit_txn(struct pmu *pmu)
state = cpuhw->state & ~((1 << CPUMF_LCCTL_ENABLE_SHIFT) - 1); state = cpuhw->state & ~((1 << CPUMF_LCCTL_ENABLE_SHIFT) - 1);
state >>= CPUMF_LCCTL_ENABLE_SHIFT; state >>= CPUMF_LCCTL_ENABLE_SHIFT;
if ((state & cpuhw->info.auth_ctl) != state) if ((state & cpuhw->info.auth_ctl) != state)
return -EPERM; return -ENOENT;
cpuhw->flags &= ~PERF_EVENT_TXN; cpuhw->flags &= ~PERF_EVENT_TXN;
perf_pmu_enable(pmu); perf_pmu_enable(pmu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment