Index: if_var.h =================================================================== RCS file: /cvs/src/sys/net/if_var.h,v retrieving revision 1.120 diff -u -p -r1.120 if_var.h --- if_var.h 14 Nov 2022 22:06:26 -0000 1.120 +++ if_var.h 16 Nov 2022 04:49:44 -0000 @@ -48,6 +48,11 @@ #include +struct softnet { + char sn_name[16]; + struct taskq *sn_taskq; +}; + /* * Structures defining a network interface, providing a packet * transport mechanism (ala level 0 of the PUP protocols). @@ -87,7 +92,6 @@ struct rtentry; struct ifnet; -struct task; struct cpumem; /* Index: if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.680 diff -u -p -r1.680 if.c --- if.c 14 Nov 2022 22:45:02 -0000 1.680 +++ if.c 16 Nov 2022 04:49:44 -0000 @@ -239,8 +239,13 @@ int ifq_congestion; int netisr; +#ifdef MULTIPROCESSOR #define NET_TASKQ 4 -struct taskq *nettqmp[NET_TASKQ]; +#else +#define NET_TASKQ 1 +#endif + +static struct softnet softnets[NET_TASKQ]; struct task if_input_task_locked = TASK_INITIALIZER(if_netisr, NULL); @@ -265,8 +270,11 @@ ifinit(void) if_idxmap_init(8); /* 8 is a nice power of 2 for malloc */ for (i = 0; i < NET_TASKQ; i++) { - nettqmp[i] = taskq_create("softnet", 1, IPL_NET, TASKQ_MPSAFE); - if (nettqmp[i] == NULL) + struct softnet *sn = &softnets[i]; + snprintf(sn->sn_name, sizeof(sn->sn_name), "softnet%u", i); + sn->sn_taskq = taskq_create(sn->sn_name, 1, IPL_NET, + TASKQ_MPSAFE); + if (sn->sn_taskq == NULL) panic("unable to create network taskq %d", i); } } @@ -3422,13 +3430,13 @@ unhandled_af(int af) struct taskq * net_tq(unsigned int ifindex) { - struct taskq *t = NULL; + struct softnet *sn; static int nettaskqs; if (nettaskqs == 0) nettaskqs = min(NET_TASKQ, ncpus); - t = nettqmp[ifindex % nettaskqs]; + sn = &softnets[ifindex % nettaskqs]; - return (t); + return (sn->sn_taskq); } Index: ifq.c =================================================================== RCS file: /cvs/src/sys/net/ifq.c,v retrieving revision 1.46 diff -u -p -r1.46 ifq.c --- ifq.c 30 Apr 2022 21:13:57 -0000 1.46 +++ ifq.c 16 Nov 2022 04:49:44 -0000 @@ -243,7 +243,7 @@ void ifq_init(struct ifqueue *ifq, struct ifnet *ifp, unsigned int idx) { ifq->ifq_if = ifp; - ifq->ifq_softnet = net_tq(ifp->if_index + idx); + ifq->ifq_softnet = net_tq(idx); ifq->ifq_softc = NULL; mtx_init(&ifq->ifq_mtx, IPL_NET); @@ -620,7 +620,7 @@ void ifiq_init(struct ifiqueue *ifiq, struct ifnet *ifp, unsigned int idx) { ifiq->ifiq_if = ifp; - ifiq->ifiq_softnet = net_tq(ifp->if_index + idx); + ifiq->ifiq_softnet = net_tq(idx); ifiq->ifiq_softc = NULL; mtx_init(&ifiq->ifiq_mtx, IPL_NET); Index: if_aggr.c =================================================================== RCS file: /cvs/src/sys/net/if_aggr.c,v retrieving revision 1.39 diff -u -p -r1.39 if_aggr.c --- if_aggr.c 5 Feb 2022 03:56:16 -0000 1.39 +++ if_aggr.c 16 Nov 2022 04:49:44 -0000 @@ -299,7 +299,10 @@ static const char *lacp_mux_event_names[ * aggr interface */ -#define AGGR_MAX_PORTS 32 +#define AGGR_PORT_BITS 5 +#define AGGR_FLOWID_SHIFT (16 - AGGR_PORT_BITS) + +#define AGGR_MAX_PORTS (1 << AGGR_PORT_BITS) #define AGGR_MAX_SLOW_PKTS (AGGR_MAX_PORTS * 3) struct aggr_multiaddr { @@ -660,7 +663,7 @@ aggr_transmit(struct aggr_softc *sc, con #endif if (ISSET(m->m_pkthdr.csum_flags, M_FLOWID)) - flow = m->m_pkthdr.ph_flowid; + flow = m->m_pkthdr.ph_flowid >> AGGR_FLOWID_SHIFT; ifp0 = map->m_ifp0s[flow % AGGR_MAX_PORTS];