Define four wrapper functions for interface address locking,
if_addr_rlock() and if_addr_runlock() for regular address lists, and if_maddr_rlock() and if_maddr_runlock() for multicast address lists. We will use these in various kernel modules to avoid encoding specific type and locking strategy information into modules that currently use IF_ADDR_LOCK() and IF_ADDR_UNLOCK() directly. MFC after: 6 weeks
This commit is contained in:
parent
6bcc6a8413
commit
c4ac6ab020
34
sys/net/if.c
34
sys/net/if.c
@ -1418,6 +1418,40 @@ if_rtdel(struct radix_node *rn, void *arg)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wrapper functions for struct ifnet address list locking macros. These are
|
||||||
|
* used by kernel modules to avoid encoding programming interface or binary
|
||||||
|
* interface assumptions that may be violated when kernel-internal locking
|
||||||
|
* approaches change.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
if_addr_rlock(struct ifnet *ifp)
|
||||||
|
{
|
||||||
|
|
||||||
|
IF_ADDR_LOCK(ifp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
if_addr_runlock(struct ifnet *ifp)
|
||||||
|
{
|
||||||
|
|
||||||
|
IF_ADDR_UNLOCK(ifp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
if_maddr_rlock(struct ifnet *ifp)
|
||||||
|
{
|
||||||
|
|
||||||
|
IF_ADDR_LOCK(ifp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
if_maddr_runlock(struct ifnet *ifp)
|
||||||
|
{
|
||||||
|
|
||||||
|
IF_ADDR_UNLOCK(ifp);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count functions for ifaddrs.
|
* Reference count functions for ifaddrs.
|
||||||
*/
|
*/
|
||||||
|
@ -252,6 +252,16 @@ typedef void if_init_f_t(void *);
|
|||||||
#define IF_ADDR_UNLOCK(if) mtx_unlock(&(if)->if_addr_mtx)
|
#define IF_ADDR_UNLOCK(if) mtx_unlock(&(if)->if_addr_mtx)
|
||||||
#define IF_ADDR_LOCK_ASSERT(if) mtx_assert(&(if)->if_addr_mtx, MA_OWNED)
|
#define IF_ADDR_LOCK_ASSERT(if) mtx_assert(&(if)->if_addr_mtx, MA_OWNED)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function variations on locking macros intended to be used by loadable
|
||||||
|
* kernel modules in order to divorce them from the internals of address list
|
||||||
|
* locking.
|
||||||
|
*/
|
||||||
|
void if_addr_rlock(struct ifnet *ifp); /* if_addrhead */
|
||||||
|
void if_addr_runlock(struct ifnet *ifp); /* if_addrhead */
|
||||||
|
void if_maddr_rlock(struct ifnet *ifp); /* if_multiaddrs */
|
||||||
|
void if_maddr_runlock(struct ifnet *ifp); /* if_multiaddrs */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
|
* Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
|
||||||
* are queues of messages stored on ifqueue structures
|
* are queues of messages stored on ifqueue structures
|
||||||
|
Loading…
Reference in New Issue
Block a user