altq: Fix panics on rmc_restart()

rmc_restart() is called from a timer, but can trigger traffic. This
means the curvnet context will not be set.
Use the vnet associated with the interface we're currently processing to
set it. We also have to enter net_epoch here, for the same reason.

Reviewed by:	mjg
MFC after:	1 week
Sponsored by:	Rubicon Communications, LLC ("Netgate")
Differential Revision:	https://reviews.freebsd.org/D31642
This commit is contained in:
Kristof Provost 2021-08-21 13:42:27 +02:00
parent e72e16c55d
commit 159258afb5

View File

@ -1554,10 +1554,13 @@ rmc_restart(void *arg)
{
struct rm_class *cl = arg;
struct rm_ifdat *ifd = cl->ifdat_;
struct epoch_tracker et;
int s;
s = splnet();
NET_EPOCH_ENTER(et);
IFQ_LOCK(ifd->ifq_);
CURVNET_SET(ifd->ifq_->altq_ifp->if_vnet);
if (cl->sleeping_) {
cl->sleeping_ = 0;
cl->undertime_.tv_sec = 0;
@ -1567,7 +1570,9 @@ rmc_restart(void *arg)
(ifd->restart)(ifd->ifq_);
}
}
CURVNET_RESTORE();
IFQ_UNLOCK(ifd->ifq_);
NET_EPOCH_EXIT(et);
splx(s);
}