Slight cosmetic changes.

Also introduce a macro to be called by persistent nodes to signal their
persistence during shutdown to hide this mechanism from the node author.

Make node flags have a consistent style in naming.

Document the change.
This commit is contained in:
Julian Elischer 2004-07-20 17:15:38 +00:00
parent 01f679a25f
commit be4252b367
12 changed files with 64 additions and 47 deletions

View File

@ -433,14 +433,14 @@ Some nodes (usually associated with a piece of hardware) may be
in that a shutdown breaks all edges and resets the node,
but does not remove it.
In this case, the shutdown method should not
free its resources, but rather, clean up and then clear the
.Dv NG_INVALID
flag to signal the generic code that the shutdown is aborted.
free its resources, but rather, clean up and then call the
.Em NG_NODE_REVIVE()
macro to signal the generic code that the shutdown is aborted.
In the case where the shutdown is started by the node itself due to hardware
removal or unloading (via
.Fn ng_rmnode_self ) ,
it should set the
.Dv NG_REALLY_DIE
.Dv NGF_REALLY_DIE
flag to signal to its own shutdown method that it is not to persist.
.El
.Ss Sending and Receiving Data

View File

@ -2328,11 +2328,11 @@ static int ng_cp_rmnode (node_p node)
splx (s);
}
#ifdef KLD_MODULE
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
NG_NODE_SET_PRIVATE (node, NULL);
NG_NODE_UNREF (node);
}
node->nd_flags &= ~NG_INVALID;
NG_NODE_REVIVE(node); /* Persistant node */
#endif
#else /* __FreeBSD_version < 500000 */
drv_t *d = node->private;

View File

@ -2256,11 +2256,11 @@ static int ng_ct_rmnode (node_p node)
splx (s);
}
#ifdef KLD_MODULE
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
NG_NODE_SET_PRIVATE (node, NULL);
NG_NODE_UNREF (node);
}
node->nd_flags &= ~NG_INVALID;
NG_NODE_REVIVE(node); /* Persistant node */
#endif
#else /* __FreeBSD_version < 500000 */
drv_t *d = node->private;

View File

@ -2716,11 +2716,11 @@ static int ng_cx_rmnode (node_p node)
splx (s);
}
#ifdef KLD_MODULE
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
NG_NODE_SET_PRIVATE (node, NULL);
NG_NODE_UNREF (node);
}
node->nd_flags &= ~NG_INVALID;
NG_NODE_REVIVE(node); /* Persistant node */
#endif
#else /* __FreeBSD_version < 500000 */
drv_t *d = node->private;

View File

@ -1317,7 +1317,7 @@ ng_atm_shutdown(node_p node)
{
struct priv *priv = NG_NODE_PRIVATE(node);
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
/*
* We are called from unloading the ATM driver. Really,
* really need to shutdown this node. The ifp was
@ -1332,7 +1332,7 @@ ng_atm_shutdown(node_p node)
#ifdef NGATM_DEBUG
if (!allow_shutdown)
node->nd_flags &= ~NG_INVALID;
NG_NODE_REVIVE(node); /* we persist */
else {
IFP2NG(priv->ifp) = NULL;
NG_NODE_SET_PRIVATE(node, NULL);
@ -1343,7 +1343,7 @@ ng_atm_shutdown(node_p node)
/*
* We are persistant - reinitialize
*/
node->nd_flags &= ~NG_INVALID;
NG_NODE_REVIVE(node);
#endif
return (0);
}

View File

@ -345,11 +345,16 @@ struct ng_node {
};
/* Flags for a node */
#define NG_INVALID 0x00000001 /* free when refs go to 0 */
#define NG_WORKQ 0x00000002 /* node is on the work queue */
#define NG_FORCE_WRITER 0x00000004 /* Never multithread this node */
#define NG_CLOSING 0x00000008 /* ng_rmnode() at work */
#define NG_REALLY_DIE 0x00000010 /* "persistant" node is unloading */
#define NGF_INVALID 0x00000001 /* free when refs go to 0 */
#define NG_INVALID NGF_INVALID /* compat for old code */
#define NGF_WORKQ 0x00000002 /* node is on the work queue */
#define NG_WORKQ NGF_WORKQ /* compat for old code */
#define NGF_FORCE_WRITER 0x00000004 /* Never multithread this node */
#define NG_FORCE_WRITER NGF_FORCE_WRITER /* compat for old code */
#define NGF_CLOSING 0x00000008 /* ng_rmnode() at work */
#define NG_CLOSING NGF_CLOSING /* compat for old code */
#define NGF_REALLY_DIE 0x00000010 /* "persistent" node is unloading */
#define NG_REALLY_DIE NGF_REALLY_DIE /* compat for old code */
#define NGF_TYPE1 0x10000000 /* reserved for type specific storage */
#define NGF_TYPE2 0x20000000 /* reserved for type specific storage */
#define NGF_TYPE3 0x40000000 /* reserved for type specific storage */
@ -367,13 +372,15 @@ int ng_unref_node(node_p node); /* don't move this */
#define _NG_NODE_UNREF(node) ng_unref_node(node)
#define _NG_NODE_SET_PRIVATE(node, val) do {(node)->nd_private = val;} while (0)
#define _NG_NODE_PRIVATE(node) ((node)->nd_private)
#define _NG_NODE_IS_VALID(node) (!((node)->nd_flags & NG_INVALID))
#define _NG_NODE_NOT_VALID(node) ((node)->nd_flags & NG_INVALID)
#define _NG_NODE_IS_VALID(node) (!((node)->nd_flags & NGF_INVALID))
#define _NG_NODE_NOT_VALID(node) ((node)->nd_flags & NGF_INVALID)
#define _NG_NODE_NUMHOOKS(node) ((node)->nd_numhooks + 0) /* rvalue */
#define _NG_NODE_FORCE_WRITER(node) \
do{ node->nd_flags |= NG_FORCE_WRITER; }while (0)
do{ node->nd_flags |= NGF_FORCE_WRITER; }while (0)
#define _NG_NODE_REALLY_DIE(node) \
do{ node->nd_flags |= (NG_REALLY_DIE|NG_INVALID); }while (0)
do{ node->nd_flags |= (NGF_REALLY_DIE|NGF_INVALID); }while (0)
#define _NG_NODE_REVIVE(node) \
do { node->nd_flags &= ~NGF_INVALID; } while (0)
/*
* The hook iterator.
* This macro will call a function of type ng_fn_eachhook for each
@ -411,6 +418,7 @@ static __inline int _ng_node_numhooks(node_p node, char *file, int line);
static __inline void _ng_node_force_writer(node_p node, char *file, int line);
static __inline hook_p _ng_node_foreach_hook(node_p node,
ng_fn_eachhook *fn, void *arg, char *file, int line);
static __inline void _ng_node_revive(node_p node, char *file, int line);
static void __inline
_chknode(node_p node, char *file, int line)
@ -508,6 +516,13 @@ _ng_node_really_die(node_p node, char *file, int line)
_NG_NODE_REALLY_DIE(node);
}
static __inline void
_ng_node_revive(node_p node, char *file, int line)
{
_chknode(node, file, line);
_NG_NODE_REVIVE(node);
}
static __inline hook_p
_ng_node_foreach_hook(node_p node, ng_fn_eachhook *fn, void *arg,
char *file, int line)
@ -530,6 +545,7 @@ _ng_node_foreach_hook(node_p node, ng_fn_eachhook *fn, void *arg,
#define NG_NODE_FORCE_WRITER(node) _ng_node_force_writer(node, _NN_)
#define NG_NODE_REALLY_DIE(node) _ng_node_really_die(node, _NN_)
#define NG_NODE_NUMHOOKS(node) _ng_node_numhooks(node, _NN_)
#define NG_NODE_REVIVE(node) _ng_node_revive(node, _NN_)
#define NG_NODE_FOREACH_HOOK(node, fn, arg, rethook) \
do { \
rethook = _ng_node_foreach_hook(node, fn, (void *)arg, _NN_); \
@ -549,6 +565,7 @@ _ng_node_foreach_hook(node_p node, ng_fn_eachhook *fn, void *arg,
#define NG_NODE_FORCE_WRITER(node) _NG_NODE_FORCE_WRITER(node)
#define NG_NODE_REALLY_DIE(node) _NG_NODE_REALLY_DIE(node)
#define NG_NODE_NUMHOOKS(node) _NG_NODE_NUMHOOKS(node)
#define NG_NODE_REVIVE(node) _NG_NODE_REVIVE(node)
#define NG_NODE_FOREACH_HOOK(node, fn, arg, rethook) \
_NG_NODE_FOREACH_HOOK(node, fn, arg, rethook)
#endif /* NETGRAPH_DEBUG */ /*----------------------------------------------*/

View File

@ -110,7 +110,7 @@ struct ng_type ng_deadtype = {
struct ng_node ng_deadnode = {
"dead",
&ng_deadtype,
NG_INVALID,
NGF_INVALID,
1, /* refs */
0, /* numhooks */
NULL, /* private */
@ -675,7 +675,7 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
hook_p hook;
/* Check if it's already shutting down */
if ((node->nd_flags & NG_CLOSING) != 0)
if ((node->nd_flags & NGF_CLOSING) != 0)
return;
if (node == &ng_deadnode) {
@ -689,10 +689,10 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
/*
* Mark it invalid so any newcomers know not to try use it
* Also add our own mark so we can't recurse
* note that NG_INVALID does not do this as it's also set during
* note that NGF_INVALID does not do this as it's also set during
* creation
*/
node->nd_flags |= NG_INVALID|NG_CLOSING;
node->nd_flags |= NGF_INVALID|NGF_CLOSING;
/* If node has its pre-shutdown method, then call it first*/
if (node->nd_type && node->nd_type->close)
@ -721,9 +721,9 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
* Presumably it is a persistant node.
* If we REALLY want it to go away,
* e.g. hardware going away,
* Our caller should set NG_REALLY_DIE in nd_flags.
* Our caller should set NGF_REALLY_DIE in nd_flags.
*/
node->nd_flags &= ~(NG_INVALID|NG_CLOSING);
node->nd_flags &= ~(NGF_INVALID|NGF_CLOSING);
NG_NODE_UNREF(node); /* Assume they still have theirs */
return;
}
@ -1460,8 +1460,8 @@ ng_rmnode_self(node_p node)
if (node == &ng_deadnode)
return (0);
node->nd_flags |= NG_INVALID;
if (node->nd_flags & NG_CLOSING)
node->nd_flags |= NGF_INVALID;
if (node->nd_flags & NGF_CLOSING)
return (0);
error = ng_send_fn(node, NULL, &ng_rmnode, NULL, 0);
@ -2200,7 +2200,7 @@ ng_snd_item(item_p item, int queue)
* Similarly the node may say one hook always produces writers.
* These are over-rides.
*/
if ((node->nd_flags & NG_FORCE_WRITER)
if ((node->nd_flags & NGF_FORCE_WRITER)
|| (hook && (hook->hk_flags & HK_FORCE_WRITER))) {
rw = NGQRW_W;
item->el_flags &= ~NGQF_READER;
@ -3288,7 +3288,7 @@ ngintr(void)
mtx_unlock_spin(&ng_worklist_mtx);
break;
}
node->nd_flags &= ~NG_WORKQ;
node->nd_flags &= ~NGF_WORKQ;
TAILQ_REMOVE(&ng_worklist, node, nd_work);
mtx_unlock_spin(&ng_worklist_mtx);
/*
@ -3325,8 +3325,8 @@ static void
ng_worklist_remove(node_p node)
{
mtx_lock_spin(&ng_worklist_mtx);
if (node->nd_flags & NG_WORKQ) {
node->nd_flags &= ~NG_WORKQ;
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_NODE_UNREF(node);
@ -3344,12 +3344,12 @@ static void
ng_setisr(node_p node)
{
mtx_lock_spin(&ng_worklist_mtx);
if ((node->nd_flags & NG_WORKQ) == 0) {
if ((node->nd_flags & NGF_WORKQ) == 0) {
/*
* If we are not already on the work queue,
* then put us on.
*/
node->nd_flags |= NG_WORKQ;
node->nd_flags |= NGF_WORKQ;
TAILQ_INSERT_TAIL(&ng_worklist, node, nd_work);
NG_NODE_REF(node); /* XXX fafe in mutex? */
}

View File

@ -760,7 +760,7 @@ ng_bridge_shutdown(node_p node)
__func__, priv->numLinks, priv->numHosts));
FREE(priv->tab, M_NETGRAPH_BRIDGE);
/* NG_INVALID flag is now set so node will be freed at next timeout */
/* NGF_INVALID flag is now set so node will be freed at next timeout */
return (0);
}
@ -954,7 +954,7 @@ ng_bridge_remove_hosts(priv_p priv, int linkNum)
* a detected loopback condition, and we remove any hosts from
* the hashtable whom we haven't heard from in a long while.
*
* If the node has the NG_INVALID flag set, our job is to kill it.
* If the node has the NGF_INVALID flag set, our job is to kill it.
*/
static void
ng_bridge_timeout(void *arg)

View File

@ -565,7 +565,7 @@ ng_ether_shutdown(node_p node)
{
const priv_p priv = NG_NODE_PRIVATE(node);
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
/*
* WE came here because the ethernet card is being unloaded,
* so stop being persistant.
@ -582,7 +582,8 @@ ng_ether_shutdown(node_p node)
priv->promisc = 0;
}
priv->autoSrcAddr = 1; /* reset auto-src-addr flag */
node->nd_flags &= ~NG_INVALID; /* Signal ng_rmnode we are persisant */
NG_NODE_REVIVE(node); /* Signal ng_rmnode we are persisant */
return (0);
}

View File

@ -492,7 +492,7 @@ ng_gif_shutdown(node_p node)
{
const priv_p priv = NG_NODE_PRIVATE(node);
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
/*
* WE came here because the gif interface is being destroyed,
* so stop being persistant.
@ -504,7 +504,7 @@ ng_gif_shutdown(node_p node)
NG_NODE_UNREF(node); /* free node itself */
return (0);
}
node->nd_flags &= ~NG_INVALID; /* Signal ng_rmnode we are persisant */
NG_NODE_REVIVE(node); /* Signal ng_rmnode we are persisant */
return (0);
}

View File

@ -408,8 +408,8 @@ devintr()
* All our links and the name have already been removed.
* If we are a persistant device, we might refuse to go away.
* In the case of a persistant node we signal the framework that we
* are still in business by clearing the NG_INVALID bit. However
* If we find the NG_REALLY_DIE bit set, this means that
* are still in business by clearing the NGF_INVALID bit. However
* If we find the NGF_REALLY_DIE bit set, this means that
* we REALLY need to die (e.g. hardware removed).
* This would have been set using the NG_NODE_REALLY_DIE(node)
* macro in some device dependent function (not shown here) before
@ -425,7 +425,7 @@ ng_xxx_shutdown(node_p node)
NG_NODE_UNREF(privdata->node);
FREE(privdata, M_NETGRAPH);
#else
if (node->nd_flags & NG_REALLY_DIE) {
if (node->nd_flags & NGF_REALLY_DIE) {
/*
* WE came here because the widget card is being unloaded,
* so stop being persistant.
@ -436,7 +436,7 @@ ng_xxx_shutdown(node_p node)
FREE(privdata, M_NETGRAPH);
return (0);
}
node->nd_flags &= ~NG_INVALID; /* reset invalid flag */
NG_NODE_REVIVE(node); /* tell ng_rmnode() we will persist */
#endif /* PERSISTANT_NODE */
return (0);
}

View File

@ -433,7 +433,6 @@ ng_source_rmnode(node_p node)
sc = NG_NODE_PRIVATE(node);
KASSERT(sc != NULL, ("%s: null node private", __func__));
node->nd_flags |= NG_INVALID;
ng_source_stop(sc);
ng_source_clr_data(sc);
NG_NODE_SET_PRIVATE(node, NULL);