Rename NET_PICKUP_GIANT() to NET_LOCK_GIANT(), and NET_DROP_GIANT()

to NET_UNLOCK_GIANT().  While they are used in similar ways, the
semantics are quite different -- NET_LOCK_GIANT() and NET_UNLOCK_GIANT()
directly wrap mutex lock and unlock operations, whereas drop/pickup
special case the handling of Giant recursion.  Add a comment saying
as much.

Add NET_ASSERT_GIANT(), which conditionally asserts Giant based
on the value of debug_mpsafenet.
This commit is contained in:
Robert Watson 2004-03-01 22:37:01 +00:00
parent 305d4ab105
commit 6200a93f82
2 changed files with 11 additions and 5 deletions
sys

View File

@ -936,9 +936,9 @@ DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
*(struct sockaddr_in **)(mtag+1) = args.next_hop;
m_tag_prepend(m, mtag);
}
NET_PICKUP_GIANT();
NET_LOCK_GIANT();
(*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen);
NET_DROP_GIANT();
NET_UNLOCK_GIANT();
return;
bad:
m_freem(m);

View File

@ -345,20 +345,26 @@ do { \
* input path and protocols that require Giant must collect it
* on entry. When 0 Giant is grabbed in the network interface
* ISR's and in the netisr path and there is no need to grab
* the Giant lock.
* the Giant lock. Note that, unlike GIANT_PICKUP() and
* GIANT_DROP(), these macros directly wrap mutex operations
* without special recursion handling.
*
* This mechanism is intended as temporary until everything of
* importance is properly locked.
*/
extern int debug_mpsafenet; /* defined in net/netisr.c */
#define NET_PICKUP_GIANT() do { \
#define NET_LOCK_GIANT() do { \
if (debug_mpsafenet) \
mtx_lock(&Giant); \
} while (0)
#define NET_DROP_GIANT() do { \
#define NET_UNLOCK_GIANT() do { \
if (debug_mpsafenet) \
mtx_unlock(&Giant); \
} while (0)
#define NET_ASSERT_GIANT() do { \
if (debug_mpsafenet) \
mtx_assert(&Giant, MA_OWNED); \
} while (0)
#define UGAR(rval) do { \
int _val = (rval); \