This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit e23dd613c91329ed9ff5cc807a7897e8132ec881
Author: makejian <[email protected]>
AuthorDate: Mon Jun 16 22:40:42 2025 +0800

    crypto/cryptodev: optimize without dynamic memory in crypto process
    
    Replace dynamic memory allocation with stack-based variables in 
cryptodev_op().
    This eliminates kmm_malloc/kmm_free overhead and simplifies error handling
    by removing the need for goto bail cleanup paths.
    
    Signed-off-by: makejian <[email protected]>
---
 crypto/crypto.c            |  59 -----------------
 crypto/cryptodev.c         | 162 ++++++++++++++-------------------------------
 include/crypto/cryptodev.h |   4 --
 3 files changed, 50 insertions(+), 175 deletions(-)

diff --git a/crypto/crypto.c b/crypto/crypto.c
index 7cefc768ad2..8766581b931 100644
--- a/crypto/crypto.c
+++ b/crypto/crypto.c
@@ -624,65 +624,6 @@ migrate:
   return 0;
 }
 
-/* Release a set of crypto descriptors. */
-
-void crypto_freereq(FAR struct cryptop *crp)
-{
-  FAR struct cryptodesc *crd;
-
-  if (crp == NULL)
-    {
-      return;
-    }
-
-  nxmutex_lock(&g_crypto_lock);
-
-  while ((crd = crp->crp_desc) != NULL)
-    {
-      crp->crp_desc = crd->crd_next;
-      kmm_free(crd);
-    }
-
-  kmm_free(crp);
-  nxmutex_unlock(&g_crypto_lock);
-}
-
-/* Acquire a set of crypto descriptors. */
-
-FAR struct cryptop *crypto_getreq(int num)
-{
-  FAR struct cryptodesc *crd;
-  FAR struct cryptop *crp;
-
-  nxmutex_lock(&g_crypto_lock);
-
-  crp = kmm_malloc(sizeof(struct cryptop));
-  if (crp == NULL)
-    {
-      nxmutex_unlock(&g_crypto_lock);
-      return NULL;
-    }
-
-  bzero(crp, sizeof(struct cryptop));
-
-  while (num--)
-    {
-      crd = kmm_calloc(1, sizeof(struct cryptodesc));
-      if (crd == NULL)
-        {
-          nxmutex_unlock(&g_crypto_lock);
-          crypto_freereq(crp);
-          return NULL;
-        }
-
-      crd->crd_next = crp->crp_desc;
-      crp->crp_desc = crd;
-    }
-
-  nxmutex_unlock(&g_crypto_lock);
-  return crp;
-}
-
 int crypto_getfeat(FAR int *featp)
 {
   extern int cryptodevallowsoft;
diff --git a/crypto/cryptodev.c b/crypto/cryptodev.c
index 9ec57d9bbef..40cf9c11d4f 100644
--- a/crypto/cryptodev.c
+++ b/crypto/cryptodev.c
@@ -390,172 +390,110 @@ bail:
 static int cryptodev_op(FAR struct csession *cse,
                         FAR struct crypt_op *cop)
 {
-  FAR struct cryptop *crp = NULL;
-  FAR struct cryptodesc *crde = NULL;
-  FAR struct cryptodesc *crda = NULL;
+  struct cryptop crp;
+  struct cryptodesc crda;
+  struct cryptodesc crde;
   int error = OK;
   uint32_t hid;
 
   /* number of requests, not logical and */
 
-  crp = crypto_getreq(cse->txform + cse->thash);
-  if (crp == NULL)
-    {
-      error = -ENOMEM;
-      goto bail;
-    }
-
+  bzero(&crp, sizeof(struct cryptop));
+  bzero(&crda, sizeof(struct cryptodesc));
+  bzero(&crde, sizeof(struct cryptodesc));
   if (cse->thash)
     {
-      crda = crp->crp_desc;
-      if (cse->txform)
-        crde = crda->crd_next;
-    }
-  else
-    {
-      if (cse->txform)
+      crp.crp_desc = &crda;
+      crda.crd_skip = 0;
+      crda.crd_len = cop->len;
+      crda.crd_inject = 0;
+
+      crda.crd_alg = cse->mac;
+      crda.crd_key = cse->mackey;
+      crda.crd_klen = cse->mackeylen * 8;
+      if (cop->flags & COP_FLAG_UPDATE)
         {
-          crde = crp->crp_desc;
+          crda.crd_flags |= CRD_F_UPDATE;
         }
       else
         {
-          error = -EINVAL;
-          goto bail;
+          crda.crd_flags &= ~CRD_F_UPDATE;
         }
     }
 
-  if (crda)
+  if (cse->txform)
     {
-      crda->crd_skip = 0;
-      crda->crd_len = cop->len;
-      crda->crd_inject = 0;
-
-      crda->crd_alg = cse->mac;
-      crda->crd_key = cse->mackey;
-      crda->crd_klen = cse->mackeylen * 8;
-      if (cop->flags & COP_FLAG_UPDATE)
+      if (cse->thash)
         {
-          crda->crd_flags |= CRD_F_UPDATE;
+          crda.crd_next = &crde;
         }
       else
         {
-          crda->crd_flags &= ~CRD_F_UPDATE;
+          crp.crp_desc = &crde;
         }
-    }
 
-  if (crde)
-    {
       if (cop->op == COP_ENCRYPT)
         {
-          crde->crd_flags |= CRD_F_ENCRYPT;
+          crde.crd_flags |= CRD_F_ENCRYPT;
         }
       else
         {
-          crde->crd_flags &= ~CRD_F_ENCRYPT;
+          crde.crd_flags &= ~CRD_F_ENCRYPT;
         }
 
-      crde->crd_len = cop->len;
-      crde->crd_inject = 0;
-      crde->crd_alg = cse->cipher;
-      crde->crd_key = cse->key;
-      crde->crd_klen = cse->keylen * 8;
+      crde.crd_len = cop->len;
+      crde.crd_inject = 0;
+      crde.crd_alg = cse->cipher;
+      crde.crd_key = cse->key;
+      crde.crd_klen = cse->keylen * 8;
     }
 
-  crp->crp_ilen = cop->len;
-  crp->crp_olen = cop->olen;
-  crp->crp_buf = cop->src;
-  crp->crp_sid = cse->sid;
-  crp->crp_opaque = cse;
+  crp.crp_ilen = cop->len;
+  crp.crp_olen = cop->olen;
+  crp.crp_buf = cop->src;
+  crp.crp_sid = cse->sid;
+  crp.crp_opaque = cse;
 
   if (cop->iv)
     {
-      if (crde == NULL)
-        {
-          error = -EINVAL;
-          goto bail;
-        }
-
-      crp->crp_iv = cop->iv;
-      crp->crp_ivlen = cop->ivlen;
+      crp.crp_iv = cop->iv;
+      crp.crp_ivlen = cop->ivlen;
     }
 
   if (cop->dst)
     {
-      if (crde == NULL)
-        {
-          error = -EINVAL;
-          goto bail;
-        }
-
-      crp->crp_dst = cop->dst;
+      crp.crp_dst = cop->dst;
     }
 
   if (cop->mac)
     {
-      if (crda == NULL)
-        {
-          error = -EINVAL;
-          goto bail;
-        }
-
-      crp->crp_mac = cop->mac;
+      crp.crp_mac = cop->mac;
     }
 
   /* try the fast path first */
 
-  crp->crp_flags = CRYPTO_F_IOV | CRYPTO_F_NOQUEUE;
-  hid = (crp->crp_sid >> 32) & 0xffffffff;
-  if (hid >= crypto_drivers_num)
-    {
-      goto dispatch;
-    }
-
-  if (crypto_drivers[hid].cc_flags & CRYPTOCAP_F_SOFTWARE)
-    {
-      goto dispatch;
-    }
-
-  if (crypto_drivers[hid].cc_process == NULL)
-    {
-      goto dispatch;
-    }
-
-  error = crypto_drivers[hid].cc_process(crp);
-  if (error)
+  crp.crp_flags = CRYPTO_F_IOV | CRYPTO_F_NOQUEUE;
+  hid = (crp.crp_sid >> 32) & 0xffffffff;
+  if (hid >= crypto_drivers_num ||
+      (crypto_drivers[hid].cc_flags & CRYPTOCAP_F_SOFTWARE) ||
+      crypto_drivers[hid].cc_process == NULL)
     {
-      /* clear error */
-
-      crp->crp_etype = 0;
-      goto dispatch;
+      crp.crp_flags = CRYPTO_F_IOV;
+      crypto_invoke(&crp);
     }
-
-  goto processed;
-dispatch:
-  crp->crp_flags = CRYPTO_F_IOV;
-  crypto_invoke(crp);
-processed:
-
-  if (crde && (cop->flags & COP_FLAG_UPDATE) == 0)
-    {
-      crde->crd_flags &= ~CRD_F_IV_EXPLICIT;
-    }
-
-  if (cse->error)
+  else
     {
-      error = cse->error;
-      goto bail;
+      error = crypto_drivers[hid].cc_process(&crp);
     }
 
-  if (crp->crp_etype != 0)
+  if ((cop->flags & COP_FLAG_UPDATE) == 0)
     {
-      error = crp->crp_etype;
-      goto bail;
+      crde.crd_flags &= ~CRD_F_IV_EXPLICIT;
     }
 
-bail:
-  if (crp)
+  if (!error && crp.crp_etype != 0)
     {
-      crypto_freereq(crp);
+      error = crp.crp_etype;
     }
 
   return error;
diff --git a/include/crypto/cryptodev.h b/include/crypto/cryptodev.h
index 762d567ff28..aaec0790dbd 100644
--- a/include/crypto/cryptodev.h
+++ b/include/crypto/cryptodev.h
@@ -445,10 +445,6 @@ int crypto_kinvoke(FAR struct cryptkop *);
 int crypto_getfeat(FAR int *);
 int crypto_driver_set_priv(uint32_t, FAR void *);
 FAR void *crypto_driver_get_priv(uint32_t);
-
-FAR struct cryptop *crypto_getreq(int);
-void crypto_freereq(FAR struct cryptop *);
-
 #ifdef CONFIG_CRYPTO_CRYPTODEV_HARDWARE
 void hwcr_init(void);
 #endif

Reply via email to