Re: octeon: cnmac: KERNEL_INTERRUPT drops into ddb
Kirill A. Korinsky <[email protected]>
| Newsgroups | gmane.os.openbsd.bugs |
|---|---|
| Message-ID | <[email protected]> |
On Fri, 16 Jan 2026 18:01:52 +0100, Klemens Nanni <[email protected]> wrote: > > ddb{0}> bt > cnmac_recv_mbuf+0x134 (77e060040f88a,1,980000000fd97a00,980000000fd979fc) ra 0xffffffff8132c9fc sp 0x980000000fd979d0, sz 32 > cnmac_recv+0x7c (77e060040f88a,1,980000000fd97a00,7ac0a7ce8aab3e1f) ra 0xffffffff8132aa2c sp 0x980000000fd979f0, sz 80 > cnmac_intr+0xfc (77e060040f88a,247c372c96c2746a,980000000fd97a00,7ac0a7ce8aab3e1f) ra 0xffffffff814e3110 sp 0x980000000fd97a40, sz 96 > octciu_intr_bank+0x270 (77e060040f88a,247c372c96c2746a,980000000fd97a00,c77a9639b987eb7e) ra 0xffffffff814e2814 sp 0x980000000fd97aa0, sz 160 > octciu_intr0+0x94 (77e060040f88a,247c372c96c2746a,b68846e5d34476ee,c77a9639b987eb7e) ra 0xffffffff81465648 sp 0x980000000fd97b40, sz 64 > interrupt+0x170 (77e060040f88a,434c3cde35ce707c,b68846e5d34476ee,c77a9639b987eb7e) ra 0xffffffff8137ca14 sp 0x980000000fd97b80, sz 64 > k_intr+0xb4 (980000000fd97be8,434c3cde35ce707c,b68846e5d34476ee,ffffffff812ca5a > c) ra 0x0 sp 0x980000000fd97bc0, sz 0 > (KERNEL INTERRUPT) > cpu_idle_cycle_wait+0x4 (980000000fd97be8,434c3cde35ce707c,b68846e5d34476ee,ffffffff812ca5ac) ra 0xffffffff812b2698 sp 0x980000000fd97d40, sz 0 > sched_idle+0x388 (980000000fd97be8,434c3cde35ce707c,b68846e5d34476ee,ffffffff812ca5ac) ra 0xffffffff812ca6dc sp 0x980000000fd97d40, sz 112 > proc_trampoline+0x1c (980000000fd97be8,434c3cde35ce707c,b68846e5d34476ee,ffffffff812ca5ac) ra 0x0 sp 0x980000000fd97db0, sz 0 > User-level: pid 92532 I have a blind shot which may be related, or may be completley unrelated, or simple wrong. It reads that if_cnmac aligns RX packet buffers to CACHELINESIZE and then stores the saved mbuf * in the word immediately before the aligned address. It reads that we allign mbuf clusters always at 64-byte, so, a cluster already aligned to 128 bytes makes that write may land outside the allocated buffer. Here, I align the buffer base after reserving space for the back-pointer so the saved mbuf * always stays within the cluster. Here a diff where I respect CACHELINESIZE align in mbuf. Thoughts? Tests? OKs? Index: sys/arch/octeon/dev/if_cnmac.c =================================================================== RCS file: /home/cvs/src/sys/arch/octeon/dev/if_cnmac.c,v diff -u -p -r1.86 if_cnmac.c --- sys/arch/octeon/dev/if_cnmac.c 20 May 2024 23:13:33 -0000 1.86 +++ sys/arch/octeon/dev/if_cnmac.c 4 Apr 2026 00:11:27 -0000 @@ -356,8 +356,8 @@ cnmac_ipd_init(struct cnmac_softc *sc) ipd_aa.aa_port = sc->sc_port; ipd_aa.aa_regt = sc->sc_regt; - ipd_aa.aa_first_mbuff_skip = 0/* XXX */; - ipd_aa.aa_not_first_mbuff_skip = 0/* XXX */; + ipd_aa.aa_first_mbuff_skip = CACHELINESIZE; + ipd_aa.aa_not_first_mbuff_skip = CACHELINESIZE; cn30xxipd_init(&ipd_aa, &sc->sc_ipd); } -- wbr, Kirill