mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
perf: RISC-V: use BIT_ULL for u64 overflow masks
Overflow status and restart masks are u64, but bits were built with
BIT(). On RV32 that is an unsigned long shift, so indices >= 32 truncate
or wrap and corrupt the mask.
Use BIT_ULL() for those u64 bitops.
Fixes: a8625217a0 ("drivers/perf: riscv: Implement SBI PMU snapshot function")
Assisted-by: DeepSeek:deepseek-v3
Signed-off-by: Xixin Liu <liuxixin@kylinos.cn>
Link: https://patch.msgid.link/prpmask01bitul.v2.1786434000.git.liuxixin@kylinos.cn
Cc: stable@vger.kernel.org
[pjw@kernel.org: updated to apply]
Signed-off-by: Paul Walmsley <pjw@kernel.org>
This commit is contained in:
parent
ddeaa39406
commit
6693171c8c
|
|
@ -1002,7 +1002,7 @@ static inline void pmu_sbi_start_ovf_ctrs_snapshot(struct cpu_hw_events *cpu_hw_
|
|||
struct riscv_pmu_snapshot_data *sdata = cpu_hw_evt->snapshot_addr;
|
||||
|
||||
for_each_set_bit(idx, cpu_hw_evt->used_hw_ctrs, RISCV_MAX_COUNTERS) {
|
||||
if (ctr_ovf_mask & BIT(idx)) {
|
||||
if (ctr_ovf_mask & BIT_ULL(idx)) {
|
||||
event = cpu_hw_evt->events[idx];
|
||||
hwc = &event->hw;
|
||||
max_period = riscv_pmu_ctr_get_width_mask(event);
|
||||
|
|
@ -1109,14 +1109,14 @@ static irqreturn_t pmu_sbi_ovf_handler(int irq, void *dev)
|
|||
hidx = info->csr - CSR_CYCLE;
|
||||
|
||||
/* check if the corresponding bit is set in scountovf or overflow mask in shmem */
|
||||
if (!(overflow & BIT(hidx)))
|
||||
if (!(overflow & BIT_ULL(hidx)))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Keep a track of overflowed counters so that they can be started
|
||||
* with updated initial value.
|
||||
*/
|
||||
overflowed_ctrs |= BIT(lidx);
|
||||
overflowed_ctrs |= BIT_ULL(lidx);
|
||||
hw_evt = &event->hw;
|
||||
/* Update the event states here so that we know the state while reading */
|
||||
hw_evt->state |= PERF_HES_STOPPED;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user