From owner-svn-src-projects@FreeBSD.ORG Mon May 18 17:10:27 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 77B5A106566C; Mon, 18 May 2009 17:10:27 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 63BA58FC1F; Mon, 18 May 2009 17:10:27 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n4IHARvU068305; Mon, 18 May 2009 17:10:27 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n4IHAR63068296; Mon, 18 May 2009 17:10:27 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200905181710.n4IHAR63068296@svn.freebsd.org> From: Robert Watson Date: Mon, 18 May 2009 17:10:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r192310 - in projects/pnet/sys: net netatalk netinet netinet6 netipx netnatm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 May 2009 17:10:28 -0000 Author: rwatson Date: Mon May 18 17:10:26 2009 New Revision: 192310 URL: http://svn.freebsd.org/changeset/base/192310 Log: Update netisr2 consumers for new netisr2 interfaces -- queue limits, stats, and struct netisr_handler registration. Modified: projects/pnet/sys/net/rtsock.c projects/pnet/sys/netatalk/ddp_usrreq.c projects/pnet/sys/netinet/if_ether.c projects/pnet/sys/netinet/igmp.c projects/pnet/sys/netinet/ip_divert.c projects/pnet/sys/netinet/ip_input.c projects/pnet/sys/netinet6/ip6_input.c projects/pnet/sys/netipx/ipx_input.c projects/pnet/sys/netnatm/natm_proto.c Modified: projects/pnet/sys/net/rtsock.c ============================================================================== --- projects/pnet/sys/net/rtsock.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/net/rtsock.c Mon May 18 17:10:26 2009 (r192310) @@ -92,11 +92,13 @@ MTX_SYSINIT(rtsock, &rtsock_mtx, "rtsock #define RTSOCK_UNLOCK() mtx_unlock(&rtsock_mtx) #define RTSOCK_LOCK_ASSERT() mtx_assert(&rtsock_mtx, MA_OWNED) -static struct ifqueue rtsintrq; - SYSCTL_NODE(_net, OID_AUTO, route, CTLFLAG_RD, 0, ""); + +#ifndef NETISR2 +static struct ifqueue rtsintrq; SYSCTL_INT(_net_route, OID_AUTO, netisr_maxqlen, CTLFLAG_RW, &rtsintrq.ifq_maxlen, 0, "maximum routing socket dispatch queue length"); +#endif struct walkarg { int w_tmemsize; @@ -121,19 +123,47 @@ static void rt_getmetrics(const struct r struct rt_metrics *out); static void rt_dispatch(struct mbuf *, const struct sockaddr *); +#ifdef NETISR2 +static struct netisr_handler rtsock_nh = { + .nh_name = "rtsock", + .nh_handler = rts_input, + .nh_proto = NETISR_ROUTE, + .nh_qlimit = 256, + .nh_policy = NETISR_POLICY_SOURCE, +}; + +static int +sysctl_route_netisr_maxqlen(SYSCTL_HANDLER_ARGS) +{ + int error, qlimit; + + netisr2_getqlimit(&rtsock_nh, &qlimit); + error = sysctl_handle_int(oidp, &qlimit, 0, req); + if (error || !req->newptr) + return (error); + if (qlimit < 1) + return (EINVAL); + return (netisr2_setqlimit(&rtsock_nh, qlimit)); +} +SYSCTL_PROC(_net_route, OID_AUTO, netisr_maxqlen, CTLTYPE_INT|CTLFLAG_RW, + 0, 0, sysctl_route_netisr_maxqlen, "I", + "maximum routing socket dispatch queue length"); +#endif + static void rts_init(void) { int tmp; +#ifdef NETISR2 + if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp)) + rtsock_nh.nh_qlimit = tmp; + netisr2_register(&rtsock_nh); +#else + mtx_init(&rtsintrq.ifq_mtx, "rts_inq", NULL, MTX_DEF); rtsintrq.ifq_maxlen = 256; if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp)) rtsintrq.ifq_maxlen = tmp; - mtx_init(&rtsintrq.ifq_mtx, "rts_inq", NULL, MTX_DEF); -#ifdef NETISR2 - netisr2_register(NETISR_ROUTE, "route", rts_input, NULL, NULL, - rtsintrq.ifq_maxlen); -#else netisr_register(NETISR_ROUTE, rts_input, &rtsintrq, 0); #endif } @@ -1231,11 +1261,7 @@ rt_dispatch(struct mbuf *m, const struct *(unsigned short *)(tag + 1) = sa->sa_family; m_tag_prepend(m, tag); } -#ifdef NETISR2 - netisr2_queue(NETISR_ROUTE, 0, m); /* mbuf is free'd on failure. */ -#else netisr_queue(NETISR_ROUTE, m); /* mbuf is free'd on failure. */ -#endif } /* Modified: projects/pnet/sys/netatalk/ddp_usrreq.c ============================================================================== --- projects/pnet/sys/netatalk/ddp_usrreq.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netatalk/ddp_usrreq.c Mon May 18 17:10:26 2009 (r192310) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004-2005 Robert N. M. Watson + * Copyright (c) 2004-2009 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -73,7 +73,34 @@ static u_long ddp_sendspace = DDP_MAXSZ; /* Max ddp size + 1 (ddp_type) */ static u_long ddp_recvspace = 10 * (587 + sizeof(struct sockaddr_at)); +#ifdef NETISR2 +static const struct netisr_handler atalk1_nh = { + .nh_name = "atalk1", + .nh_handler = at1intr, + .nh_proto = NETISR_ATALK1, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_SOURCE, +}; + +static const struct netisr_handler atalk2_nh = { + .nh_name = "atalk2", + .nh_handler = at2intr, + .nh_proto = NETISR_ATALK2, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_SOURCE, +}; + +static const struct netisr_handler aarp_nh = { + .nh_name = "aarp", + .nh_handler = aarpintr, + .nh_proto = NETISR_AARP, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_SOURCE, +}; +#else static struct ifqueue atintrq1, atintrq2, aarpintrq; +#endif + static int ddp_attach(struct socket *so, int proto, struct thread *td) @@ -259,21 +286,18 @@ void ddp_init(void) { + DDP_LIST_LOCK_INIT(); +#ifdef NETISR2 + netisr2_register(&atalk1_nh); + netisr2_register(&atalk2_nh); + netisr2_register(&aarp_nh); +#else atintrq1.ifq_maxlen = IFQ_MAXLEN; atintrq2.ifq_maxlen = IFQ_MAXLEN; aarpintrq.ifq_maxlen = IFQ_MAXLEN; mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF); mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF); mtx_init(&aarpintrq.ifq_mtx, "aarp_inq", NULL, MTX_DEF); - DDP_LIST_LOCK_INIT(); -#ifdef NETISR2 - netisr2_register(NETISR_ATALK1, "atalk1", at1intr, NULL, NULL, - IFQ_MAXLEN); - netisr2_register(NETISR_ATALK2, "atalk2", at2intr, NULL, NULL, - IFQ_MAXLEN); - netisr2_register(NETISR_AARP, "aarp", aarpintr, NULL, NULL, - IFQ_MAXLEN); -#else netisr_register(NETISR_ATALK1, at1intr, &atintrq1, 0); netisr_register(NETISR_ATALK2, at2intr, &atintrq2, 0); netisr_register(NETISR_AARP, aarpintr, &aarpintrq, 0); Modified: projects/pnet/sys/netinet/if_ether.c ============================================================================== --- projects/pnet/sys/netinet/if_ether.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netinet/if_ether.c Mon May 18 17:10:26 2009 (r192310) @@ -98,8 +98,6 @@ static int arp_proxyall; SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, max_age, CTLFLAG_RW, arpt_keep, 0, "ARP entry lifetime in seconds"); -static struct ifqueue arpintrq; - SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, maxtries, CTLFLAG_RW, arp_maxtries, 0, "ARP resolution attempts before returning error"); @@ -120,6 +118,18 @@ static void arptimer(void *); static void in_arpinput(struct mbuf *); #endif +#ifdef NETISR2 +static const struct netisr_handler arp_nh = { + .nh_name = "arp", + .nh_handler = arpintr, + .nh_proto = NETISR_ARP, + .nh_qlimit = 50, + .nh_policy = NETISR_POLICY_SOURCE, +}; +#else +static struct ifqueue arpintrq; +#endif + #ifndef VIMAGE_GLOBALS static const vnet_modinfo_t vnet_arp_modinfo = { .vmi_id = VNET_MOD_ARP, @@ -823,11 +833,11 @@ arp_init(void) arp_iattach(NULL); #endif - arpintrq.ifq_maxlen = 50; - mtx_init(&arpintrq.ifq_mtx, "arp_inq", NULL, MTX_DEF); #ifdef NETISR2 - netisr2_register(NETISR_ARP, "arp", arpintr, NULL, NULL, 50); + netisr2_register(&arp_nh); #else + arpintrq.ifq_maxlen = 50; + mtx_init(&arpintrq.ifq_mtx, "arp_inq", NULL, MTX_DEF); netisr_register(NETISR_ARP, arpintr, &arpintrq, 0); #endif } Modified: projects/pnet/sys/netinet/igmp.c ============================================================================== --- projects/pnet/sys/netinet/igmp.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netinet/igmp.c Mon May 18 17:10:26 2009 (r192310) @@ -151,6 +151,21 @@ static int vnet_igmp_iattach(const void static int vnet_igmp_idetach(const void *); #endif /* VIMAGE */ +#ifdef NETISR2 +static const struct netisr_handler igmp_nh = { + .nh_name = "igmp", + .nh_handler = igmp_intr, + .nh_proto = NETISR_IGMP, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_SOURCE, +}; +#else +/* + * Global netisr output queue. + */ +struct ifqueue igmpoq; +#endif + /* * System-wide globals. * @@ -197,11 +212,6 @@ struct mbuf *m_raopt; /* Router Alert MALLOC_DEFINE(M_IGMP, "igmp", "igmp state"); /* - * Global netisr output queue. - */ -struct ifqueue igmpoq; - -/* * VIMAGE-wide globals. * * The IGMPv3 timers themselves need to run per-image, however, @@ -3545,15 +3555,13 @@ igmp_sysinit(void) IGMP_LOCK_INIT(); - mtx_init(&igmpoq.ifq_mtx, "igmpoq_mtx", NULL, MTX_DEF); - IFQ_SET_MAXLEN(&igmpoq, IFQ_MAXLEN); - m_raopt = igmp_ra_alloc(); #ifdef NETISR2 - netisr2_register(NETISR_IGMP, "igmp", igmp_intr, NULL, NULL, - IFQ_MAXLEN); + netisr2_register(&igmp_nh); #else + mtx_init(&igmpoq.ifq_mtx, "igmpoq_mtx", NULL, MTX_DEF); + IFQ_SET_MAXLEN(&igmpoq, IFQ_MAXLEN); netisr_register(NETISR_IGMP, igmp_intr, &igmpoq, 0); #endif } @@ -3565,11 +3573,11 @@ igmp_sysuninit(void) CTR1(KTR_IGMPV3, "%s: tearing down", __func__); #ifdef NETISR2 - netisr2_unregister(NETISR_IGMP); + netisr2_unregister(&igmp_nh); #else netisr_unregister(NETISR_IGMP); -#endif mtx_destroy(&igmpoq.ifq_mtx); +#endif m_free(m_raopt); m_raopt = NULL; Modified: projects/pnet/sys/netinet/ip_divert.c ============================================================================== --- projects/pnet/sys/netinet/ip_divert.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netinet/ip_divert.c Mon May 18 17:10:26 2009 (r192310) @@ -471,7 +471,7 @@ div_output(struct socket *so, struct mbu #endif /* Send packet to input processing via netisr */ #ifdef NETISR2 - netisr2_queue(NETISR_IP, (uintptr_t)so, m); + netisr2_queue_src(NETISR_IP, (uintptr_t)so, m); #else netisr_queue(NETISR_IP, m); #endif Modified: projects/pnet/sys/netinet/ip_input.c ============================================================================== --- projects/pnet/sys/netinet/ip_input.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netinet/ip_input.c Mon May 18 17:10:26 2009 (r192310) @@ -166,18 +166,29 @@ SYSCTL_V_INT(V_NET, vnet_inet, _net_inet struct pfil_head inet_pfil_hook; /* Packet filter hooks */ +#ifdef NETISR2 +static struct netisr_handler ip_nh = { + .nh_name = "ip", + .nh_handler = ip_input, + .nh_proto = NETISR_IP, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_FLOW, +}; +#else static struct ifqueue ipintrq; static int ipqmaxlen = IFQ_MAXLEN; -extern struct domain inetdomain; -extern struct protosw inetsw[]; -u_char ip_protox[IPPROTO_MAX]; - SYSCTL_INT(_net_inet_ip, IPCTL_INTRQMAXLEN, intr_queue_maxlen, CTLFLAG_RW, &ipintrq.ifq_maxlen, 0, "Maximum size of the IP input queue"); SYSCTL_INT(_net_inet_ip, IPCTL_INTRQDROPS, intr_queue_drops, CTLFLAG_RD, &ipintrq.ifq_drops, 0, "Number of packets dropped from the IP input queue"); +#endif + +extern struct domain inetdomain; +extern struct protosw inetsw[]; +u_char ip_protox[IPPROTO_MAX]; + SYSCTL_V_STRUCT(V_NET, vnet_inet, _net_inet_ip, IPCTL_STATS, stats, CTLFLAG_RW, ipstat, ipstat, "IP statistics (struct ipstat, netinet/ip_var.h)"); @@ -250,6 +261,46 @@ static void vnet_inet_register() SYSINIT(inet, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, vnet_inet_register, 0); #endif +#ifdef NETISR2 +static int +sysctl_netinet_intr_queue_maxlen(SYSCTL_HANDLER_ARGS) +{ + int error, qlimit; + + netisr2_getqlimit(&ip_nh, &qlimit); + error = sysctl_handle_int(oidp, &qlimit, 0, req); + if (error || !req->newptr) + return (error); + if (qlimit < 1) + return (EINVAL); + return (netisr2_setqlimit(&ip_nh, qlimit)); +} +SYSCTL_PROC(_net_inet_ip, IPCTL_INTRQMAXLEN, intr_queue_maxlen, + CTLTYPE_INT|CTLFLAG_RW, 0, 0, sysctl_netinet_intr_queue_maxlen, "I", + "Maximum size of the IP input queue"); + +static int +sysctl_netinet_intr_queue_drops(SYSCTL_HANDLER_ARGS) +{ + u_int64_t qdrops_long; + int error, qdrops; + + netisr2_getqdrops(&ip_nh, &qdrops_long); + qdrops = qdrops_long; + error = sysctl_handle_int(oidp, &qdrops, 0, req); + if (error || !req->newptr) + return (error); + if (qdrops != 0) + return (EINVAL); + netisr2_clearqdrops(&ip_nh); + return (0); + +} +SYSCTL_PROC(_net_inet_ip, IPCTL_INTRQDROPS, intr_queue_drops, + CTLTYPE_INT|CTLFLAG_RD, 0, 0, sysctl_netinet_intr_queue_drops, "I", + "Number of packets dropped from the IP input queue"); +#endif + /* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. @@ -348,14 +399,13 @@ ip_init(void) /* Initialize various other remaining things. */ IPQ_LOCK_INIT(); - ipintrq.ifq_maxlen = ipqmaxlen; - mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF); #ifdef NETISR2 - netisr2_register(NETISR_IP, "ipv4", ip_input, NULL, NULL, ipqmaxlen); + netisr2_register(&ip_nh); #else + ipintrq.ifq_maxlen = ipqmaxlen; + mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF); netisr_register(NETISR_IP, ip_input, &ipintrq, 0); #endif - ip_ft = flowtable_alloc(ip_output_flowtable_size, FL_PCPU); } Modified: projects/pnet/sys/netinet6/ip6_input.c ============================================================================== --- projects/pnet/sys/netinet6/ip6_input.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netinet6/ip6_input.c Mon May 18 17:10:26 2009 (r192310) @@ -122,7 +122,18 @@ __FBSDID("$FreeBSD$"); extern struct domain inet6domain; u_char ip6_protox[IPPROTO_MAX]; + +#ifdef NETISR2 +static struct netisr_handler ip6_nh = { + .nh_name = "ip6", + .nh_handler = ip6_input, + .nh_proto = NETISR_IPV6, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_FLOW, +}; +#else static struct ifqueue ip6intrq; +#endif #ifndef VIMAGE #ifndef VIMAGE_GLOBALS @@ -297,12 +308,12 @@ ip6_init(void) printf("%s: WARNING: unable to register pfil hook, " "error %d\n", __func__, i); - ip6intrq.ifq_maxlen = V_ip6qmaxlen; /* XXX */ - mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF); #ifdef NETISR2 - netisr2_register(NETISR_IPV6, "ipv4", ip6_input, NULL, NULL, - V_ip6qmaxlen); + ip6_nh.nh_qlimit = V_ip6qmaxlen; + netisr2_register(&ip6_nh); #else + ip6intrq.ifq_maxlen = V_ip6qmaxlen; /* XXX */ + mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF); netisr_register(NETISR_IPV6, ip6_input, &ip6intrq, 0); #endif } Modified: projects/pnet/sys/netipx/ipx_input.c ============================================================================== --- projects/pnet/sys/netipx/ipx_input.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netipx/ipx_input.c Mon May 18 17:10:26 2009 (r192310) @@ -122,8 +122,18 @@ struct mtx ipxpcb_list_mtx; struct ipxpcbhead ipxpcb_list; struct ipxpcbhead ipxrawpcb_list; +#ifdef NETISR2 +static const struct netisr_handler ipx_nh = { + .nh_name = "ipx", + .nh_handler = ipxintr, + .nh_proto = NETISR_IPX, + .nh_qlimit = IFQ_MAXLEN, + .nh_policy = NETISR_POLICY_SOURCE, +}; +#else static int ipxqmaxlen = IFQ_MAXLEN; static struct ifqueue ipxintrq; +#endif long ipx_pexseq; /* Locked with ipxpcb_list_mtx. */ @@ -154,11 +164,12 @@ ipx_init(void) ipx_hostmask.sipx_addr.x_net = ipx_broadnet; ipx_hostmask.sipx_addr.x_host = ipx_broadhost; - ipxintrq.ifq_maxlen = ipxqmaxlen; - mtx_init(&ipxintrq.ifq_mtx, "ipx_inq", NULL, MTX_DEF); #ifdef NETISR2 - netisr2_register(NETISR_IPX, "ipx", ipxintr, NULL, NULL, ipxqmaxlen); + ipx_nh.nh_qlimit = ipxqmaxlen; + netisr2_register(&ipx_nh); #else + ipxintrq.ifq_maxlen = ipxqmaxlen; + mtx_init(&ipxintrq.ifq_mtx, "ipx_inq", NULL, MTX_DEF); netisr_register(NETISR_IPX, ipxintr, &ipxintrq, 0); #endif } Modified: projects/pnet/sys/netnatm/natm_proto.c ============================================================================== --- projects/pnet/sys/netnatm/natm_proto.c Mon May 18 17:08:57 2009 (r192309) +++ projects/pnet/sys/netnatm/natm_proto.c Mon May 18 17:10:26 2009 (r192310) @@ -91,8 +91,19 @@ static struct domain natmdomain = { .dom_protoswNPROTOSW = &natmsw[sizeof(natmsw)/sizeof(natmsw[0])], }; +#ifdef NETISR2 +static struct netisr_handler natm_nh = { + .nh_name = "natm", + .nh_handler = natmintr, + .nh_proto = NETISR_NATM, + .nh_qlimit = 1000 /* IFQ_MAXLEN */, + .nh_policy = NETISR_POLICY_SOURCE, +}; +#else static int natmqmaxlen = 1000 /* IFQ_MAXLEN */; /* max # of packets on queue */ static struct ifqueue natmintrq; +#endif + #ifdef NATM_STAT u_int natm_sodropcnt; /* # mbufs dropped due to full sb */ u_int natm_sodropbytes; /* # of bytes dropped */ @@ -104,14 +115,13 @@ static void natm_init(void) { LIST_INIT(&natm_pcbs); - bzero(&natmintrq, sizeof(natmintrq)); - natmintrq.ifq_maxlen = natmqmaxlen; NATM_LOCK_INIT(); - mtx_init(&natmintrq.ifq_mtx, "natm_inq", NULL, MTX_DEF); #ifdef NETISR2 - netisr2_register(NETISR_NATM, "natm", natmintr, NULL, NULL, - natmqmaxlen); + netisr2_register(&natm_nh); #else + bzero(&natmintrq, sizeof(natmintrq)); + natmintrq.ifq_maxlen = natmqmaxlen; + mtx_init(&natmintrq.ifq_mtx, "natm_inq", NULL, MTX_DEF); netisr_register(NETISR_NATM, natmintr, &natmintrq, 0); #endif }