s390/perf: fix bug when creating per-thread event
A per-thread event could not be created correctly like below: perf record --per-thread -e rB0000 -- sleep 1 Error: The sys_perf_event_open() syscall returned with 19 (No such device) for event (rB0000). /bin/dmesg may provide additional information. No CONFIG_PERF_EVENTS=y kernel support configured? This bug was introduced by: commitc311c79799
Author: Alexey Dobriyan <adobriyan@gmail.com> Date: Mon May 8 15:56:15 2017 -0700 cpumask: make "nr_cpumask_bits" unsigned If a per-thread event is not attached to any CPU, the cpu field in struct perf_event is -1. The above commit converts the CPU number to unsigned int, which result in an illegal CPU number. Fixes:c311c79799
("cpumask: make "nr_cpumask_bits" unsigned") Cc: <stable@vger.kernel.org> # v4.12+ Cc: Alexey Dobriyan <adobriyan@gmail.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Pu Hou <bjhoupu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
6d8ef53e8b
commit
fc3100d64f
|
@ -823,9 +823,12 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check online status of the CPU to which the event is pinned */
|
/* Check online status of the CPU to which the event is pinned */
|
||||||
if ((unsigned int)event->cpu >= nr_cpumask_bits ||
|
if (event->cpu >= 0) {
|
||||||
(event->cpu >= 0 && !cpu_online(event->cpu)))
|
if ((unsigned int)event->cpu >= nr_cpumask_bits)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
if (!cpu_online(event->cpu))
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/* Force reset of idle/hv excludes regardless of what the
|
/* Force reset of idle/hv excludes regardless of what the
|
||||||
* user requested.
|
* user requested.
|
||||||
|
|
Loading…
Reference in New Issue