Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Use workqueue API directly, without the wrapper ...



details:   https://anonhg.NetBSD.org/src/rev/0a8f7f6ce25a
branches:  trunk
changeset: 969628:0a8f7f6ce25a
user:      yamaguchi <yamaguchi%NetBSD.org@localhost>
date:      Tue Feb 25 07:10:10 2020 +0000

description:
Use workqueue API directly, without the wrapper in ixl(4)
to improve performace by removing atomic_ops(3)

pointed out and reviewed by knakahara@n.o., thanks

diffstat:

 sys/dev/pci/if_ixl.c |  36 ++++++++++++++++++++++++------------
 1 files changed, 24 insertions(+), 12 deletions(-)

diffs (114 lines):

diff -r 2e9bbed2f803 -r 0a8f7f6ce25a sys/dev/pci/if_ixl.c
--- a/sys/dev/pci/if_ixl.c      Tue Feb 25 07:05:57 2020 +0000
+++ b/sys/dev/pci/if_ixl.c      Tue Feb 25 07:10:10 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ixl.c,v 1.44 2020/02/25 07:05:57 yamaguchi Exp $    */
+/*     $NetBSD: if_ixl.c,v 1.45 2020/02/25 07:10:10 yamaguchi Exp $    */
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ixl.c,v 1.44 2020/02/25 07:05:57 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ixl.c,v 1.45 2020/02/25 07:10:10 yamaguchi Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -478,7 +478,7 @@
        char                     qp_name[16];
 
        void                    *qp_si;
-       struct ixl_work          qp_task;
+       struct work              qp_work;
        bool                     qp_workqueue;
 };
 
@@ -828,6 +828,7 @@
 static int     ixl_queue_intr(void *);
 static int     ixl_other_intr(void *);
 static void    ixl_handle_queue(void *);
+static void    ixl_handle_queue_wk(struct work *, void *);
 static void    ixl_sched_handle_queue(struct ixl_softc *,
                    struct ixl_queue_pair *);
 static int     ixl_init(struct ifnet *);
@@ -1346,10 +1347,12 @@
                goto teardown_sysctls;
 
        snprintf(xnamebuf, sizeof(xnamebuf), "%s_wq_txrx", device_xname(self));
-       sc->sc_workq_txrx = ixl_workq_create(xnamebuf, IXL_WORKQUEUE_PRI,
-           IPL_NET, WQ_PERCPU | WQ_MPSAFE);
-       if (sc->sc_workq_txrx == NULL)
+       rv = workqueue_create(&sc->sc_workq_txrx, xnamebuf, ixl_handle_queue_wk,
+           sc, IXL_WORKQUEUE_PRI, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
+       if (rv != 0) {
+               sc->sc_workq_txrx = NULL;
                goto teardown_wqs;
+       }
 
        snprintf(xnamebuf, sizeof(xnamebuf), "%s_atq_cv", device_xname(self));
        cv_init(&sc->sc_atq_cv, xnamebuf);
@@ -1529,7 +1532,7 @@
        }
 
        if (sc->sc_workq_txrx != NULL) {
-               ixl_workq_destroy(sc->sc_workq_txrx);
+               workqueue_destroy(sc->sc_workq_txrx);
                sc->sc_workq_txrx = NULL;
        }
 
@@ -1597,7 +1600,7 @@
        }
 
        if (sc->sc_workq_txrx != NULL) {
-               ixl_workq_destroy(sc->sc_workq_txrx);
+               workqueue_destroy(sc->sc_workq_txrx);
                sc->sc_workq_txrx = NULL;
        }
 
@@ -2225,8 +2228,9 @@
                mutex_enter(&rxr->rxr_lock);
                mutex_exit(&rxr->rxr_lock);
 
-               ixl_work_wait(sc->sc_workq_txrx,
-                   &sc->sc_qps[i].qp_task);
+               sc->sc_qps[i].qp_workqueue = false;
+               workqueue_wait(sc->sc_workq_txrx,
+                   &sc->sc_qps[i].qp_work);
        }
 }
 
@@ -2341,7 +2345,6 @@
                        goto free;
 
                qp->qp_sc = sc;
-               ixl_work_set(&qp->qp_task, ixl_handle_queue, qp);
                snprintf(qp->qp_name, sizeof(qp->qp_name),
                    "%s-TXRX%d", device_xname(sc->sc_dev), i);
        }
@@ -3420,7 +3423,7 @@
 {
 
        if (qp->qp_workqueue)
-               ixl_work_add(sc->sc_workq_txrx, &qp->qp_task);
+               workqueue_enqueue(sc->sc_workq_txrx, &qp->qp_work, NULL);
        else
                softint_schedule(qp->qp_si);
 }
@@ -3503,6 +3506,15 @@
 }
 
 static void
+ixl_handle_queue_wk(struct work *wk, void *xsc)
+{
+       struct ixl_queue_pair *qp;
+
+       qp = container_of(wk, struct ixl_queue_pair, qp_work);
+       ixl_handle_queue(qp);
+}
+
+static void
 ixl_handle_queue(void *xqp)
 {
        struct ixl_queue_pair *qp = xqp;



Home | Main Index | Thread Index | Old Index