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
