git: e934d455ba37 - main - safexcel: Dispatch requests to the current CPU's ring

Mark Johnston markj at FreeBSD.org
Mon Jan 18 22:08:12 UTC 2021


The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=e934d455ba37ea777bd32cdcb0f9754865f9e818

commit e934d455ba37ea777bd32cdcb0f9754865f9e818
Author:     Mark Johnston <markj at FreeBSD.org>
AuthorDate: 2021-01-18 22:07:55 +0000
Commit:     Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-01-18 22:07:55 +0000

    safexcel: Dispatch requests to the current CPU's ring
    
    This gives better performance in some tests than the previous policy of
    statically binding each session to a ring.
    
    MFC after:      1 week
    Sponsored by:   Rubicon Communications, LLC (Netgate)
---
 sys/dev/safexcel/safexcel.c     | 25 ++++++++++++++-----------
 sys/dev/safexcel/safexcel_var.h |  3 +--
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/sys/dev/safexcel/safexcel.c b/sys/dev/safexcel/safexcel.c
index ba65207eb588..c3a2cdcca62d 100644
--- a/sys/dev/safexcel/safexcel.c
+++ b/sys/dev/safexcel/safexcel.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/module.h>
 #include <sys/mutex.h>
 #include <sys/rman.h>
+#include <sys/smp.h>
 #include <sys/sglist.h>
 #include <sys/sysctl.h>
 
@@ -189,6 +190,8 @@ safexcel_rdr_intr(struct safexcel_softc *sc, int ringidx)
 		req = STAILQ_FIRST(&ring->queued_requests);
 		KASSERT(req != NULL, ("%s: expected %d pending requests",
 		    __func__, nreqs));
+		KASSERT(req->ringidx == ringidx,
+		    ("%s: ring index mismatch", __func__));
                 STAILQ_REMOVE_HEAD(&ring->queued_requests, link);
 		mtx_unlock(&ring->mtx);
 
@@ -748,9 +751,7 @@ safexcel_execute(struct safexcel_softc *sc, struct safexcel_ring *ring,
 
 	mtx_assert(&ring->mtx, MA_OWNED);
 
-	ringidx = req->sess->ringidx;
-	if (STAILQ_EMPTY(&ring->ready_requests))
-		return;
+	ringidx = req->ringidx;
 	busy = !STAILQ_EMPTY(&ring->queued_requests);
 	ncdescs = nrdescs = nreqs = 0;
 	while ((req = STAILQ_FIRST(&ring->ready_requests)) != NULL &&
@@ -1024,7 +1025,7 @@ safexcel_init_hw(struct safexcel_softc *sc)
 static int
 safexcel_setup_dev_interrupts(struct safexcel_softc *sc)
 {
-	int i, j;
+	int error, i, j;
 
 	for (i = 0; i < SAFEXCEL_MAX_RINGS && sc->sc_intr[i] != NULL; i++) {
 		sc->sc_ih[i].sc = sc;
@@ -1037,6 +1038,11 @@ safexcel_setup_dev_interrupts(struct safexcel_softc *sc)
 			    "couldn't setup interrupt %d\n", i);
 			goto err;
 		}
+
+		error = bus_bind_intr(sc->sc_dev, sc->sc_intr[i], i % mp_ncpus);
+		if (error != 0)
+			device_printf(sc->sc_dev,
+			    "failed to bind ring %d\n", error);
 	}
 
 	return (0);
@@ -1175,6 +1181,7 @@ safexcel_attach(device_t dev)
 		for (i = 0; i < SAFEXCEL_REQUESTS_PER_RING; i++) {
 			req = &ring->requests[i];
 			req->sc = sc;
+			req->ringidx = ringidx;
 			if (bus_dmamap_create(ring->data_dtag,
 			    BUS_DMA_COHERENT, &req->dmap) != 0) {
 				for (j = 0; j < i; j++)
@@ -1783,7 +1790,7 @@ safexcel_set_token(struct safexcel_request *req)
 	csp = crypto_get_params(req->crp->crp_session);
 	cdesc = req->cdesc;
 	sc = req->sc;
-	ringidx = req->sess->ringidx;
+	ringidx = req->ringidx;
 
 	safexcel_set_command(req, cdesc);
 
@@ -1999,7 +2006,7 @@ safexcel_create_chain_cb(void *arg, bus_dma_segment_t *segs, int nseg,
 	crp = req->crp;
 	csp = crypto_get_params(crp->crp_session);
 	sess = req->sess;
-	ring = &req->sc->sc_ring[sess->ringidx];
+	ring = &req->sc->sc_ring[req->ringidx];
 
 	mtx_assert(&ring->mtx, MA_OWNED);
 
@@ -2527,10 +2534,6 @@ safexcel_newsession(device_t dev, crypto_session_t cses,
 
 	safexcel_setkey(sess, csp, NULL);
 
-	/* Bind each session to a fixed ring to minimize lock contention. */
-	sess->ringidx = atomic_fetchadd_int(&sc->sc_ringidx, 1);
-	sess->ringidx %= sc->sc_config.rings;
-
 	return (0);
 }
 
@@ -2558,7 +2561,7 @@ safexcel_process(device_t dev, struct cryptop *crp, int hint)
 	if (crp->crp_cipher_key != NULL || crp->crp_auth_key != NULL)
 		safexcel_setkey(sess, csp, crp);
 
-	ring = &sc->sc_ring[sess->ringidx];
+	ring = &sc->sc_ring[curcpu % sc->sc_config.rings];
 	mtx_lock(&ring->mtx);
 	req = safexcel_alloc_request(sc, ring);
         if (__predict_false(req == NULL)) {
diff --git a/sys/dev/safexcel/safexcel_var.h b/sys/dev/safexcel/safexcel_var.h
index 057f9e9be1d5..de65e666a4c3 100644
--- a/sys/dev/safexcel/safexcel_var.h
+++ b/sys/dev/safexcel/safexcel_var.h
@@ -334,7 +334,6 @@ struct safexcel_res_descr_ring {
 };
 
 struct safexcel_session {
-	int			ringidx;
 	uint32_t		alg;		/* cipher algorithm */
 	uint32_t		digest;		/* digest type */
 	uint32_t		hash;		/* hash algorithm */
@@ -359,6 +358,7 @@ struct safexcel_softc;
 struct safexcel_request {
 	STAILQ_ENTRY(safexcel_request)	link;
 	bool				dmap_loaded;
+	int				ringidx;
 	bus_dmamap_t			dmap;
 	int				error;
 	int				cdescs, rdescs;
@@ -406,7 +406,6 @@ struct safexcel_softc {
 	struct safexcel_intr_handle	sc_ih[SAFEXCEL_MAX_RINGS];
 
 	struct safexcel_ring 		sc_ring[SAFEXCEL_MAX_RINGS];
-	int				sc_ringidx;
 
 	int32_t				sc_cid;
 	struct safexcel_reg_offsets 	sc_offsets;


More information about the dev-commits-src-all mailing list