From owner-p4-projects@FreeBSD.ORG Wed Nov 1 21:16:21 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E386516A505; Wed, 1 Nov 2006 21:16:20 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7E97716A508 for ; Wed, 1 Nov 2006 21:16:20 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 744BF43D72 for ; Wed, 1 Nov 2006 21:16:16 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kA1LGGrB049060 for ; Wed, 1 Nov 2006 21:16:16 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kA1LGGbt049057 for perforce@freebsd.org; Wed, 1 Nov 2006 21:16:16 GMT (envelope-from piso@freebsd.org) Date: Wed, 1 Nov 2006 21:16:16 GMT Message-Id: <200611012116.kA1LGGbt049057@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 108959 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Nov 2006 21:16:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=108959 Change 108959 by piso@piso_newluxor on 2006/11/01 21:16:12 -assert lock in functions manipulating libalias -turn libalias lock to non recursive -spacing Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#20 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_db.c#14 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#9 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_proxy.c#10 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#20 (text+ko) ==== @@ -283,6 +283,8 @@ static int IcmpAliasIn1(struct libalias *la, struct ip *pip) { + + LIBALIAS_LOCK_ASSERT(la); /* De-alias incoming echo and timestamp replies. Alias incoming echo and timestamp requests. @@ -326,6 +328,8 @@ static int IcmpAliasIn2(struct libalias *la, struct ip *pip) { + + LIBALIAS_LOCK_ASSERT(la); /* Alias incoming ICMP error messages containing IP header and first 64 bits of datagram. @@ -429,6 +433,7 @@ int iresult; struct icmp *ic; + LIBALIAS_LOCK_ASSERT(la); /* Return if proxy-only mode is enabled */ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); @@ -468,6 +473,7 @@ struct alias_link *lnk; struct icmp *ic; + LIBALIAS_LOCK_ASSERT(la); ic = (struct icmp *)ip_next(pip); /* Save overwritten data for when echo packet returns */ @@ -515,6 +521,7 @@ struct tcphdr *tc; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); ic = (struct icmp *)ip_next(pip); ip = &ic->icmp_ip; @@ -608,6 +615,7 @@ int iresult; struct icmp *ic; + LIBALIAS_LOCK_ASSERT(la); (void)create; /* Return if proxy-only mode is enabled */ @@ -650,6 +658,7 @@ */ struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); /* Return if proxy-only mode is enabled */ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); @@ -681,6 +690,7 @@ */ struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); (void)create; /* Return if proxy-only mode is enabled */ @@ -710,6 +720,7 @@ struct udphdr *ud; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); /* Return if proxy-only mode is enabled */ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); @@ -775,6 +786,7 @@ struct alias_link *lnk; int error; + LIBALIAS_LOCK_ASSERT(la); /* Return if proxy-only mode is enabled */ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); @@ -835,6 +847,7 @@ struct tcphdr *tc; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); tc = (struct tcphdr *)ip_next(pip); lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst, @@ -959,6 +972,7 @@ struct tcphdr *tc; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); tc = (struct tcphdr *)ip_next(pip); if (create) @@ -1085,6 +1099,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindFragmentIn2(la, pip->ip_src, pip->ip_dst, pip->ip_id); if (lnk != NULL) { struct in_addr original_address; @@ -1105,6 +1120,7 @@ { struct in_addr alias_address; + LIBALIAS_LOCK_ASSERT(la); alias_address = FindAliasAddress(la, pip->ip_src); DifferentialChecksum(&pip->ip_sum, &alias_address, &pip->ip_src, 2); @@ -1206,7 +1222,9 @@ LIBALIAS_LOCK(la); if (la->packetAliasMode & PKT_ALIAS_REVERSE) { la->packetAliasMode &= ~PKT_ALIAS_REVERSE; + LIBALIAS_UNLOCK(la); iresult = LibAliasOut(la, ptr, maxpacketsize); + LIBALIAS_LOCK(la); la->packetAliasMode |= PKT_ALIAS_REVERSE; goto getout; } @@ -1318,7 +1336,9 @@ LIBALIAS_LOCK(la); if (la->packetAliasMode & PKT_ALIAS_REVERSE) { la->packetAliasMode &= ~PKT_ALIAS_REVERSE; + LIBALIAS_UNLOCK(la); iresult = LibAliasIn(la, ptr, maxpacketsize); + LIBALIAS_LOCK(la); la->packetAliasMode |= PKT_ALIAS_REVERSE; goto getout; } ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_db.c#14 (text+ko) ==== @@ -482,6 +482,8 @@ static void ShowAliasStats(struct libalias *la) { + + LIBALIAS_LOCK_ASSERT(la); /* Used for debugging */ if (la->logDesc) { int tot = la->icmpLinkCount + la->udpLinkCount + @@ -575,6 +577,7 @@ u_short port_sys; u_short port_net; + LIBALIAS_LOCK_ASSERT(la); /* Description of alias_port_param for GetNewPort(). When this parameter is zero or positive, it precisely specifies @@ -675,6 +678,7 @@ int sock; struct sockaddr_in sock_addr; + LIBALIAS_LOCK_ASSERT(la); if (link_type == LINK_TCP) sock = socket(AF_INET, SOCK_STREAM, 0); else if (link_type == LINK_UDP) @@ -733,6 +737,7 @@ u_short port_sys; int link_type; + LIBALIAS_LOCK_ASSERT(la); /* * Get link_type from protocol */ @@ -812,6 +817,7 @@ struct alias_link *lnk; int i, icount; + LIBALIAS_LOCK_ASSERT(la); icount = 0; for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) { lnk = LIST_FIRST(&la->linkTableOut[i]); @@ -835,6 +841,7 @@ int icount; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); icount = 0; lnk = LIST_FIRST(&la->linkTableOut[la->cleanupIndex++]); while (lnk != NULL) { @@ -875,6 +882,7 @@ { struct libalias *la = lnk->la; + LIBALIAS_LOCK_ASSERT(la); /* Don't do anything if the link is marked permanent */ if (la->deleteAllLinks == 0 && lnk->flags & LINK_PERMANENT) return; @@ -959,6 +967,7 @@ u_int start_point; /* zero, equal to alias port */ struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = malloc(sizeof(struct alias_link)); if (lnk != NULL) { /* Basic initialization */ @@ -1100,6 +1109,7 @@ struct alias_link *new_lnk; /* zero, equal to alias port */ struct libalias *la = old_lnk->la; + LIBALIAS_LOCK_ASSERT(la); new_lnk = AddLink(la, src_addr, dst_addr, alias_addr, src_port, dst_port, alias_port_param, link_type); @@ -1125,6 +1135,7 @@ u_int i; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type); LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) { if (lnk->src_addr.s_addr == src_addr.s_addr @@ -1172,6 +1183,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = _FindLinkOut(la, src_addr, dst_addr, src_port, dst_port, link_type, replace_partial_links); @@ -1208,6 +1220,7 @@ struct alias_link *lnk_unknown_dst_addr; struct alias_link *lnk_unknown_dst_port; + LIBALIAS_LOCK_ASSERT(la); /* Initialize pointers */ lnk_fully_specified = NULL; lnk_unknown_all = NULL; @@ -1311,6 +1324,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = _FindLinkIn(la, dst_addr, alias_addr, dst_port, alias_port, link_type, replace_partial_links); @@ -1358,6 +1372,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkIn(la, dst_addr, alias_addr, NO_DEST_PORT, id_alias, LINK_ICMP, 0); @@ -1381,6 +1396,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkOut(la, src_addr, dst_addr, id, NO_DEST_PORT, LINK_ICMP, 0); @@ -1403,6 +1419,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkIn(la, dst_addr, alias_addr, NO_DEST_PORT, ip_id, LINK_FRAGMENT_ID, 0); @@ -1422,6 +1439,8 @@ struct in_addr alias_addr, /* is not found. */ u_short ip_id) { + + LIBALIAS_LOCK_ASSERT(la); return FindLinkIn(la, dst_addr, alias_addr, NO_DEST_PORT, ip_id, LINK_FRAGMENT_ID, 0); @@ -1432,6 +1451,8 @@ AddFragmentPtrLink(struct libalias *la, struct in_addr dst_addr, u_short ip_id) { + + LIBALIAS_LOCK_ASSERT(la); return AddLink(la, la->nullAddress, dst_addr, la->nullAddress, NO_SRC_PORT, NO_DEST_PORT, ip_id, LINK_FRAGMENT_PTR); @@ -1442,6 +1463,8 @@ FindFragmentPtr(struct libalias *la, struct in_addr dst_addr, u_short ip_id) { + + LIBALIAS_LOCK_ASSERT(la); return FindLinkIn(la, dst_addr, la->nullAddress, NO_DEST_PORT, ip_id, LINK_FRAGMENT_PTR, 0); @@ -1455,6 +1478,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkIn(la, dst_addr, alias_addr, NO_DEST_PORT, 0, proto, 1); @@ -1478,6 +1502,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkOut(la, src_addr, dst_addr, NO_SRC_PORT, NO_DEST_PORT, proto, 1); @@ -1505,6 +1530,7 @@ int link_type; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); switch (proto) { case IPPROTO_UDP: link_type = LINK_UDP; @@ -1544,6 +1570,7 @@ int link_type; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); switch (proto) { case IPPROTO_UDP: link_type = LINK_UDP; @@ -1578,6 +1605,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = AddLink(la, src_addr, dst_addr, alias_addr, src_call_id, 0, GET_ALIAS_PORT, LINK_PPTP); @@ -1594,6 +1622,7 @@ u_int i; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); i = StartPointOut(src_addr, dst_addr, 0, 0, LINK_PPTP); LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) if (lnk->link_type == LINK_PPTP && @@ -1614,6 +1643,7 @@ u_int i; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); i = StartPointOut(src_addr, dst_addr, 0, 0, LINK_PPTP); LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) if (lnk->link_type == LINK_PPTP && @@ -1634,6 +1664,7 @@ u_int i; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); i = StartPointIn(alias_addr, 0, LINK_PPTP); LIST_FOREACH(lnk, &la->linkTableIn[i], list_in) if (lnk->link_type == LINK_PPTP && @@ -1653,6 +1684,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkIn(la, dst_addr, alias_addr, 0 /* any */ , alias_call_id, LINK_PPTP, 0); @@ -1672,6 +1704,7 @@ int link_type; struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); switch (proto) { case IPPROTO_UDP: link_type = LINK_UDP; @@ -1703,6 +1736,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkIn(la, la->nullAddress, alias_addr, 0, 0, LINK_ADDR, 0); if (lnk == NULL) { @@ -1735,6 +1769,7 @@ { struct alias_link *lnk; + LIBALIAS_LOCK_ASSERT(la); lnk = FindLinkOut(la, original_addr, la->nullAddress, 0, 0, LINK_ADDR, 0); if (lnk == NULL) { @@ -1891,6 +1926,8 @@ struct in_addr GetDefaultAliasAddress(struct libalias *la) { + + LIBALIAS_LOCK_ASSERT(la); return (la->aliasAddress); } @@ -1898,6 +1935,8 @@ void SetDefaultAliasAddress(struct libalias *la, struct in_addr alias_addr) { + + LIBALIAS_LOCK_ASSERT(la); la->aliasAddress = alias_addr; } @@ -2112,6 +2151,8 @@ void ClearCheckNewLink(struct libalias *la) { + + LIBALIAS_LOCK_ASSERT(la); la->newDefaultLink = 0; } @@ -2134,6 +2175,7 @@ { struct libalias *la = lnk->la; + LIBALIAS_LOCK_ASSERT(la); la->deleteAllLinks = 1; lnk = ReLink(lnk, lnk->src_addr, lnk->dst_addr, lnk->alias_addr, lnk->src_port, cid, lnk->alias_port, lnk->link_type); @@ -2166,6 +2208,7 @@ struct timezone tz; #endif + LIBALIAS_LOCK_ASSERT(la); /* * Save system time (seconds) in global variable timeStamp for use * by other functions. This is done so as not to unnecessarily @@ -2213,6 +2256,8 @@ static int InitPacketAliasLog(struct libalias *la) { + + LIBALIAS_LOCK_ASSERT(la); if (~la->packetAliasMode & PKT_ALIAS_LOG) { #ifdef _KERNEL if ((la->logDesc = malloc(LIBALIAS_BUF_SIZE))) @@ -2233,14 +2278,16 @@ static void UninitPacketAliasLog(struct libalias *la) { - if (la->logDesc) { + + LIBALIAS_LOCK_ASSERT(la); + if (la->logDesc) { #ifdef _KERNEL - free(la->logDesc); + free(la->logDesc); #else - fclose(la->logDesc); + fclose(la->logDesc); #endif - la->logDesc = NULL; - } + la->logDesc = NULL; + } la->packetAliasMode &= ~PKT_ALIAS_LOG; } @@ -2501,8 +2548,10 @@ LIST_INIT(&la->linkTableOut[i]); for (i = 0; i < LINK_TABLE_IN_SIZE; i++) LIST_INIT(&la->linkTableIn[i]); - + LIBALIAS_LOCK_INIT(la); + LIBALIAS_LOCK(la); } else { + LIBALIAS_LOCK(la); la->deleteAllLinks = 1; CleanupAliasData(la); la->deleteAllLinks = 0; @@ -2533,7 +2582,7 @@ #ifndef _KERNEL LibAliasRefreshModules(); #endif - LIBALIAS_LOCK_INIT(la); + LIBALIAS_UNLOCK(la); return (la); } @@ -2710,6 +2759,7 @@ InitPunchFW(struct libalias *la) { + LIBALIAS_LOCK_ASSERT(la); la->fireWallField = malloc(la->fireWallNumNums); if (la->fireWallField) { memset(la->fireWallField, 0, la->fireWallNumNums); @@ -2724,6 +2774,8 @@ static void UninitPunchFW(struct libalias *la) { + + LIBALIAS_LOCK_ASSERT(la); ClearAllFWHoles(la); if (la->fireWallFD >= 0) close(la->fireWallFD); @@ -2743,6 +2795,7 @@ struct ip_fw rule; /* On-the-fly built rule */ int fwhole; /* Where to punch hole */ + LIBALIAS_LOCK_ASSERT(la); la = lnk->la; /* Don't do anything unless we are asked to */ @@ -2817,6 +2870,7 @@ struct libalias *la; + LIBALIAS_LOCK_ASSERT(la); la = lnk->la; if (lnk->link_type == LINK_TCP) { int fwhole = lnk->data.tcp->fwhole; /* Where is the firewall @@ -2841,6 +2895,7 @@ struct ip_fw rule; /* On-the-fly built rule */ int i; + LIBALIAS_LOCK_ASSERT(la); if (la->fireWallFD < 0) return; ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#9 (text+ko) ==== @@ -161,12 +161,14 @@ #ifdef _KERNEL #define LIBALIAS_LOCK_INIT(l) \ - mtx_init(&l->mutex, "per-instance libalias mutex", NULL, MTX_DEF|MTX_RECURSE) + mtx_init(&l->mutex, "per-instance libalias mutex", NULL, MTX_DEF) +#define LIBALIAS_LOCK_ASSERT(l) mtx_assert(&l->mutex, MA_OWNED) #define LIBALIAS_LOCK(l) mtx_lock(&l->mutex) #define LIBALIAS_UNLOCK(l) mtx_unlock(&l->mutex) -#define LIBALIAS_LOCK_DESTROY(l) mtx_destroy(&l->mutex); +#define LIBALIAS_LOCK_DESTROY(l) mtx_destroy(&l->mutex) #else #define LIBALIAS_LOCK_INIT(l) +#define LIBALIAS_LOCK_ASSERT(l) #define LIBALIAS_LOCK(l) #define LIBALIAS_UNLOCK(l) #define LIBALIAS_LOCK_DESTROY(l) ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_proxy.c#10 (text+ko) ==== @@ -312,6 +312,8 @@ struct proxy_entry *ptr; struct proxy_entry *ptr_last; + LIBALIAS_LOCK_ASSERT(la); + if (la->proxyList == NULL) { la->proxyList = entry; entry->last = NULL; @@ -352,6 +354,7 @@ { struct libalias *la; + LIBALIAS_LOCK_ASSERT(la); la = entry->la; if (entry->last != NULL) entry->last->next = entry->next; @@ -370,6 +373,7 @@ int err; struct proxy_entry *ptr; + LIBALIAS_LOCK_ASSERT(la); err = -1; ptr = la->proxyList; while (ptr != NULL) { @@ -566,6 +570,7 @@ struct in_addr dst_addr; struct proxy_entry *ptr; + LIBALIAS_LOCK_ASSERT(la); src_addr = pip->ip_src; dst_addr = pip->ip_dst; dst_port = ((struct tcphdr *)ip_next(pip)) @@ -606,6 +611,7 @@ int proxy_type) { + LIBALIAS_LOCK_ASSERT(la); (void)la; switch (proxy_type) {