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:
parent
e72e16c55d
commit
159258afb5
@ -1554,10 +1554,13 @@ rmc_restart(void *arg)
|
|||||||
{
|
{
|
||||||
struct rm_class *cl = arg;
|
struct rm_class *cl = arg;
|
||||||
struct rm_ifdat *ifd = cl->ifdat_;
|
struct rm_ifdat *ifd = cl->ifdat_;
|
||||||
|
struct epoch_tracker et;
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
s = splnet();
|
s = splnet();
|
||||||
|
NET_EPOCH_ENTER(et);
|
||||||
IFQ_LOCK(ifd->ifq_);
|
IFQ_LOCK(ifd->ifq_);
|
||||||
|
CURVNET_SET(ifd->ifq_->altq_ifp->if_vnet);
|
||||||
if (cl->sleeping_) {
|
if (cl->sleeping_) {
|
||||||
cl->sleeping_ = 0;
|
cl->sleeping_ = 0;
|
||||||
cl->undertime_.tv_sec = 0;
|
cl->undertime_.tv_sec = 0;
|
||||||
@ -1567,7 +1570,9 @@ rmc_restart(void *arg)
|
|||||||
(ifd->restart)(ifd->ifq_);
|
(ifd->restart)(ifd->ifq_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
CURVNET_RESTORE();
|
||||||
IFQ_UNLOCK(ifd->ifq_);
|
IFQ_UNLOCK(ifd->ifq_);
|
||||||
|
NET_EPOCH_EXIT(et);
|
||||||
splx(s);
|
splx(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user