Run IP input and forwarding with shared netlock. Also distribute
authorbluhm <bluhm@openbsd.org>
Sat, 30 Apr 2022 21:13:57 +0000 (21:13 +0000)
committerbluhm <bluhm@openbsd.org>
Sat, 30 Apr 2022 21:13:57 +0000 (21:13 +0000)
packets from the interface receive rings into multiple net task
queues.
Note that we still have only one softnet task.  So there will be
no concurrency yet, but we can notice wrong exclusive lock assertions.
Soon the final step will be to increase the NET_TASKQ define.
lots of testing Hrvoje Popovski; OK sashan@

sys/net/if.c
sys/net/ifq.c

index d989111..3bd5eab 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if.c,v 1.650 2022/04/28 16:56:39 bluhm Exp $  */
+/*     $OpenBSD: if.c,v 1.651 2022/04/30 21:13:57 bluhm Exp $  */
 /*     $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $  */
 
 /*
@@ -834,15 +834,10 @@ if_input_process(struct ifnet *ifp, struct mbuf_list *ml)
         * lists and the socket layer.
         */
 
-       /*
-        * XXXSMP IPsec data structures are not ready to be accessed
-        * by multiple network threads in parallel.  In this case
-        * use an exclusive lock.
-        */
-       NET_LOCK();
+       NET_RLOCK_IN_SOFTNET();
        while ((m = ml_dequeue(ml)) != NULL)
                (*ifp->if_input)(ifp, m);
-       NET_UNLOCK();
+       NET_RUNLOCK_IN_SOFTNET();
 }
 
 void
index cf3685a..26ac170 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ifq.c,v 1.45 2022/01/18 10:54:05 dlg Exp $ */
+/*     $OpenBSD: ifq.c,v 1.46 2022/04/30 21:13:57 bluhm Exp $ */
 
 /*
  * Copyright (c) 2015 David Gwynne <dlg@openbsd.org>
@@ -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(ifp->if_index + 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(ifp->if_index + idx);
        ifiq->ifiq_softc = NULL;
 
        mtx_init(&ifiq->ifiq_mtx, IPL_NET);