From owner-p4-projects@FreeBSD.ORG Mon Jun 22 11:28:40 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 53C9F1065672; Mon, 22 Jun 2009 11:28:39 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 13568106566C for ; Mon, 22 Jun 2009 11:28:39 +0000 (UTC) (envelope-from zec@fer.hr) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 009B78FC0C for ; Mon, 22 Jun 2009 11:28:39 +0000 (UTC) (envelope-from zec@fer.hr) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5MBSciG088238 for ; Mon, 22 Jun 2009 11:28:38 GMT (envelope-from zec@fer.hr) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5MBScIZ088236 for perforce@freebsd.org; Mon, 22 Jun 2009 11:28:38 GMT (envelope-from zec@fer.hr) Date: Mon, 22 Jun 2009 11:28:38 GMT Message-Id: <200906221128.n5MBScIZ088236@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@fer.hr using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 164847 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: Mon, 22 Jun 2009 11:28:40 -0000 http://perforce.freebsd.org/chv.cgi?CH=164847 Change 164847 by zec@zec_amdx4 on 2009/06/22 11:27:51 V_irtualize flowtable sysctl knobs and counters. Affected files ... .. //depot/projects/vimage-commit2/src/sys/net/flowtable.c#6 edit .. //depot/projects/vimage-commit2/src/sys/net/vnet.h#25 edit Differences ... ==== //depot/projects/vimage-commit2/src/sys/net/flowtable.c#6 (text+ko) ==== @@ -205,48 +205,55 @@ * - support explicit connection state (currently only ad-hoc for DSR) * - V_ flowtable sysctls and nmbflows */ +#ifdef VIMAGE_GLOBALS +int flowtable_enable; +static int flowtable_hits; +static int flowtable_lookups; +static int flowtable_misses; +static int flowtable_frees; +static int flowtable_free_checks; +static int flowtable_max_depth; +static int flowtable_collisions; +static int flowtable_syn_expire; +static int flowtable_udp_expire; +static int flowtable_fin_wait_expire; +static int flowtable_tcp_expire; +static int flowtable_nmbflows; +#endif SYSCTL_NODE(_net_inet, OID_AUTO, flowtable, CTLFLAG_RD, NULL, "flowtable"); -int flowtable_enable = 1; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, enable, CTLFLAG_RW, - &flowtable_enable, 0, "enable flowtable caching."); -static int flowtable_hits = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, hits, CTLFLAG_RD, - &flowtable_hits, 0, "# flowtable hits."); -static int flowtable_lookups = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, lookups, CTLFLAG_RD, - &flowtable_lookups, 0, "# flowtable lookups."); -static int flowtable_misses = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, misses, CTLFLAG_RD, - &flowtable_misses, 0, "#flowtable misses."); -static int flowtable_frees = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, frees, CTLFLAG_RD, - &flowtable_frees, 0, "#flows freed."); -static int flowtable_free_checks = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, free_checks, CTLFLAG_RD, - &flowtable_free_checks, 0, "#flows free checks."); -static int flowtable_max_depth = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, max_depth, CTLFLAG_RD, - &flowtable_max_depth, 0, "max collision list length."); -static int flowtable_collisions = 0; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, collisions, CTLFLAG_RD, - &flowtable_collisions, 0, "#flowtable collisions."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, enable, CTLFLAG_RW, + flowtable_enable, 0, "enable flowtable caching."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, hits, CTLFLAG_RD, + flowtable_hits, 0, "# flowtable hits."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, lookups, + CTLFLAG_RD, flowtable_lookups, 0, "# flowtable lookups."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, misses, CTLFLAG_RD, + flowtable_misses, 0, "#flowtable misses."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, frees, CTLFLAG_RD, + flowtable_frees, 0, "#flows freed."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, free_checks, + CTLFLAG_RD, flowtable_free_checks, 0, "#flows free checks."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, max_depth, + CTLFLAG_RD, flowtable_max_depth, 0, "max collision list length."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, collisions, + CTLFLAG_RD, flowtable_collisions, 0, "#flowtable collisions."); /* * XXX This does not end up updating timeouts at runtime * and only reflects the value for the last table added :-/ */ -static int flowtable_syn_expire = SYN_IDLE; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, syn_expire, CTLFLAG_RW, - &flowtable_syn_expire, 0, "seconds after which to remove syn allocated flow."); -static int flowtable_udp_expire = UDP_IDLE; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, udp_expire, CTLFLAG_RW, - &flowtable_udp_expire, 0, "seconds after which to remove flow allocated to UDP."); -static int flowtable_fin_wait_expire = FIN_WAIT_IDLE; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, fin_wait_expire, CTLFLAG_RW, - &flowtable_fin_wait_expire, 0, "seconds after which to remove a flow in FIN_WAIT."); -static int flowtable_tcp_expire = TCP_IDLE; -SYSCTL_INT(_net_inet_flowtable, OID_AUTO, tcp_expire, CTLFLAG_RW, - &flowtable_tcp_expire, 0, "seconds after which to remove flow allocated to a TCP connection."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, syn_expire, + CTLFLAG_RW, flowtable_syn_expire, 0, + "seconds after which to remove syn allocated flow."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, udp_expire, + CTLFLAG_RW, flowtable_udp_expire, 0, + "seconds after which to remove flow allocated to UDP."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, fin_wait_expire, + CTLFLAG_RW, flowtable_fin_wait_expire, 0, + "seconds after which to remove a flow in FIN_WAIT."); +SYSCTL_V_INT(V_NET, vnet_net, _net_inet_flowtable, OID_AUTO, tcp_expire, + CTLFLAG_RW, flowtable_tcp_expire, 0, + "seconds after which to remove flow allocated to a TCP connection."); /* @@ -256,28 +263,28 @@ * there is no reason why this could not be changed at runtime) * and thus (currently) needs to be set with a tunable. */ -static int nmbflows = 4096; - static int sysctl_nmbflows(SYSCTL_HANDLER_ARGS) { INIT_VNET_NET(curvnet); int error, newnmbflows; - newnmbflows = nmbflows; + newnmbflows = V_flowtable_nmbflows; error = sysctl_handle_int(oidp, &newnmbflows, 0, req); if (error == 0 && req->newptr) { - if (newnmbflows > nmbflows) { - nmbflows = newnmbflows; - uma_zone_set_max(V_flow_ipv4_zone, nmbflows); - uma_zone_set_max(V_flow_ipv6_zone, nmbflows); + if (newnmbflows > V_flowtable_nmbflows) { + V_flowtable_nmbflows = newnmbflows; + uma_zone_set_max(V_flow_ipv4_zone, + V_flowtable_nmbflows); + uma_zone_set_max(V_flow_ipv6_zone, + V_flowtable_nmbflows); } else error = EINVAL; } return (error); } SYSCTL_PROC(_net_inet_flowtable, OID_AUTO, nmbflows, CTLTYPE_INT|CTLFLAG_RW, - &nmbflows, 0, sysctl_nmbflows, "IU", "Maximum number of flows allowed"); + 0, 0, sysctl_nmbflows, "IU", "Maximum number of flows allowed"); #ifndef RADIX_MPATH static void @@ -341,7 +348,7 @@ struct udphdr *uh; struct sctphdr *sh; - if (flowtable_enable == 0) + if (V_flowtable_enable == 0) return (0); key[1] = key[0] = 0; @@ -522,7 +529,7 @@ } depth = 0; - flowtable_collisions++; + V_flowtable_collisions++; /* * find end of list and make sure that we were not * preempted by another thread handling this flow @@ -548,8 +555,8 @@ fle = fle->f_next; } - if (depth > flowtable_max_depth) - flowtable_max_depth = depth; + if (depth > V_flowtable_max_depth) + V_flowtable_max_depth = depth; fletail->f_next = newfle; fle = newfle; skip: @@ -588,6 +595,7 @@ int flowtable_lookup(struct flowtable *ft, struct mbuf *m, struct route *ro) { + INIT_VNET_NET(curvnet); uint32_t key[9], hash; struct flentry *fle; uint16_t flags; @@ -622,7 +630,7 @@ if (hash == 0 || (key[0] == 0 && (ft->ft_flags & FL_HASH_PORTS))) return (ENOENT); - flowtable_lookups++; + V_flowtable_lookups++; FL_ENTRY_LOCK(ft, hash); if ((fle = FL_ENTRY(ft, hash)) == NULL) { FL_ENTRY_UNLOCK(ft, hash); @@ -637,7 +645,7 @@ && (proto == fle->f_proto) && (rt->rt_flags & RTF_UP) && (rt->rt_ifp != NULL)) { - flowtable_hits++; + V_flowtable_hits++; fle->f_uptime = time_uptime; fle->f_flags |= flags; ro->ro_rt = rt; @@ -651,7 +659,7 @@ FL_ENTRY_UNLOCK(ft, hash); uncached: - flowtable_misses++; + V_flowtable_misses++; /* * This bit of code ends up locking the * same route 3 times (just like ip_output + ether_output) @@ -762,10 +770,10 @@ * replacement after 5s of non-use */ if (flags & FL_HASH_PORTS) { - ft->ft_udp_idle = flowtable_udp_expire; - ft->ft_syn_idle = flowtable_syn_expire; - ft->ft_fin_wait_idle = flowtable_fin_wait_expire; - ft->ft_tcp_idle = flowtable_fin_wait_expire; + ft->ft_udp_idle = V_flowtable_udp_expire; + ft->ft_syn_idle = V_flowtable_syn_expire; + ft->ft_fin_wait_idle = V_flowtable_fin_wait_expire; + ft->ft_tcp_idle = V_flowtable_fin_wait_expire; } else { ft->ft_udp_idle = ft->ft_fin_wait_idle = ft->ft_syn_idle = ft->ft_tcp_idle = 30; @@ -803,12 +811,26 @@ { INIT_VNET_NET(curvnet); - V_flow_ipv4_zone = uma_zcreate("ip4flow", sizeof(struct flentry_v4), NULL, - NULL, NULL, NULL, 64, UMA_ZONE_MAXBUCKET); - V_flow_ipv6_zone = uma_zcreate("ip6flow", sizeof(struct flentry_v6), NULL, - NULL, NULL, NULL, 64, UMA_ZONE_MAXBUCKET); - uma_zone_set_max(V_flow_ipv4_zone, nmbflows); - uma_zone_set_max(V_flow_ipv6_zone, nmbflows); + V_flowtable_enable = 1; + V_flowtable_hits = 0; + V_flowtable_lookups = 0; + V_flowtable_misses = 0; + V_flowtable_frees = 0; + V_flowtable_free_checks = 0; + V_flowtable_max_depth = 0; + V_flowtable_collisions = 0; + V_flowtable_syn_expire = SYN_IDLE; + V_flowtable_udp_expire = UDP_IDLE; + V_flowtable_fin_wait_expire = FIN_WAIT_IDLE; + V_flowtable_tcp_expire = TCP_IDLE; + V_flowtable_nmbflows = 4096; + + V_flow_ipv4_zone = uma_zcreate("ip4flow", sizeof(struct flentry_v4), + NULL, NULL, NULL, NULL, 64, UMA_ZONE_MAXBUCKET); + V_flow_ipv6_zone = uma_zcreate("ip6flow", sizeof(struct flentry_v6), + NULL, NULL, NULL, NULL, 64, UMA_ZONE_MAXBUCKET); + uma_zone_set_max(V_flow_ipv4_zone, V_flowtable_nmbflows); + uma_zone_set_max(V_flow_ipv6_zone, V_flowtable_nmbflows); return (0); } @@ -849,6 +871,7 @@ static void flowtable_free_stale(struct flowtable *ft) { + INIT_VNET_NET(curvnet); int curbit = 0, count; struct flentry *fle, **flehead, *fleprev; struct flentry *flefreehead, *flefreetail, *fletmp; @@ -875,7 +898,7 @@ flehead = flowtable_entry(ft, curbit); fle = fleprev = *flehead; - flowtable_free_checks++; + V_flowtable_free_checks++; #ifdef DIAGNOSTIC if (fle == NULL && curbit > 0) { log(LOG_ALERT, @@ -926,7 +949,7 @@ while ((fle = flefreehead) != NULL) { flefreehead = fle->f_next; count++; - flowtable_frees++; + V_flowtable_frees++; fle_free(fle); } if (bootverbose && count) ==== //depot/projects/vimage-commit2/src/sys/net/vnet.h#25 (text+ko) ==== @@ -53,17 +53,31 @@ struct if_clone * _lo_cloner; struct ifc_simple_data *_lo_cloner_data; - struct flowtable * _flow_list_head; - uint32_t _flow_hashjitter; - uma_zone_t _flow_ipv4_zone; - uma_zone_t _flow_ipv6_zone; - LIST_HEAD(, rawcb) _rawcb_list; LIST_HEAD(, if_clone) _if_cloners; int _if_cloners_count; int _ether_ipfw; + + struct flowtable * _flow_list_head; + uint32_t _flow_hashjitter; + uma_zone_t _flow_ipv4_zone; + uma_zone_t _flow_ipv6_zone; + + int _flowtable_enable; + int _flowtable_hits; + int _flowtable_lookups; + int _flowtable_misses; + int _flowtable_frees; + int _flowtable_free_checks; + int _flowtable_max_depth; + int _flowtable_collisions; + int _flowtable_syn_expire; + int _flowtable_udp_expire; + int _flowtable_fin_wait_expire; + int _flowtable_tcp_expire; + int _flowtable_nmbflows; }; /* Size guard. See sys/vimage.h. */ @@ -88,6 +102,19 @@ #define V_flow_ipv4_zone VNET_NET(flow_ipv4_zone) #define V_flow_ipv6_zone VNET_NET(flow_ipv6_zone) #define V_flow_list_head VNET_NET(flow_list_head) +#define V_flowtable_collisions VNET_NET(flowtable_collisions) +#define V_flowtable_enable VNET_NET(flowtable_enable) +#define V_flowtable_fin_wait_expire VNET_NET(flowtable_fin_wait_expire) +#define V_flowtable_free_checks VNET_NET(flowtable_free_checks) +#define V_flowtable_frees VNET_NET(flowtable_frees) +#define V_flowtable_hits VNET_NET(flowtable_hits) +#define V_flowtable_lookups VNET_NET(flowtable_lookups) +#define V_flowtable_max_depth VNET_NET(flowtable_max_depth) +#define V_flowtable_misses VNET_NET(flowtable_misses) +#define V_flowtable_nmbflows VNET_NET(flowtable_nmbflows) +#define V_flowtable_syn_expire VNET_NET(flowtable_syn_expire) +#define V_flowtable_tcp_expire VNET_NET(flowtable_tcp_expire) +#define V_flowtable_udp_expire VNET_NET(flowtable_udp_expire) #define V_if_index VNET_NET(if_index) #define V_if_indexlim VNET_NET(if_indexlim) #define V_if_cloners VNET_NET(if_cloners)