convert ifnet and afdata locks from mutexes to rwlocks

This commit is contained in:
kmacy 2008-12-17 00:11:56 +00:00
parent 43e7c1af8b
commit d0147f27c7
3 changed files with 27 additions and 18 deletions

View File

@ -21,6 +21,9 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8.x IS SLOW:
developers choose to disable these features on build machines
to maximize performance. (To disable malloc debugging, run
ln -s aj /etc/malloc.conf.)
20081216:
The afdata and ifnet locks have been changed from mutexes to
rwlocks, network modules will need to be re-compiled.
20081214:
__FreeBSD_version 800059 incorporates the new arp-v2 rewrite.

View File

@ -158,7 +158,7 @@ static struct knlist ifklist;
#endif
int ifqmaxlen = IFQ_MAXLEN;
struct mtx ifnet_lock;
struct rwlock ifnet_lock;
static if_com_alloc_t *if_com_alloc[256];
static if_com_free_t *if_com_free[256];

View File

@ -80,6 +80,7 @@ struct ifvlantrunk;
#endif /* _KERNEL */
#include <sys/lock.h> /* XXX */
#include <sys/mutex.h> /* XXX */
#include <sys/rwlock.h> /* XXX */
#include <sys/event.h> /* XXX */
#include <sys/_task.h>
@ -175,7 +176,7 @@ struct ifnet {
struct ifprefixhead if_prefixhead; /* list of prefixes per if */
void *if_afdata[AF_MAX];
int if_afdata_initialized;
struct mtx if_afdata_mtx;
struct rwlock if_afdata_lock;
struct task if_starttask; /* task for IFF_NEEDSGIANT */
struct task if_linktask; /* task for link change events */
struct mtx if_addr_mtx; /* mutex to protect address lists */
@ -185,8 +186,8 @@ struct ifnet {
/* protected by if_addr_mtx */
void *if_pf_kif;
void *if_lagg; /* lagg glue */
void *if_pspare[8]; /* multiq/TOE 3; vimage 3; general use 4 */
void (*if_qflush) /* flush any queues */
void *if_pspare[8]; /* TOE 3; vimage 3; general use 4 */
void (*if_qflush) /* flush any queues */
(struct ifnet *);
int (*if_transmit) /* initiate output routine */
(struct ifnet *, struct mbuf *);
@ -358,14 +359,19 @@ typedef void (*group_change_event_handler_t)(void *, const char *);
EVENTHANDLER_DECLARE(group_change_event, group_change_event_handler_t);
#define IF_AFDATA_LOCK_INIT(ifp) \
mtx_init(&(ifp)->if_afdata_mtx, "if_afdata", NULL, MTX_DEF)
#define IF_AFDATA_LOCK(ifp) mtx_lock(&(ifp)->if_afdata_mtx)
#define IF_AFDATA_TRYLOCK(ifp) mtx_trylock(&(ifp)->if_afdata_mtx)
#define IF_AFDATA_UNLOCK(ifp) mtx_unlock(&(ifp)->if_afdata_mtx)
#define IF_AFDATA_DESTROY(ifp) mtx_destroy(&(ifp)->if_afdata_mtx)
rw_init(&(ifp)->if_afdata_lock, "if_afdata")
#define IF_AFDATA_LOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_mtx, MA_OWNED)
#define IF_AFDATA_UNLOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_mtx, MA_NOTOWNED)
#define IF_AFDATA_WLOCK(ifp) rw_wlock(&(ifp)->if_afdata_lock)
#define IF_AFDATA_RLOCK(ifp) rw_rlock(&(ifp)->if_afdata_lock)
#define IF_AFDATA_WUNLOCK(ifp) rw_wunlock(&(ifp)->if_afdata_lock)
#define IF_AFDATA_RUNLOCK(ifp) rw_runlock(&(ifp)->if_afdata_lock)
#define IF_AFDATA_LOCK(ifp) IF_AFDATA_WLOCK(ifp)
#define IF_AFDATA_UNLOCK(ifp) IF_AFDATA_WUNLOCK(ifp)
#define IF_AFDATA_TRYLOCK(ifp) rw_try_wlock(&(ifp)->if_afdata_lock)
#define IF_AFDATA_DESTROY(ifp) rw_destroy(&(ifp)->if_afdata_lock)
#define IF_AFDATA_LOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED)
#define IF_AFDATA_UNLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED)
#define IFF_LOCKGIANT(ifp) do { \
if ((ifp)->if_flags & IFF_NEEDSGIANT) \
@ -637,14 +643,14 @@ struct ifmultiaddr {
IFA_UNLOCK(ifa); \
} while (0)
extern struct mtx ifnet_lock;
extern struct rwlock ifnet_lock;
#define IFNET_LOCK_INIT() \
mtx_init(&ifnet_lock, "ifnet", NULL, MTX_DEF | MTX_RECURSE)
#define IFNET_WLOCK() mtx_lock(&ifnet_lock)
#define IFNET_WUNLOCK() mtx_unlock(&ifnet_lock)
#define IFNET_WLOCK_ASSERT() mtx_assert(&ifnet_lock, MA_OWNED)
#define IFNET_RLOCK() IFNET_WLOCK()
#define IFNET_RUNLOCK() IFNET_WUNLOCK()
rw_init_flags(&ifnet_lock, "ifnet", RW_RECURSE)
#define IFNET_WLOCK() rw_wlock(&ifnet_lock)
#define IFNET_WUNLOCK() rw_wunlock(&ifnet_lock)
#define IFNET_WLOCK_ASSERT() rw_assert(&ifnet_lock, RA_LOCKED)
#define IFNET_RLOCK() rw_rlock(&ifnet_lock)
#define IFNET_RUNLOCK() rw_runlock(&ifnet_lock)
struct ifindex_entry {
struct ifnet *ife_ifnet;