diff options
author | glebius <glebius@FreeBSD.org> | 2004-11-02 21:24:30 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2004-11-02 21:24:30 +0000 |
commit | a033067901d630caa7ecc38fcf8a0d416a4b6d3d (patch) | |
tree | a65f34c1266b3b9307271ab695db1b77e0055c9e /sys/netgraph | |
parent | 8b6661b126d65e1e6be9c505085ca230e7f42f01 (diff) | |
download | FreeBSD-src-a033067901d630caa7ecc38fcf8a0d416a4b6d3d.zip FreeBSD-src-a033067901d630caa7ecc38fcf8a0d416a4b6d3d.tar.gz |
- Make ng_timeout() to use callout() interface instead of timeout().
- Remove callout-hacking from ng_untimeout().
Approved by: julian (mentor)
MFC after: 1 month
Diffstat (limited to 'sys/netgraph')
-rw-r--r-- | sys/netgraph/netgraph.h | 7 | ||||
-rw-r--r-- | sys/netgraph/ng_base.c | 36 | ||||
-rw-r--r-- | sys/netgraph/ng_source.c | 15 |
3 files changed, 28 insertions, 30 deletions
diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h index 8ef9aa6..8b79ded 100644 --- a/sys/netgraph/netgraph.h +++ b/sys/netgraph/netgraph.h @@ -1074,10 +1074,11 @@ int ng_rmtype(struct ng_type *tp); int ng_snd_item(item_p item, int queue); int ng_send_fn(node_p node, hook_p hook, ng_item_fn *fn, void *arg1, int arg2); -int ng_untimeout(struct callout_handle handle, node_p node); -struct callout_handle - ng_timeout(node_p node, hook_p hook, int ticks, +int ng_untimeout(struct callout *c, node_p node); +int ng_timeout(struct callout *c, node_p node, hook_p hook, int ticks, ng_item_fn *fn, void * arg1, int arg2); +/* We should mark callout mpsafe as soon as we mark netgraph ISR mpsafe */ +#define ng_callout_init(c) callout_init(c, 0) /* * prototypes the user should DEFINITELY not use directly diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 601ac9b..c06e830 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -3595,17 +3595,15 @@ ng_timeout_trapoline(void *arg) } -struct callout_handle -ng_timeout(node_p node, hook_p hook, int ticks, +int +ng_timeout(struct callout *c, node_p node, hook_p hook, int ticks, ng_item_fn *fn, void * arg1, int arg2) { item_p item; - if ((item = ng_getqblk()) == NULL) { - struct callout_handle handle; - handle.callout = NULL; - return (handle); - } + if ((item = ng_getqblk()) == NULL) + return (ENOMEM); + item->el_flags = NGQF_FN | NGQF_WRITER; NG_NODE_REF(node); /* and one for the item */ NGI_SET_NODE(item, node); @@ -3616,33 +3614,33 @@ ng_timeout(node_p node, hook_p hook, int ticks, NGI_FN(item) = fn; NGI_ARG1(item) = arg1; NGI_ARG2(item) = arg2; - return (timeout(&ng_timeout_trapoline, item, ticks)); + callout_reset(c, ticks, &ng_timeout_trapoline, item); + return (0); } /* A special modified version of untimeout() */ int -ng_untimeout(struct callout_handle handle, node_p node) +ng_untimeout(struct callout *c, node_p node) { item_p item; + int rval; - if (handle.callout == NULL) + if (c == NULL) return (0); - mtx_lock_spin(&callout_lock); - item = handle.callout->c_arg; /* should be an official way to do this */ - if ((handle.callout->c_func == &ng_timeout_trapoline) && - (NGI_NODE(item) == node) && - (callout_stop(handle.callout))) { + rval = callout_drain(c); + item = c->c_arg; + /* Do an extra check */ + if ((c->c_func == &ng_timeout_trapoline) && + (NGI_NODE(item) == node)) { /* * We successfully removed it from the queue before it ran * So now we need to unreference everything that was * given extra references. (NG_FREE_ITEM does this). */ - mtx_unlock_spin(&callout_lock); NG_FREE_ITEM(item); - return (1); } - mtx_unlock_spin(&callout_lock); - return (0); + + return (rval); } /* diff --git a/sys/netgraph/ng_source.c b/sys/netgraph/ng_source.c index 291d9c9..809c7ff 100644 --- a/sys/netgraph/ng_source.c +++ b/sys/netgraph/ng_source.c @@ -87,7 +87,7 @@ struct privdata { struct ng_source_stats stats; struct ifqueue snd_queue; /* packets to send */ struct ifnet *output_ifp; - struct callout_handle intr_ch; + struct callout intr_ch; u_int64_t packets; /* packets to send */ u_int32_t queueOctets; }; @@ -219,8 +219,8 @@ ng_source_constructor(node_p node) NG_NODE_SET_PRIVATE(node, sc); sc->node = node; sc->snd_queue.ifq_maxlen = 2048; /* XXX not checked */ - callout_handle_init(&sc->intr_ch); /* XXX fix.. will - cause problems. */ + ng_callout_init(&sc->intr_ch); + return (0); } @@ -331,7 +331,7 @@ ng_source_rcvmsg(node_p node, item_p item, hook_p lasthook) timevalclear(&sc->stats.elapsedTime); timevalclear(&sc->stats.endTime); getmicrotime(&sc->stats.startTime); - sc->intr_ch = ng_timeout(node, NULL, 0, + ng_timeout(&sc->intr_ch, node, NULL, 0, ng_source_intr, sc, 0); } break; @@ -359,7 +359,7 @@ ng_source_rcvmsg(node_p node, item_p item, hook_p lasthook) timevalclear(&sc->stats.elapsedTime); timevalclear(&sc->stats.endTime); getmicrotime(&sc->stats.startTime); - sc->intr_ch = ng_timeout(node, NULL, 0, + ng_timeout(&sc->intr_ch, node, NULL, 0, ng_source_intr, sc, 0); } break; @@ -586,7 +586,7 @@ static void ng_source_stop (sc_p sc) { if (sc->node->nd_flags & NG_SOURCE_ACTIVE) { - ng_untimeout(sc->intr_ch, sc->node); + ng_untimeout(&sc->intr_ch, sc->node); sc->node->nd_flags &= ~NG_SOURCE_ACTIVE; getmicrotime(&sc->stats.endTime); sc->stats.elapsedTime = sc->stats.endTime; @@ -610,7 +610,6 @@ ng_source_intr(node_p node, hook_p hook, void *arg1, int arg2) KASSERT(sc != NULL, ("%s: null node private", __func__)); - callout_handle_init(&sc->intr_ch); if (sc->packets == 0 || sc->output.hook == NULL || (sc->node->nd_flags & NG_SOURCE_ACTIVE) == 0) { ng_source_stop(sc); @@ -627,7 +626,7 @@ ng_source_intr(node_p node, hook_p hook, void *arg1, int arg2) if (sc->packets == 0) ng_source_stop(sc); else - sc->intr_ch = ng_timeout(node, NULL, NG_SOURCE_INTR_TICKS, + ng_timeout(&sc->intr_ch, node, NULL, NG_SOURCE_INTR_TICKS, ng_source_intr, sc, 0); } |