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)
This commit is contained in:
Mark Johnston 2025-09-10 14:35:24 +00:00 committed by Franco Fichtner
parent ffe852bafb
commit 7db381a43f

View file

@ -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))