Author: jhb
Date: Tue Jun  9 22:26:07 2020
New Revision: 361991
URL: https://svnweb.freebsd.org/changeset/base/361991

Log:
  Add a crypto capability flag for accelerated software drivers.
  
  Use this in GELI to print out a different message when accelerated
  software such as AESNI is used vs plain software crypto.
  
  While here, simplify the logic in GELI a bit for determing which type
  of crypto driver was chosen the first time by examining the
  capabilities of the matched driver after a single call to
  crypto_newsession rather than making separate calls with different
  flags.
  
  Reviewed by:  delphij
  Sponsored by: Chelsio Communications
  Differential Revision:        https://reviews.freebsd.org/D25126

Modified:
  head/share/man/man9/crypto_driver.9
  head/sys/crypto/aesni/aesni.c
  head/sys/crypto/armv8/armv8_crypto.c
  head/sys/crypto/blake2/blake2_cryptodev.c
  head/sys/crypto/via/padlock.c
  head/sys/geom/eli/g_eli.c
  head/sys/geom/eli/g_eli.h
  head/sys/mips/cavium/cryptocteon/cryptocteon.c
  head/sys/opencrypto/cryptodev.h

Modified: head/share/man/man9/crypto_driver.9
==============================================================================
--- head/share/man/man9/crypto_driver.9 Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/share/man/man9/crypto_driver.9 Tue Jun  9 22:26:07 2020        
(r361991)
@@ -30,7 +30,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 25, 2020
+.Dd June 9, 2020
 .Dt CRYPTO_DRIVER 9
 .Os
 .Sh NAME
@@ -113,6 +113,8 @@ should be used for drivers which process requests on s
 .Dv CRYPTOCAP_F_SYNC
 should be set for drivers which process requests synchronously in
 .Fn CRYPTODEV_PROCESS .
+.Dv CRYPTOCAP_F_ACCEL_SOFTWARE
+should be set for software drivers which use accelerated CPU instructions.
 .Fn crypto_get_driverid
 returns an opaque driver id.
 .Pp

Modified: head/sys/crypto/aesni/aesni.c
==============================================================================
--- head/sys/crypto/aesni/aesni.c       Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/sys/crypto/aesni/aesni.c       Tue Jun  9 22:26:07 2020        
(r361991)
@@ -167,7 +167,8 @@ aesni_attach(device_t dev)
        sc = device_get_softc(dev);
 
        sc->cid = crypto_get_driverid(dev, sizeof(struct aesni_session),
-           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC);
+           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC |
+           CRYPTOCAP_F_ACCEL_SOFTWARE);
        if (sc->cid < 0) {
                device_printf(dev, "Could not get crypto driver id.\n");
                return (ENOMEM);

Modified: head/sys/crypto/armv8/armv8_crypto.c
==============================================================================
--- head/sys/crypto/armv8/armv8_crypto.c        Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/sys/crypto/armv8/armv8_crypto.c        Tue Jun  9 22:26:07 2020        
(r361991)
@@ -131,7 +131,7 @@ armv8_crypto_attach(device_t dev)
        sc->dieing = 0;
 
        sc->cid = crypto_get_driverid(dev, sizeof(struct armv8_crypto_session),
-           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC);
+           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC | 
CRYPTOCAP_F_ACCEL_SOFTWARE);
        if (sc->cid < 0) {
                device_printf(dev, "Could not get crypto driver id.\n");
                return (ENOMEM);

Modified: head/sys/crypto/blake2/blake2_cryptodev.c
==============================================================================
--- head/sys/crypto/blake2/blake2_cryptodev.c   Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/sys/crypto/blake2/blake2_cryptodev.c   Tue Jun  9 22:26:07 2020        
(r361991)
@@ -129,7 +129,8 @@ blake2_attach(device_t dev)
        sc->dying = false;
 
        sc->cid = crypto_get_driverid(dev, sizeof(struct blake2_session),
-           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC);
+           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC |
+           CRYPTOCAP_F_ACCEL_SOFTWARE);
        if (sc->cid < 0) {
                device_printf(dev, "Could not get crypto driver id.\n");
                return (ENOMEM);

Modified: head/sys/crypto/via/padlock.c
==============================================================================
--- head/sys/crypto/via/padlock.c       Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/sys/crypto/via/padlock.c       Tue Jun  9 22:26:07 2020        
(r361991)
@@ -119,7 +119,8 @@ padlock_attach(device_t dev)
        struct padlock_softc *sc = device_get_softc(dev);
 
        sc->sc_cid = crypto_get_driverid(dev, sizeof(struct padlock_session),
-           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC);
+           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC |
+           CRYPTOCAP_F_ACCEL_SOFTWARE);
        if (sc->sc_cid < 0) {
                device_printf(dev, "Could not get crypto driver id.\n");
                return (ENOMEM);

Modified: head/sys/geom/eli/g_eli.c
==============================================================================
--- head/sys/geom/eli/g_eli.c   Tue Jun  9 22:19:36 2020        (r361990)
+++ head/sys/geom/eli/g_eli.c   Tue Jun  9 22:26:07 2020        (r361991)
@@ -489,7 +489,8 @@ g_eli_newsession(struct g_eli_worker *wr)
 {
        struct g_eli_softc *sc;
        struct crypto_session_params csp;
-       int error;
+       uint32_t caps;
+       int error, new_crypto;
        void *key;
 
        sc = wr->w_softc;
@@ -516,6 +517,7 @@ g_eli_newsession(struct g_eli_worker *wr)
        }
 
        switch (sc->sc_crypto) {
+       case G_ELI_CRYPTO_SW_ACCEL:
        case G_ELI_CRYPTO_SW:
                error = crypto_newsession(&wr->w_sid, &csp,
                    CRYPTOCAP_F_SOFTWARE);
@@ -526,19 +528,19 @@ g_eli_newsession(struct g_eli_worker *wr)
                break;
        case G_ELI_CRYPTO_UNKNOWN:
                error = crypto_newsession(&wr->w_sid, &csp,
-                   CRYPTOCAP_F_HARDWARE);
+                   CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SOFTWARE);
                if (error == 0) {
+                       caps = crypto_ses2caps(wr->w_sid);
+                       if (caps & CRYPTOCAP_F_HARDWARE)
+                               new_crypto = G_ELI_CRYPTO_HW;
+                       else if (caps & CRYPTOCAP_F_ACCEL_SOFTWARE)
+                               new_crypto = G_ELI_CRYPTO_SW_ACCEL;
+                       else
+                               new_crypto = G_ELI_CRYPTO_SW;
                        mtx_lock(&sc->sc_queue_mtx);
                        if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN)
-                               sc->sc_crypto = G_ELI_CRYPTO_HW;
+                               sc->sc_crypto = new_crypto;
                        mtx_unlock(&sc->sc_queue_mtx);
-               } else {
-                       error = crypto_newsession(&wr->w_sid, &csp,
-                           CRYPTOCAP_F_SOFTWARE);
-                       mtx_lock(&sc->sc_queue_mtx);
-                       if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN)
-                               sc->sc_crypto = G_ELI_CRYPTO_SW;
-                       mtx_unlock(&sc->sc_queue_mtx);
                }
                break;
        default:
@@ -983,6 +985,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp,
        if (sc->sc_flags & G_ELI_FLAG_AUTH)
                G_ELI_DEBUG(0, " Integrity: %s", g_eli_algo2str(sc->sc_aalgo));
        G_ELI_DEBUG(0, "    Crypto: %s",
+           sc->sc_crypto == G_ELI_CRYPTO_SW_ACCEL ? "accelerated software" :
            sc->sc_crypto == G_ELI_CRYPTO_SW ? "software" : "hardware");
        return (gp);
 failed:
@@ -1380,6 +1383,9 @@ g_eli_dumpconf(struct sbuf *sb, const char *indent, st
                break;
        case G_ELI_CRYPTO_SW:
                sbuf_cat(sb, "software");
+               break;
+       case G_ELI_CRYPTO_SW_ACCEL:
+               sbuf_cat(sb, "accelerated software");
                break;
        default:
                sbuf_cat(sb, "UNKNOWN");

Modified: head/sys/geom/eli/g_eli.h
==============================================================================
--- head/sys/geom/eli/g_eli.h   Tue Jun  9 22:19:36 2020        (r361990)
+++ head/sys/geom/eli/g_eli.h   Tue Jun  9 22:26:07 2020        (r361991)
@@ -145,6 +145,7 @@
 #define        G_ELI_CRYPTO_UNKNOWN    0
 #define        G_ELI_CRYPTO_HW         1
 #define        G_ELI_CRYPTO_SW         2
+#define        G_ELI_CRYPTO_SW_ACCEL   3
 
 #ifdef _KERNEL
 #if (MAX_KEY_BYTES < G_ELI_DATAIVKEYLEN)

Modified: head/sys/mips/cavium/cryptocteon/cryptocteon.c
==============================================================================
--- head/sys/mips/cavium/cryptocteon/cryptocteon.c      Tue Jun  9 22:19:36 
2020        (r361990)
+++ head/sys/mips/cavium/cryptocteon/cryptocteon.c      Tue Jun  9 22:26:07 
2020        (r361991)
@@ -86,7 +86,8 @@ cryptocteon_attach(device_t dev)
        sc = device_get_softc(dev);
 
        sc->sc_cid = crypto_get_driverid(dev, sizeof(struct octo_sess),
-           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC);
+           CRYPTOCAP_F_SOFTWARE | CRYPTOCAP_F_SYNC |
+           CRYPTOCAP_F_ACCEL_SOFTWARE);
        if (sc->sc_cid < 0) {
                device_printf(dev, "crypto_get_driverid ret %d\n", sc->sc_cid);
                return (ENXIO);

Modified: head/sys/opencrypto/cryptodev.h
==============================================================================
--- head/sys/opencrypto/cryptodev.h     Tue Jun  9 22:19:36 2020        
(r361990)
+++ head/sys/opencrypto/cryptodev.h     Tue Jun  9 22:26:07 2020        
(r361991)
@@ -620,6 +620,7 @@ extern      void crypto_freesession(crypto_session_t cses);
 #define        CRYPTOCAP_F_HARDWARE    CRYPTO_FLAG_HARDWARE
 #define        CRYPTOCAP_F_SOFTWARE    CRYPTO_FLAG_SOFTWARE
 #define        CRYPTOCAP_F_SYNC        0x04000000      /* operates 
synchronously */
+#define        CRYPTOCAP_F_ACCEL_SOFTWARE 0x08000000
 extern int32_t crypto_get_driverid(device_t dev, size_t session_size,
     int flags);
 extern int crypto_find_driver(const char *);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to