Re: kernel panic on shutdoen/reboot
Vitaliy Makkoveev <[email protected]> Tue, 2 Jun 2026 00:23:45 +0000
| Newsgroups | gmane.os.openbsd.bugs |
|---|---|
| Message-ID | <[email protected]> |
On Mon, Jun 01, 2026 at 09:59:41PM +0200, Alexander Bluhm wrote: > On Mon, Jun 01, 2026 at 06:24:38AM +0300, Vitaliy Makkoveev wrote: > > On Mon, May 25, 2026 at 04:45:26PM +0200, [email protected] wrote: > > > >Synopsis: <Kernel panic at shutdoen/reboot when rad is enabled> > > > >Category: > > > >Environment: > > > System : OpenBSD 7.9 > > > Details : OpenBSD 7.9 (GENERIC.MP) #222: Wed May 6 18:07:56 MDT 2026 > > > [email protected]:/usr/src/sys/arch/arm64/compile/GENERIC.MP > > > > > > Architecture: OpenBSD.arm64 > > > Machine : arm64 > > > >Description: > > > When rad is enabled, the system panics at shutdoen/reboot, no orderly reboot possible > > > >How-To-Repeat: > > > rcctl enable rad > > > rcctl start rad > > > shutdowen -r now > > > ... panic > > > ... reboot > > > rcctl disable rad > > > rcctl stop rad > > > ... panic > > > ... reboot > > > rcctl check rad > > > rad (failed) > > > shutdown -r now > > > ... ok > > > >Fix: > > > disable rad > > > > > > > Hello, > > > > I have no cad(4) device and I have no ability to compile this diff, so > > I'm sending it offlist. Does it help? > > In November 2025 I sent this diff, but nobody tested it. > > https://marc.info/?l=openbsd-bugs&m=176314127606140&w=2 > I'm not happy with sleeping malloc under exclusive netlock. Can we do sc_{tx,rx}buf allocation at probe time? Or even declare them as arrays like bse(4)? > Index: dev/fdt/if_cad.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/dev/fdt/if_cad.c,v > diff -u -p -r1.16 if_cad.c > --- dev/fdt/if_cad.c 17 Sep 2025 09:17:12 -0000 1.16 > +++ dev/fdt/if_cad.c 3 Jan 2026 21:58:47 -0000 > @@ -589,22 +589,10 @@ cad_ioctl(struct ifnet *ifp, u_long cmd, > { > struct cad_softc *sc = ifp->if_softc; > struct ifreq *ifr = (struct ifreq *)data; > - int error = 0, netlock_held = 1; > + int error = 0; > int s; > > - switch (cmd) { > - case SIOCGIFMEDIA: > - case SIOCSIFMEDIA: > - case SIOCGIFSFFPAGE: > - netlock_held = 0; > - break; > - } > - > - if (netlock_held) > - NET_UNLOCK(); > rw_enter_write(&sc->sc_cfg_lock); > - if (netlock_held) > - NET_LOCK(); > s = splnet(); > > switch (cmd) { > @@ -722,9 +710,6 @@ cad_up(struct cad_softc *sc) > > rw_assert_wrlock(&sc->sc_cfg_lock); > > - /* Release lock for memory allocation. */ > - NET_UNLOCK(); > - > if (sc->sc_dma64) > flags |= BUS_DMA_64BIT; > > @@ -880,8 +865,6 @@ cad_up(struct cad_softc *sc) > } > } > > - NET_LOCK(); > - > /* > * Set MAC address filters. > */ > @@ -985,9 +968,6 @@ cad_down(struct cad_softc *sc) > ifq_clr_oactive(&ifp->if_snd); > ifp->if_timer = 0; > > - /* Avoid lock order issues with barriers. */ > - NET_UNLOCK(); > - > timeout_del_barrier(&sc->sc_tick); > > /* Disable data transfer. */ > @@ -1011,7 +991,7 @@ cad_down(struct cad_softc *sc) > /* Wait for activity to cease. */ > intr_barrier(sc->sc_ih); > ifq_barrier(&ifp->if_snd); > - taskq_del_barrier(systq, &sc->sc_statchg_task); > + task_del(systq, &sc->sc_statchg_task); > > /* Disable the packet clock as it is not needed any longer. */ > clock_disable(sc->sc_node, GEM_CLK_TX); > @@ -1059,8 +1039,6 @@ cad_down(struct cad_softc *sc) > cad_dmamem_free(sc, sc->sc_rxring); > sc->sc_rxring = NULL; > sc->sc_rxdesc = NULL; > - > - NET_LOCK(); > } > > uint8_t > @@ -1683,8 +1661,14 @@ void > cad_statchg_task(void *arg) > { > struct cad_softc *sc = arg; > + struct ifnet *ifp = &sc->sc_ac.ac_if; > > - clock_set_frequency(sc->sc_node, GEM_CLK_TX, sc->sc_tx_freq); > + rw_enter_write(&sc->sc_cfg_lock); > + > + if ((ifp->if_flags & IFF_RUNNING)) > + clock_set_frequency(sc->sc_node, GEM_CLK_TX, sc->sc_tx_freq); > + > + rw_exit_write(&sc->sc_cfg_lock); > } > > struct cad_dmamem * >