Module Name: src Committed By: thorpej Date: Sat Sep 3 01:48:22 UTC 2022
Modified Files: src/sys/net: if_ethersubr.c if_gre.c if_loop.c netisr_dispatch.h src/sys/netatalk: at_extern.h at_proto.c at_var.h ddp_input.c ddp_usrreq.c Log Message: Convert NETATALK from a legacy netisr to pktqueue. To generate a diff of this commit: cvs rdiff -u -r1.317 -r1.318 src/sys/net/if_ethersubr.c cvs rdiff -u -r1.181 -r1.182 src/sys/net/if_gre.c cvs rdiff -u -r1.114 -r1.115 src/sys/net/if_loop.c cvs rdiff -u -r1.21 -r1.22 src/sys/net/netisr_dispatch.h cvs rdiff -u -r1.20 -r1.21 src/sys/netatalk/at_extern.h cvs rdiff -u -r1.22 -r1.23 src/sys/netatalk/at_proto.c cvs rdiff -u -r1.9 -r1.10 src/sys/netatalk/at_var.h cvs rdiff -u -r1.31 -r1.32 src/sys/netatalk/ddp_input.c cvs rdiff -u -r1.75 -r1.76 src/sys/netatalk/ddp_usrreq.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_ethersubr.c diff -u src/sys/net/if_ethersubr.c:1.317 src/sys/net/if_ethersubr.c:1.318 --- src/sys/net/if_ethersubr.c:1.317 Sat Sep 3 01:35:03 2022 +++ src/sys/net/if_ethersubr.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ethersubr.c,v 1.317 2022/09/03 01:35:03 thorpej Exp $ */ +/* $NetBSD: if_ethersubr.c,v 1.318 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.317 2022/09/03 01:35:03 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.318 2022/09/03 01:48:22 thorpej Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -574,8 +574,7 @@ bad: static void ether_input_llc(struct ifnet *ifp, struct mbuf *m, struct ether_header *eh) { - struct ifqueue *inq = NULL; - int isr = 0; + pktqueue_t *pktq = NULL; struct llc *l; if (m->m_len < sizeof(*eh) + sizeof(struct llc)) @@ -594,10 +593,9 @@ ether_input_llc(struct ifnet *ifp, struc at_org_code, sizeof(at_org_code)) == 0 && ntohs(l->llc_snap_ether_type) == ETHERTYPE_ATALK) { - inq = &atintrq2; + pktq = at_pktq2; m_adj(m, sizeof(struct ether_header) + sizeof(struct llc)); - isr = NETISR_ATALK; break; } @@ -621,8 +619,10 @@ ether_input_llc(struct ifnet *ifp, struc goto noproto; } - KASSERT(inq != NULL); - IFQ_ENQUEUE_ISR(inq, m, isr); + KASSERT(pktq != NULL); + if (__predict_false(!pktq_enqueue(pktq, m, 0))) { + m_freem(m); + } return; noproto: @@ -927,8 +927,7 @@ ether_input(struct ifnet *ifp, struct mb #ifdef NETATALK case ETHERTYPE_ATALK: - isr = NETISR_ATALK; - inq = &atintrq1; + pktq = at_pktq1; break; case ETHERTYPE_AARP: Index: src/sys/net/if_gre.c diff -u src/sys/net/if_gre.c:1.181 src/sys/net/if_gre.c:1.182 --- src/sys/net/if_gre.c:1.181 Tue Sep 21 14:59:14 2021 +++ src/sys/net/if_gre.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gre.c,v 1.181 2021/09/21 14:59:14 christos Exp $ */ +/* $NetBSD: if_gre.c,v 1.182 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.181 2021/09/21 14:59:14 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.182 2022/09/03 01:48:22 thorpej Exp $"); #ifdef _KERNEL_OPT #include "opt_atalk.h" @@ -825,8 +825,7 @@ gre_input(struct gre_softc *sc, struct m #endif #ifdef NETATALK case ETHERTYPE_ATALK: - ifq = &atintrq1; - isr = NETISR_ATALK; + pktq = at_pktq1; af = AF_APPLETALK; break; #endif Index: src/sys/net/if_loop.c diff -u src/sys/net/if_loop.c:1.114 src/sys/net/if_loop.c:1.115 --- src/sys/net/if_loop.c:1.114 Sun Jul 31 13:14:54 2022 +++ src/sys/net/if_loop.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_loop.c,v 1.114 2022/07/31 13:14:54 mlelstv Exp $ */ +/* $NetBSD: if_loop.c,v 1.115 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.114 2022/07/31 13:14:54 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.115 2022/09/03 01:48:22 thorpej Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -348,8 +348,7 @@ looutput(struct ifnet *ifp, struct mbuf #endif #ifdef NETATALK case AF_APPLETALK: - ifq = &atintrq2; - isr = NETISR_ATALK; + pktq = at_pktq2; break; #endif default: @@ -397,11 +396,10 @@ lostart(struct ifnet *ifp) { for (;;) { pktqueue_t *pktq = NULL; - struct ifqueue *ifq = NULL; struct mbuf *m; size_t pktlen; uint32_t af; - int s, isr = 0; + int s; IFQ_DEQUEUE(&ifp->if_snd, m); if (m == NULL) @@ -424,8 +422,7 @@ lostart(struct ifnet *ifp) #endif #ifdef NETATALK case AF_APPLETALK: - ifq = &atintrq2; - isr = NETISR_ATALK; + pktq = at_pktq2; break; #endif default: @@ -435,25 +432,14 @@ lostart(struct ifnet *ifp) } pktlen = m->m_pkthdr.len; + KASSERT(pktq != NULL); + s = splnet(); - if (__predict_true(pktq)) { - if (__predict_false(pktq_enqueue(pktq, m, 0))) { - m_freem(m); - splx(s); - return; - } - if_statadd2(ifp, if_ipackets, 1, if_ibytes, pktlen); - splx(s); - continue; - } - if (IF_QFULL(ifq)) { - IF_DROP(ifq); - splx(s); + if (__predict_false(pktq_enqueue(pktq, m, 0))) { m_freem(m); + splx(s); return; } - IF_ENQUEUE(ifq, m); - schednetisr(isr); if_statadd2(ifp, if_ipackets, 1, if_ibytes, pktlen); splx(s); } Index: src/sys/net/netisr_dispatch.h diff -u src/sys/net/netisr_dispatch.h:1.21 src/sys/net/netisr_dispatch.h:1.22 --- src/sys/net/netisr_dispatch.h:1.21 Sat Sep 3 01:35:03 2022 +++ src/sys/net/netisr_dispatch.h Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: netisr_dispatch.h,v 1.21 2022/09/03 01:35:03 thorpej Exp $ */ +/* $NetBSD: netisr_dispatch.h,v 1.22 2022/09/03 01:48:22 thorpej Exp $ */ #ifndef _NET_NETISR_DISPATCH_H_ #define _NET_NETISR_DISPATCH_H_ @@ -27,9 +27,6 @@ * their prototypes in <net/netisr.h> (if necessary). */ -#ifdef NETATALK - DONETISR(NETISR_ATALK,atintr); -#endif #ifdef MPLS DONETISR(NETISR_MPLS,mplsintr); #endif Index: src/sys/netatalk/at_extern.h diff -u src/sys/netatalk/at_extern.h:1.20 src/sys/netatalk/at_extern.h:1.21 --- src/sys/netatalk/at_extern.h:1.20 Tue May 29 16:29:47 2018 +++ src/sys/netatalk/at_extern.h Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: at_extern.h,v 1.20 2018/05/29 16:29:47 maxv Exp $ */ +/* $NetBSD: at_extern.h,v 1.21 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1990,1994 Regents of The University of Michigan. @@ -44,7 +44,8 @@ extern struct mowner atalk_tx_mowner; extern const struct pr_usrreqs ddp_usrreqs; -void atintr(void); +void atintr1(void *); +void atintr2(void *); void aarpprobe(void *); int aarpresolve(struct ifnet *, struct mbuf *, const struct sockaddr_at *, u_char *); @@ -66,5 +67,4 @@ struct ddpcb * int ddp_route(struct mbuf *, struct route *); char * prsockaddr(const void *); - #endif /* !_NETATALK_AT_EXTERN_H_ */ Index: src/sys/netatalk/at_proto.c diff -u src/sys/netatalk/at_proto.c:1.22 src/sys/netatalk/at_proto.c:1.23 --- src/sys/netatalk/at_proto.c:1.22 Thu Sep 21 07:15:34 2017 +++ src/sys/netatalk/at_proto.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: at_proto.c,v 1.22 2017/09/21 07:15:34 ozaki-r Exp $ */ +/* $NetBSD: at_proto.c,v 1.23 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.22 2017/09/21 07:15:34 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.23 2022/09/03 01:48:22 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -73,7 +73,6 @@ struct domain atalkdomain = { .dom_maxrtkey = sizeof(struct sockaddr_at), .dom_ifattach = NULL, .dom_ifdetach = NULL, - .dom_ifqueues = { &atintrq1, &atintrq2 }, .dom_link = { NULL }, .dom_mowner = MOWNER_INIT("",""), .dom_sa_cmpofs = offsetof(struct sockaddr_at, sat_addr), Index: src/sys/netatalk/at_var.h diff -u src/sys/netatalk/at_var.h:1.9 src/sys/netatalk/at_var.h:1.10 --- src/sys/netatalk/at_var.h:1.9 Wed Oct 9 14:15:40 2019 +++ src/sys/netatalk/at_var.h Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: at_var.h,v 1.9 2019/10/09 14:15:40 maxv Exp $ */ +/* $NetBSD: at_var.h,v 1.10 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -67,6 +67,9 @@ struct at_aliasreq { #define AFA_PHASE2 0x0004 #ifdef _KERNEL + +#include <net/pktqueue.h> + int sockaddr_at_cmp(const struct sockaddr *, const struct sockaddr *); static __inline void @@ -104,7 +107,7 @@ sockaddr_at_alloc(const struct at_addr * } TAILQ_HEAD(at_ifaddrhead, at_ifaddr); extern struct at_ifaddrhead at_ifaddr; -extern struct ifqueue atintrq1, atintrq2; +extern pktqueue_t *at_pktq1, *at_pktq2; #endif #endif /* !_NETATALK_AT_VAR_H_ */ Index: src/sys/netatalk/ddp_input.c diff -u src/sys/netatalk/ddp_input.c:1.31 src/sys/netatalk/ddp_input.c:1.32 --- src/sys/netatalk/ddp_input.c:1.31 Wed Mar 21 14:23:54 2018 +++ src/sys/netatalk/ddp_input.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_input.c,v 1.31 2018/03/21 14:23:54 roy Exp $ */ +/* $NetBSD: ddp_input.c,v 1.32 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1990,1994 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_input.c,v 1.31 2018/03/21 14:23:54 roy Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_input.c,v 1.32 2022/09/03 01:48:22 thorpej Exp $"); #include "opt_atalk.h" #include <sys/param.h> @@ -53,59 +53,57 @@ __KERNEL_RCSID(0, "$NetBSD: ddp_input.c, int ddp_forward = 1; int ddp_firewall = 0; extern int ddp_cksum; -void ddp_input(struct mbuf *, struct ifnet *, - struct elaphdr *, int); +void ddp_input(struct mbuf *, struct ifnet *, struct elaphdr *, int); -/* - * Could probably merge these two code segments a little better... - */ -void -atintr(void) +static struct at_ifaddr * +at_ifaddr_for_ifp(struct ifnet * const ifp, int phase_flag) { - struct elaphdr *elhp, elh; - struct ifnet *ifp; - struct mbuf *m; struct at_ifaddr *aa; - mutex_enter(softnet_lock); - for (;;) { - IFQ_LOCK(&atintrq2); - IF_DEQUEUE(&atintrq2, m); - IFQ_UNLOCK(&atintrq2); + TAILQ_FOREACH(aa, &at_ifaddr, aa_list) { + if (aa->aa_ifp == ifp && + (aa->aa_flags & AFA_PHASE2) == phase_flag) { + return aa; + } + } + return NULL; +} - if (m == 0) /* no more queued packets */ - break; +void +atintr2(void *arg __unused) +{ + struct mbuf *m; + + mutex_enter(softnet_lock); + while ((m = pktq_dequeue(at_pktq2)) != NULL) { + struct ifnet *ifp; m_claimm(m, &atalk_rx_mowner); ifp = m_get_rcvif_NOMPSAFE(m); - for (aa = at_ifaddr.tqh_first; aa; aa = aa->aa_list.tqe_next) { - if (aa->aa_ifp == ifp && (aa->aa_flags & AFA_PHASE2)) - break; - } - if (aa == NULL) { /* ifp not an appletalk interface */ + if (at_ifaddr_for_ifp(ifp, AFA_PHASE2) == NULL) { + /* ifp not an appletalk interface */ m_freem(m); continue; } ddp_input(m, ifp, NULL, 2); } + mutex_exit(softnet_lock); +} - for (;;) { - IFQ_LOCK(&atintrq1); - IF_DEQUEUE(&atintrq1, m); - IFQ_UNLOCK(&atintrq1); - - if (m == 0) /* no more queued packets */ +void +atintr1(void *arg __unused) +{ + struct mbuf *m; - break; + mutex_enter(softnet_lock); + while ((m = pktq_dequeue(at_pktq1)) != NULL) { + struct ifnet *ifp; + struct elaphdr *elhp, elh; m_claimm(m, &atalk_rx_mowner); ifp = m_get_rcvif_NOMPSAFE(m); - for (aa = at_ifaddr.tqh_first; aa; aa = aa->aa_list.tqe_next) { - if (aa->aa_ifp == ifp && - (aa->aa_flags & AFA_PHASE2) == 0) - break; - } - if (aa == NULL) { /* ifp not an appletalk interface */ + if (at_ifaddr_for_ifp(ifp, 0) == NULL) { + /* ifp not an appletalk interface */ m_freem(m); continue; } Index: src/sys/netatalk/ddp_usrreq.c diff -u src/sys/netatalk/ddp_usrreq.c:1.75 src/sys/netatalk/ddp_usrreq.c:1.76 --- src/sys/netatalk/ddp_usrreq.c:1.75 Tue Sep 21 15:01:59 2021 +++ src/sys/netatalk/ddp_usrreq.c Sat Sep 3 01:48:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.75 2021/09/21 15:01:59 christos Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.76 2022/09/03 01:48:22 thorpej Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.75 2021/09/21 15:01:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.76 2022/09/03 01:48:22 thorpej Exp $"); #include "opt_mbuftrace.h" #include "opt_atalk.h" @@ -63,7 +63,9 @@ static int at_pcbsetaddr(struct ddpcb *, static int at_pcbconnect(struct ddpcb *, struct sockaddr_at *); static void ddp_detach(struct socket *); -struct ifqueue atintrq1, atintrq2; +pktqueue_t * at_pktq1 __read_mostly; +pktqueue_t * at_pktq2 __read_mostly; + struct ddpcb *ddp_ports[ATPORT_LAST]; struct ddpcb *ddpcb = NULL; percpu_t *ddpstat_percpu; @@ -603,10 +605,12 @@ ddp_init(void) ddpstat_percpu = percpu_alloc(sizeof(uint64_t) * DDP_NSTATS); TAILQ_INIT(&at_ifaddr); - atintrq1.ifq_maxlen = IFQ_MAXLEN; - atintrq2.ifq_maxlen = IFQ_MAXLEN; - IFQ_LOCK_INIT(&atintrq1); - IFQ_LOCK_INIT(&atintrq2); + + at_pktq1 = pktq_create(IFQ_MAXLEN, atintr1, NULL); + KASSERT(at_pktq1 != NULL); + + at_pktq2 = pktq_create(IFQ_MAXLEN, atintr2, NULL); + KASSERT(at_pktq2 != NULL); MOWNER_ATTACH(&atalk_tx_mowner); MOWNER_ATTACH(&atalk_rx_mowner);