summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwkoszek <wkoszek@FreeBSD.org>2007-03-30 14:34:34 +0000
committerwkoszek <wkoszek@FreeBSD.org>2007-03-30 14:34:34 +0000
commit44897a4bf030654946d11c8271faa39aec7cb894 (patch)
tree2d6dda25f44a1ffacee2a017ce80be3866491778
parent23c32e03dd5f64a0dc3c5687381e872866ad8387 (diff)
downloadFreeBSD-src-44897a4bf030654946d11c8271faa39aec7cb894.zip
FreeBSD-src-44897a4bf030654946d11c8271faa39aec7cb894.tar.gz
Instead of direct manipulation on queue and worklist mutexes, bring macros
for doing this job. This change will make it easy to migrate from using spinning locks to adaptive ones. Reviewed by: glebius, julian Approved by: cognet (mentor)
-rw-r--r--sys/netgraph/ng_base.c67
1 files changed, 40 insertions, 27 deletions
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index 71ca944..df0e86f 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -228,6 +228,19 @@ MALLOC_DEFINE(M_NETGRAPH_MSG, "netgraph_msg", "netgraph name storage");
#define _NG_ALLOC_NODE(node) \
MALLOC(node, node_p, sizeof(*node), M_NETGRAPH_NODE, M_NOWAIT | M_ZERO)
+#define NG_QUEUE_LOCK_INIT(n) \
+ mtx_init(&(n)->q_mtx, "ng_node", NULL, MTX_SPIN)
+#define NG_QUEUE_LOCK(n) \
+ mtx_lock_spin(&(n)->q_mtx)
+#define NG_QUEUE_UNLOCK(n) \
+ mtx_unlock_spin(&(n)->q_mtx)
+#define NG_WORKLIST_LOCK_INIT() \
+ mtx_init(&ng_worklist_mtx, "ng_worklist", NULL, MTX_SPIN)
+#define NG_WORKLIST_LOCK() \
+ mtx_lock_spin(&ng_worklist_mtx)
+#define NG_WORKLIST_UNLOCK() \
+ mtx_unlock_spin(&ng_worklist_mtx)
+
#ifdef NETGRAPH_DEBUG /*----------------------------------------------*/
/*
* In debug mode:
@@ -605,7 +618,7 @@ ng_make_node_common(struct ng_type *type, node_p *nodepp)
NG_NODE_REF(node); /* note reference */
type->refs++;
- mtx_init(&node->nd_input_queue.q_mtx, "ng_node", NULL, MTX_SPIN);
+ NG_QUEUE_LOCK_INIT(&node->nd_input_queue);
node->nd_input_queue.queue = NULL;
node->nd_input_queue.last = &node->nd_input_queue.queue;
node->nd_input_queue.q_flags = 0;
@@ -2039,7 +2052,7 @@ ng_acquire_read(struct ng_queue *ngq, item_p item)
atomic_subtract_long(&ngq->q_flags, READER_INCREMENT);
/* ######### End Hack alert ######### */
- mtx_lock_spin((&ngq->q_mtx));
+ NG_QUEUE_LOCK(ngq);
/*
* Try again. Another processor (or interrupt for that matter) may
* have removed the last queued item that was stopping us from
@@ -2050,7 +2063,7 @@ ng_acquire_read(struct ng_queue *ngq, item_p item)
*/
if ((ngq->q_flags & NGQ_RMASK) == 0) {
atomic_add_long(&ngq->q_flags, READER_INCREMENT);
- mtx_unlock_spin((&ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
CTR4(KTR_NET, "%20s: node [%x] (%p) slow acquired item %p",
__func__, ngq->q_node->nd_ID, ngq->q_node, item);
return (item);
@@ -2060,7 +2073,7 @@ ng_acquire_read(struct ng_queue *ngq, item_p item)
* and queue the request for later.
*/
ng_queue_rw(ngq, item, NGQRW_R);
- mtx_unlock_spin(&(ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
return (NULL);
}
@@ -2072,7 +2085,7 @@ ng_acquire_write(struct ng_queue *ngq, item_p item)
("%s: working on deadnode", __func__));
restart:
- mtx_lock_spin(&(ngq->q_mtx));
+ NG_QUEUE_LOCK(ngq);
/*
* If there are no readers, no writer, and no pending packets, then
* we can just go ahead. In all other situations we need to queue the
@@ -2081,7 +2094,7 @@ restart:
if ((ngq->q_flags & NGQ_WMASK) == 0) {
/* collision could happen *HERE* */
atomic_add_long(&ngq->q_flags, WRITER_ACTIVE);
- mtx_unlock_spin((&ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
if (ngq->q_flags & READER_MASK) {
/* Collision with fast-track reader */
atomic_subtract_long(&ngq->q_flags, WRITER_ACTIVE);
@@ -2096,7 +2109,7 @@ restart:
* and queue the request for later.
*/
ng_queue_rw(ngq, item, NGQRW_W);
- mtx_unlock_spin(&(ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
return (NULL);
}
@@ -2192,7 +2205,7 @@ ng_flush_input_queue(struct ng_queue * ngq)
{
item_p item;
- mtx_lock_spin(&ngq->q_mtx);
+ NG_QUEUE_LOCK(ngq);
while (ngq->queue) {
item = ngq->queue;
ngq->queue = item->el_next;
@@ -2200,7 +2213,7 @@ ng_flush_input_queue(struct ng_queue * ngq)
ngq->last = &(ngq->queue);
atomic_add_long(&ngq->q_flags, -OP_PENDING);
}
- mtx_unlock_spin(&ngq->q_mtx);
+ NG_QUEUE_UNLOCK(ngq);
/* If the item is supplying a callback, call it with an error */
if (item->apply != NULL) {
@@ -2208,14 +2221,14 @@ ng_flush_input_queue(struct ng_queue * ngq)
item->apply = NULL;
}
NG_FREE_ITEM(item);
- mtx_lock_spin(&ngq->q_mtx);
+ NG_QUEUE_LOCK(ngq);
}
/*
* Take us off the work queue if we are there.
* We definately have no work to be done.
*/
ng_worklist_remove(ngq->q_node);
- mtx_unlock_spin(&ngq->q_mtx);
+ NG_QUEUE_UNLOCK(ngq);
}
/***********************************************************************
@@ -2339,9 +2352,9 @@ ng_snd_item(item_p item, int flags)
#ifdef NETGRAPH_DEBUG
_ngi_check(item, __FILE__, __LINE__);
#endif
- mtx_lock_spin(&(ngq->q_mtx));
+ NG_QUEUE_LOCK(ngq);
ng_queue_rw(ngq, item, rw);
- mtx_unlock_spin(&(ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
if (flags & NG_PROGRESS)
return (EINPROGRESS);
@@ -2384,10 +2397,10 @@ ng_snd_item(item_p item, int flags)
return (error);
}
- mtx_lock_spin(&(ngq->q_mtx));
+ NG_QUEUE_LOCK(ngq);
if (NEXT_QUEUED_ITEM_CAN_PROCEED(ngq))
ng_setisr(ngq->q_node);
- mtx_unlock_spin(&(ngq->q_mtx));
+ NG_QUEUE_UNLOCK(ngq);
return (error);
}
@@ -3140,7 +3153,7 @@ ngb_mod_event(module_t mod, int event, void *data)
switch (event) {
case MOD_LOAD:
/* Initialize everything. */
- mtx_init(&ng_worklist_mtx, "ng_worklist", NULL, MTX_SPIN);
+ NG_WORKLIST_LOCK_INIT();
mtx_init(&ng_typelist_mtx, "netgraph types mutex", NULL,
MTX_DEF);
mtx_init(&ng_nodelist_mtx, "netgraph nodelist mutex", NULL,
@@ -3318,15 +3331,15 @@ ngintr(void)
node_p node = NULL;
for (;;) {
- mtx_lock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_LOCK();
node = TAILQ_FIRST(&ng_worklist);
if (!node) {
- mtx_unlock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_UNLOCK();
break;
}
node->nd_flags &= ~NGF_WORKQ;
TAILQ_REMOVE(&ng_worklist, node, nd_work);
- mtx_unlock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_UNLOCK();
CTR3(KTR_NET, "%20s: node [%x] (%p) taken off worklist",
__func__, node->nd_ID, node);
/*
@@ -3345,13 +3358,13 @@ ngintr(void)
for (;;) {
int rw;
- mtx_lock_spin(&node->nd_input_queue.q_mtx);
+ NG_QUEUE_LOCK(&node->nd_input_queue);
item = ng_dequeue(&node->nd_input_queue, &rw);
if (item == NULL) {
- mtx_unlock_spin(&node->nd_input_queue.q_mtx);
+ NG_QUEUE_UNLOCK(&node->nd_input_queue);
break; /* go look for another node */
} else {
- mtx_unlock_spin(&node->nd_input_queue.q_mtx);
+ NG_QUEUE_UNLOCK(&node->nd_input_queue);
NGI_GET_NODE(item, node); /* zaps stored node */
ng_apply_item(node, item, rw);
NG_NODE_UNREF(node);
@@ -3366,16 +3379,16 @@ ng_worklist_remove(node_p node)
{
mtx_assert(&node->nd_input_queue.q_mtx, MA_OWNED);
- mtx_lock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_LOCK();
if (node->nd_flags & NGF_WORKQ) {
node->nd_flags &= ~NGF_WORKQ;
TAILQ_REMOVE(&ng_worklist, node, nd_work);
- mtx_unlock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_UNLOCK();
NG_NODE_UNREF(node);
CTR3(KTR_NET, "%20s: node [%x] (%p) removed from worklist",
__func__, node->nd_ID, node);
} else {
- mtx_unlock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_UNLOCK();
}
}
@@ -3396,9 +3409,9 @@ ng_setisr(node_p node)
* then put us on.
*/
node->nd_flags |= NGF_WORKQ;
- mtx_lock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_LOCK();
TAILQ_INSERT_TAIL(&ng_worklist, node, nd_work);
- mtx_unlock_spin(&ng_worklist_mtx);
+ NG_WORKLIST_UNLOCK();
NG_NODE_REF(node); /* XXX fafe in mutex? */
CTR3(KTR_NET, "%20s: node [%x] (%p) put on worklist", __func__,
node->nd_ID, node);
OpenPOWER on IntegriCloud