mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Current imc-pmu code triggers a WARNING with CONFIG_DEBUG_ATOMIC_SLEEP
and CONFIG_PROVE_LOCKING enabled, while running a thread_imc event.
Command to trigger the warning:
# perf stat -e thread_imc/CPM_CS_FROM_L4_MEM_X_DPTEG/ sleep 5
Performance counter stats for 'sleep 5':
0 thread_imc/CPM_CS_FROM_L4_MEM_X_DPTEG/
5.002117947 seconds time elapsed
0.000131000 seconds user
0.001063000 seconds sys
Below is snippet of the warning in dmesg:
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:580
in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 2869, name: perf-exec
preempt_count: 2, expected: 0
4 locks held by perf-exec/2869:
#0: c00000004325c540 (&sig->cred_guard_mutex){+.+.}-{3:3}, at: bprm_execve+0x64/0xa90
#1: c00000004325c5d8 (&sig->exec_update_lock){++++}-{3:3}, at: begin_new_exec+0x460/0xef0
#2: c0000003fa99d4e0 (&cpuctx_lock){-...}-{2:2}, at: perf_event_exec+0x290/0x510
#3: c000000017ab8418 (&ctx->lock){....}-{2:2}, at: perf_event_exec+0x29c/0x510
irq event stamp: 4806
hardirqs last enabled at (4805): [<c000000000f65b94>] _raw_spin_unlock_irqrestore+0x94/0xd0
hardirqs last disabled at (4806): [<c0000000003fae44>] perf_event_exec+0x394/0x510
softirqs last enabled at (0): [<c00000000013c404>] copy_process+0xc34/0x1ff0
softirqs last disabled at (0): [<0000000000000000>] 0x0
CPU: 36 PID: 2869 Comm: perf-exec Not tainted 6.2.0-rc2-00011-g1247637727f2 #61
Hardware name: 8375-42A POWER9 0x4e1202 opal:v7.0-16-g9b85f7d961 PowerNV
Call Trace:
dump_stack_lvl+0x98/0xe0 (unreliable)
__might_resched+0x2f8/0x310
__mutex_lock+0x6c/0x13f0
thread_imc_event_add+0xf4/0x1b0
event_sched_in+0xe0/0x210
merge_sched_in+0x1f0/0x600
visit_groups_merge.isra.92.constprop.166+0x2bc/0x6c0
ctx_flexible_sched_in+0xcc/0x140
ctx_sched_in+0x20c/0x2a0
ctx_resched+0x104/0x1c0
perf_event_exec+0x340/0x510
begin_new_exec+0x730/0xef0
load_elf_binary+0x3f8/0x1e10
...
do not call blocking ops when !TASK_RUNNING; state=2001 set at [<00000000fd63e7cf>] do_nanosleep+0x60/0x1a0
WARNING: CPU: 36 PID: 2869 at kernel/sched/core.c:9912 __might_sleep+0x9c/0xb0
CPU: 36 PID: 2869 Comm: sleep Tainted: G W 6.2.0-rc2-00011-g1247637727f2 #61
Hardware name: 8375-42A POWER9 0x4e1202 opal:v7.0-16-g9b85f7d961 PowerNV
NIP: c000000000194a1c LR: c000000000194a18 CTR: c000000000a78670
REGS: c00000004d2134e0 TRAP: 0700 Tainted: G W (6.2.0-rc2-00011-g1247637727f2)
MSR: 9000000000021033 <SF,HV,ME,IR,DR,RI,LE> CR: 48002824 XER: 00000000
CFAR: c00000000013fb64 IRQMASK: 1
The above warning triggered because the current imc-pmu code uses mutex
lock in interrupt disabled sections. The function mutex_lock()
internally calls __might_resched(), which will check if IRQs are
disabled and in case IRQs are disabled, it will trigger the warning.
Fix the issue by changing the mutex lock to spinlock.
Fixes:
|
||
---|---|---|
.. | ||
book3s | ||
nohash | ||
vdso | ||
8xx_immap.h | ||
accounting.h | ||
agp.h | ||
archrandom.h | ||
asm-compat.h | ||
asm-const.h | ||
asm-offsets.h | ||
asm-prototypes.h | ||
asm.h | ||
async_tx.h | ||
atomic.h | ||
backlight.h | ||
barrier.h | ||
bitops.h | ||
bootx.h | ||
bpf_perf_event.h | ||
btext.h | ||
bug.h | ||
bugs.h | ||
cache.h | ||
cacheflush.h | ||
cell-pmu.h | ||
cell-regs.h | ||
checksum.h | ||
clocksource.h | ||
cmpxchg.h | ||
code-patching-asm.h | ||
code-patching.h | ||
compat.h | ||
context_tracking.h | ||
copro.h | ||
cpm.h | ||
cpm1.h | ||
cpm2.h | ||
cpu_has_feature.h | ||
cpu_setup.h | ||
cpufeature.h | ||
cpuidle.h | ||
cputable.h | ||
cputhreads.h | ||
cputime.h | ||
crashdump-ppc64.h | ||
current.h | ||
dbdma.h | ||
dbell.h | ||
dcr-generic.h | ||
dcr-mmio.h | ||
dcr-native.h | ||
dcr-regs.h | ||
dcr.h | ||
debug.h | ||
delay.h | ||
device.h | ||
disassemble.h | ||
dma-direct.h | ||
dma.h | ||
drmem.h | ||
dt_cpu_ftrs.h | ||
dtl.h | ||
edac.h | ||
eeh.h | ||
eeh_event.h | ||
ehv_pic.h | ||
elf.h | ||
elfnote.h | ||
emergency-restart.h | ||
emulated_ops.h | ||
epapr_hcalls.h | ||
exception-64e.h | ||
exception-64s.h | ||
exec.h | ||
extable.h | ||
fadump-internal.h | ||
fadump.h | ||
fb.h | ||
feature-fixups.h | ||
firmware.h | ||
fixmap.h | ||
floppy.h | ||
fs_pd.h | ||
fsl_gtm.h | ||
fsl_hcalls.h | ||
fsl_lbc.h | ||
fsl_pamu_stash.h | ||
fsl_pm.h | ||
ftrace.h | ||
futex.h | ||
grackle.h | ||
hardirq.h | ||
head-64.h | ||
heathrow.h | ||
highmem.h | ||
hmi.h | ||
hugetlb.h | ||
hvcall.h | ||
hvconsole.h | ||
hvcserver.h | ||
hvsi.h | ||
hw_breakpoint.h | ||
hw_irq.h | ||
hydra.h | ||
i8259.h | ||
ibmebus.h | ||
icswx.h | ||
ide.h | ||
idle.h | ||
imc-pmu.h | ||
immap_cpm2.h | ||
inst.h | ||
interrupt.h | ||
io-defs.h | ||
io-workarounds.h | ||
io.h | ||
io_event_irq.h | ||
iommu.h | ||
ipic.h | ||
irq.h | ||
irq_work.h | ||
irqflags.h | ||
isa-bridge.h | ||
jump_label.h | ||
kasan.h | ||
Kbuild | ||
kdebug.h | ||
kdump.h | ||
kexec.h | ||
kexec_ranges.h | ||
keylargo.h | ||
kfence.h | ||
kgdb.h | ||
kprobes.h | ||
kup.h | ||
kvm_asm.h | ||
kvm_book3s.h | ||
kvm_book3s_32.h | ||
kvm_book3s_64.h | ||
kvm_book3s_asm.h | ||
kvm_book3s_uvmem.h | ||
kvm_booke.h | ||
kvm_booke_hv_asm.h | ||
kvm_fpu.h | ||
kvm_guest.h | ||
kvm_host.h | ||
kvm_para.h | ||
kvm_ppc.h | ||
libata-portmap.h | ||
linkage.h | ||
livepatch.h | ||
local.h | ||
lppaca.h | ||
lv1call.h | ||
machdep.h | ||
macio.h | ||
mc146818rtc.h | ||
mce.h | ||
mediabay.h | ||
mem_encrypt.h | ||
membarrier.h | ||
mman.h | ||
mmiowb.h | ||
mmu.h | ||
mmu_context.h | ||
mmzone.h | ||
module.h | ||
module.lds.h | ||
mpc5xxx.h | ||
mpc6xx.h | ||
mpc52xx.h | ||
mpc52xx_psc.h | ||
mpc85xx.h | ||
mpc5121.h | ||
mpc8260.h | ||
mpic.h | ||
mpic_msgr.h | ||
mpic_timer.h | ||
msi_bitmap.h | ||
nmi.h | ||
nvram.h | ||
ohare.h | ||
opal-api.h | ||
opal.h | ||
paca.h | ||
page.h | ||
page_32.h | ||
page_64.h | ||
paravirt.h | ||
paravirt_api_clock.h | ||
parport.h | ||
pasemi_dma.h | ||
pci-bridge.h | ||
pci.h | ||
percpu.h | ||
perf_event.h | ||
perf_event_fsl_emb.h | ||
perf_event_server.h | ||
pgalloc.h | ||
pgtable-be-types.h | ||
pgtable-types.h | ||
pgtable.h | ||
pkeys.h | ||
plpar_wrappers.h | ||
pmac_feature.h | ||
pmac_low_i2c.h | ||
pmac_pfunc.h | ||
pmc.h | ||
pmi.h | ||
pnv-ocxl.h | ||
pnv-pci.h | ||
powernv.h | ||
ppc-opcode.h | ||
ppc-pci.h | ||
ppc4xx.h | ||
ppc_asm.h | ||
probes.h | ||
processor.h | ||
prom.h | ||
ps3.h | ||
ps3av.h | ||
ps3gpu.h | ||
ps3stor.h | ||
pte-walk.h | ||
ptrace.h | ||
qspinlock.h | ||
qspinlock_types.h | ||
reg.h | ||
reg_8xx.h | ||
reg_a2.h | ||
reg_booke.h | ||
reg_fsl_emb.h | ||
rheap.h | ||
rio.h | ||
rtas-types.h | ||
rtas.h | ||
runlatch.h | ||
seccomp.h | ||
sections.h | ||
secure_boot.h | ||
security_features.h | ||
secvar.h | ||
serial.h | ||
set_memory.h | ||
setjmp.h | ||
setup.h | ||
sfp-machine.h | ||
shmparam.h | ||
signal.h | ||
simple_spinlock.h | ||
simple_spinlock_types.h | ||
smp.h | ||
smu.h | ||
sparsemem.h | ||
spinlock.h | ||
spinlock_types.h | ||
spu.h | ||
spu_csa.h | ||
spu_info.h | ||
spu_priv1.h | ||
sstep.h | ||
stackprotector.h | ||
stacktrace.h | ||
static_call.h | ||
string.h | ||
svm.h | ||
swab.h | ||
swiotlb.h | ||
switch_to.h | ||
synch.h | ||
syscall.h | ||
syscall_wrapper.h | ||
syscalls.h | ||
syscalls_32.h | ||
task_size_32.h | ||
task_size_64.h | ||
tce.h | ||
thread_info.h | ||
time.h | ||
timex.h | ||
tlb.h | ||
tlbflush.h | ||
tm.h | ||
topology.h | ||
trace.h | ||
trace_clock.h | ||
tsi108.h | ||
tsi108_irq.h | ||
tsi108_pci.h | ||
types.h | ||
uaccess.h | ||
udbg.h | ||
uic.h | ||
ultravisor-api.h | ||
ultravisor.h | ||
uninorth.h | ||
unistd.h | ||
uprobes.h | ||
user.h | ||
vas.h | ||
vdso.h | ||
vdso_datapage.h | ||
vermagic.h | ||
vga.h | ||
vio.h | ||
vmalloc.h | ||
word-at-a-time.h | ||
xics.h | ||
xive-regs.h | ||
xive.h | ||
xmon.h | ||
xor.h | ||
xor_altivec.h |