mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
vnet: (read) lock the vnet list while iterating it
Ensure that the vnet list cannot be modified while we're running through
it.
Reviewed by: mjg (previous version), zlei (previous version)
MFC after: 1 week
Sponsored by: Rubicon Communications, LLC ("Netgate")
Differential Revision: https://reviews.freebsd.org/D42927
(cherry picked from commit bd7b2f95019e9715150c34736279805de0818d09)
This commit is contained in:
parent
35707083c6
commit
daaaeb3051
2 changed files with 6 additions and 0 deletions
|
|
@ -503,11 +503,13 @@ vnet_register_sysinit(void *arg)
|
|||
* Invoke the constructor on all the existing vnets when it is
|
||||
* registered.
|
||||
*/
|
||||
VNET_LIST_RLOCK();
|
||||
VNET_FOREACH(vnet) {
|
||||
CURVNET_SET_QUIET(vnet);
|
||||
vs->func(vs->arg);
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK();
|
||||
VNET_SYSINIT_WUNLOCK();
|
||||
}
|
||||
|
||||
|
|
@ -559,6 +561,7 @@ vnet_deregister_sysuninit(void *arg)
|
|||
* deregistered.
|
||||
*/
|
||||
VNET_SYSINIT_WLOCK();
|
||||
VNET_LIST_RLOCK();
|
||||
VNET_FOREACH(vnet) {
|
||||
CURVNET_SET_QUIET(vnet);
|
||||
vs->func(vs->arg);
|
||||
|
|
@ -568,6 +571,7 @@ vnet_deregister_sysuninit(void *arg)
|
|||
/* Remove the destructor from the global list of vnet destructors. */
|
||||
TAILQ_REMOVE(&vnet_destructors, vs, link);
|
||||
VNET_SYSINIT_WUNLOCK();
|
||||
VNET_LIST_RUNLOCK();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -663,11 +663,13 @@ ipreass_drain(void)
|
|||
{
|
||||
VNET_ITERATOR_DECL(vnet_iter);
|
||||
|
||||
VNET_LIST_RLOCK();
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
ipreass_drain_vnet();
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue