No regression here.

> On 4 dec. 2015, at 11:54, Martin Pieuchot <m...@openbsd.org> wrote:
> 
> Now that in_arpinput() only uses the routing table, if_get()/if_put()
> and carp_iamatch being already mpsafe we can kill the ARP input queue.
> 
> This moves the ARP input path processing from the softnet interrupt
> context (under KERNEL_LOCK) to the sofnettask (without KERNEL_LOCK).
> 
> ok?
> 
> Index: net/if_ethersubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.231
> diff -u -p -r1.231 if_ethersubr.c
> --- net/if_ethersubr.c        2 Dec 2015 08:47:00 -0000       1.231
> +++ net/if_ethersubr.c        4 Dec 2015 10:42:14 -0000
> @@ -372,14 +372,14 @@ decapsulate:
>       case ETHERTYPE_ARP:
>               if (ifp->if_flags & IFF_NOARP)
>                       goto dropanyway;
> -             inq = &arpintrq;
> -             break;
> +             arpinput(m);
> +             return (1);
> 
>       case ETHERTYPE_REVARP:
>               if (ifp->if_flags & IFF_NOARP)
>                       goto dropanyway;
> -             inq = &rarpintrq;
> -             break;
> +             revarpinput(m);
> +             return (1);
> 
> #ifdef INET6
>       /*
> Index: net/netisr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/netisr.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 netisr.c
> --- net/netisr.c      3 Dec 2015 12:22:51 -0000       1.8
> +++ net/netisr.c      4 Dec 2015 10:43:35 -0000
> @@ -20,7 +20,6 @@
> 
> #include <machine/intr.h>
> 
> -#include "ether.h"
> #include "ppp.h"
> #include "bridge.h"
> #include "pppoe.h"
> @@ -39,10 +38,6 @@ netintr(void *unused) /* ARGSUSED */
>       while ((n = netisr) != 0) {
>               atomic_clearbits_int(&netisr, n);
> 
> -#if NETHER > 0
> -             if (n & (1 << NETISR_ARP))
> -                     arpintr();
> -#endif
>               if (n & (1 << NETISR_IP))
>                       ipintr();
> #ifdef INET6
> Index: net/netisr.h
> ===================================================================
> RCS file: /cvs/src/sys/net/netisr.h,v
> retrieving revision 1.43
> diff -u -p -r1.43 netisr.h
> --- net/netisr.h      3 Dec 2015 12:27:33 -0000       1.43
> +++ net/netisr.h      4 Dec 2015 10:44:01 -0000
> @@ -53,7 +53,6 @@
> #define       NETISR_IP       2               /* same as AF_INET */
> #define       NETISR_TX       3               /* for if_snd processing */
> #define       NETISR_PFSYNC   5               /* for pfsync "immediate" tx */
> -#define      NETISR_ARP      18              /* same as AF_LINK */
> #define       NETISR_IPV6     24              /* same as AF_INET6 */
> #define       NETISR_ISDN     26              /* same as AF_E164 */
> #define       NETISR_PPP      28              /* for PPP processing */
> @@ -64,7 +63,6 @@
> #ifdef _KERNEL
> extern int    netisr;                 /* scheduling bits for network */
> 
> -void arpintr(void);
> void  ipintr(void);
> void  ip6intr(void);
> void  pppintr(void);
> Index: netinet/if_ether.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/if_ether.c,v
> retrieving revision 1.197
> diff -u -p -r1.197 if_ether.c
> --- netinet/if_ether.c        2 Dec 2015 22:02:18 -0000       1.197
> +++ netinet/if_ether.c        4 Dec 2015 10:44:17 -0000
> @@ -88,14 +88,10 @@ void arptfree(struct rtentry *);
> void arptimer(void *);
> struct rtentry *arplookup(u_int32_t, int, int, u_int);
> void in_arpinput(struct mbuf *);
> -void revarpinput(struct mbuf *);
> void in_revarpinput(struct mbuf *);
> 
> LIST_HEAD(, llinfo_arp) arp_list;
> struct        pool arp_pool;          /* pool for llinfo_arp structures */
> -/* XXX hate magic numbers */
> -struct       niqueue arpintrq = NIQUEUE_INITIALIZER(50, NETISR_ARP);
> -struct       niqueue rarpintrq = NIQUEUE_INITIALIZER(50, NETISR_ARP);
> int   arp_inuse, arp_allocated;
> int   arp_maxtries = 5;
> int   arpinit_done;
> @@ -426,43 +422,40 @@ bad:
>  * then the protocol-specific routine is called.
>  */
> void
> -arpintr(void)
> +arpinput(struct mbuf *m)
> {
> -     struct mbuf *m;
>       struct arphdr *ar;
>       int len;
> 
> -     while ((m = niq_dequeue(&arpintrq)) != NULL) {
> #ifdef DIAGNOSTIC
> -             if ((m->m_flags & M_PKTHDR) == 0)
> -                     panic("arpintr");
> +     if ((m->m_flags & M_PKTHDR) == 0)
> +             panic("%s", __func__);
> #endif
> 
> -             len = sizeof(struct arphdr);
> -             if (m->m_len < len && (m = m_pullup(m, len)) == NULL)
> -                     continue;
> -
> -             ar = mtod(m, struct arphdr *);
> -             if (ntohs(ar->ar_hrd) != ARPHRD_ETHER) {
> -                     m_freem(m);
> -                     continue;
> -             }
> +     len = sizeof(struct arphdr);
> +     if (m->m_len < len && (m = m_pullup(m, len)) == NULL)
> +             return;
> 
> -             len += 2 * (ar->ar_hln + ar->ar_pln);
> -             if (m->m_len < len && (m = m_pullup(m, len)) == NULL)
> -                     continue;
> -
> -             switch (ntohs(ar->ar_pro)) {
> -             case ETHERTYPE_IP:
> -             case ETHERTYPE_IPTRAILERS:
> -                     in_arpinput(m);
> -                     continue;
> -             }
> +     ar = mtod(m, struct arphdr *);
> +     if (ntohs(ar->ar_hrd) != ARPHRD_ETHER) {
>               m_freem(m);
> +             return;
>       }
> 
> -     while ((m = niq_dequeue(&rarpintrq)) != NULL)
> -             revarpinput(m);
> +     len += 2 * (ar->ar_hln + ar->ar_pln);
> +     if (m->m_len < len && (m = m_pullup(m, len)) == NULL)
> +             return;
> +
> +     switch (ntohs(ar->ar_pro)) {
> +     case ETHERTYPE_IP:
> +     case ETHERTYPE_IPTRAILERS:
> +             in_arpinput(m);
> +             return;
> +     default:
> +             break;
> +     }
> +
> +     m_freem(m);
> }
> 
> /*
> Index: netinet/if_ether.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/if_ether.h,v
> retrieving revision 1.64
> diff -u -p -r1.64 if_ether.h
> --- netinet/if_ether.h        24 Nov 2015 15:27:46 -0000      1.64
> +++ netinet/if_ether.h        4 Dec 2015 10:42:32 -0000
> @@ -182,11 +182,20 @@ extern u_int8_t etherbroadcastaddr[ETHER
> extern u_int8_t etheranyaddr[ETHER_ADDR_LEN];
> extern u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
> extern u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
> -extern struct niqueue arpintrq;
> -extern struct niqueue rarpintrq;
> 
> +#ifdef NFSCLIENT
> +extern unsigned int revarp_ifidx;
> +#endif /* NFSCLIENT */
> +
> +void revarpinput(struct mbuf *);
> +void revarprequest(struct ifnet *);
> +int  revarpwhoarewe(struct ifnet *, struct in_addr *, struct in_addr *);
> +int  revarpwhoami(struct in_addr *, struct ifnet *);
> +
> +void arpinput(struct mbuf *);
> +void arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *);
> void  arpwhohas(struct arpcom *, struct in_addr *);
> -void arpintr(void);
> +int  arpproxy(struct in_addr, unsigned int);
> int   arpresolve(struct ifnet *, struct rtentry *, struct mbuf *,
>           struct sockaddr *, u_char *);
> void  arp_rtrequest(struct ifnet *, int, struct rtentry *);
> @@ -261,17 +270,6 @@ do {                                                     
>                 \
>       (step).e_enm = LIST_FIRST(&(ac)->ac_multiaddrs);                \
>       ETHER_NEXT_MULTI((step), (enm));                                \
> } while (/* CONSTCOND */ 0)
> -
> -#ifdef NFSCLIENT
> -extern unsigned int revarp_ifidx;
> -#endif /* NFSCLIENT */
> -
> -void arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *);
> -int arpproxy(struct in_addr, unsigned int);
> -void revarprequest(struct ifnet *);
> -int revarpwhoarewe(struct ifnet *, struct in_addr *, struct in_addr *);
> -int revarpwhoami(struct in_addr *, struct ifnet *);
> -int db_show_arptab(void);
> 
> u_int32_t ether_crc32_le_update(u_int32_t crc, const u_int8_t *, size_t);
> u_int32_t ether_crc32_be_update(u_int32_t crc, const u_int8_t *, size_t);
> 

Reply via email to