From 7db381a43f2ffb1da5dc61c47edd64a4034dce79 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Wed, 10 Sep 2025 14:35:24 +0000 Subject: [PATCH] re: Make sure re_rxeof() is called in net epoch context It may pass packets up the stack and so needs to be called in a network epoch. When a watchdog timeout happens, we need to enter a section explicitly. Reviewed by: zlei, glebius, adrian MFC after: 2 weeks Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D51885 (cherry picked from commit b653a281f5a977ba73b3d405874f8af8e8b6b50d) --- sys/dev/re/if_re.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 0d4f1dddf46..2e143b23319 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -3560,6 +3560,7 @@ re_ioctl(if_t ifp, u_long command, caddr_t data) static void re_watchdog(struct rl_softc *sc) { + struct epoch_tracker et; if_t ifp; RL_LOCK_ASSERT(sc); @@ -3580,7 +3581,9 @@ re_watchdog(struct rl_softc *sc) if_printf(ifp, "watchdog timeout\n"); if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); + NET_EPOCH_ENTER(et); re_rxeof(sc, NULL); + NET_EPOCH_EXIT(et); if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING); re_init_locked(sc); if (!if_sendq_empty(ifp))