From: Weili Qian <qianweili@huawei.com> When the request is sent successfully but cnt is greater than PROV_SEND_MAX_CNT, it will be considered timeout. Modify this to first check if the operation was successful, and if it was, exit the loop and wait for the request reception to complete. Signed-off-by: Weili Qian <qianweili@huawei.com> --- src/uadk_prov_cipher.c | 22 +++++++++++++++++----- src/uadk_prov_dh.c | 7 +++++-- src/uadk_prov_digest.c | 9 ++++++--- src/uadk_prov_hmac.c | 11 +++++++---- src/uadk_prov_pkey.c | 7 +++++-- src/uadk_prov_rsa.c | 20 +++++++++++++++----- 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/uadk_prov_cipher.c b/src/uadk_prov_cipher.c index d442d3d..0c3023e 100644 --- a/src/uadk_prov_cipher.c +++ b/src/uadk_prov_cipher.c @@ -488,6 +488,7 @@ static int uadk_do_cipher_async(struct cipher_priv_ctx *priv, struct async_op *o { struct uadk_e_cb_info cb_param; int idx, ret; + int cnt = 0; if (unlikely(priv->switch_flag == UADK_DO_SOFT)) { UADK_ERR("async cipher init failed.\n"); @@ -506,18 +507,29 @@ static int uadk_do_cipher_async(struct cipher_priv_ctx *priv, struct async_op *o op->idx = idx; do { ret = wd_do_cipher_async(priv->sess, &priv->req); - if (ret < 0 && ret != -EBUSY) { - UADK_ERR("do sec cipher failed, switch to soft cipher.\n"); - async_free_poll_task(op->idx, 0); - return UADK_P_FAIL; + if (likely(!ret)) + break; + + if (ret != -EBUSY) { + UADK_ERR("failed to do cipher async\n"); + goto free_poll_task; + } + + if (unlikely(++cnt > PROV_SEND_MAX_CNT)) { + UADK_ERR("do cipher async operation timeout\n"); + goto free_poll_task; } - } while (ret == -EBUSY); + } while (true); ret = async_pause_job(priv, op, ASYNC_TASK_CIPHER); if (!ret || priv->req.state) return UADK_P_FAIL; return UADK_P_SUCCESS; + +free_poll_task: + async_free_poll_task(op->idx, 0); + return UADK_P_FAIL; } static void uadk_cipher_mutex_infork(void) diff --git a/src/uadk_prov_dh.c b/src/uadk_prov_dh.c index 2d96a1d..cf31971 100644 --- a/src/uadk_prov_dh.c +++ b/src/uadk_prov_dh.c @@ -925,7 +925,10 @@ static int uadk_prov_dh_do_crypto(struct uadk_dh_sess *dh_sess) cnt = 0; do { ret = wd_do_dh_async(dh_sess->sess, &dh_sess->req); - if (ret < 0 && ret != -EBUSY) { + if (likely(!ret)) + break; + + if (ret != -EBUSY) { UADK_ERR("failed to do dh async\n"); goto free_poll_task; } @@ -934,7 +937,7 @@ static int uadk_prov_dh_do_crypto(struct uadk_dh_sess *dh_sess) UADK_ERR("do dh async operation timeout\n"); goto free_poll_task; } - } while (ret == -EBUSY); + } while (true); ret = async_pause_job(dh_sess, &op, ASYNC_TASK_DH); if (!ret) diff --git a/src/uadk_prov_digest.c b/src/uadk_prov_digest.c index c5d1db4..aaf3061 100644 --- a/src/uadk_prov_digest.c +++ b/src/uadk_prov_digest.c @@ -625,8 +625,11 @@ static int uadk_do_digest_async(struct digest_priv_ctx *priv, struct async_op *o do { ret = wd_do_digest_async(priv->sess, &priv->req); - if (ret < 0 && ret != -EBUSY) { - UADK_ERR("do sec digest async failed.\n"); + if (likely(!ret)) + break; + + if (ret != -EBUSY) { + UADK_ERR("do digest async failed.\n"); goto free_poll_task; } @@ -634,7 +637,7 @@ static int uadk_do_digest_async(struct digest_priv_ctx *priv, struct async_op *o UADK_ERR("do digest async operation timeout.\n"); goto free_poll_task; } - } while (ret == -EBUSY); + } while (true); ret = async_pause_job(priv, op, ASYNC_TASK_DIGEST); if (!ret || priv->req.state) diff --git a/src/uadk_prov_hmac.c b/src/uadk_prov_hmac.c index 0c53d12..96da4eb 100644 --- a/src/uadk_prov_hmac.c +++ b/src/uadk_prov_hmac.c @@ -596,16 +596,19 @@ static int uadk_do_hmac_async(struct hmac_priv_ctx *priv, struct async_op *op) op->idx = idx; do { ret = wd_do_digest_async(priv->sess, &priv->req); - if (ret < 0 && ret != -EBUSY) { - UADK_ERR("do sec digest async failed.\n"); + if (likely(!ret)) + break; + + if (ret != -EBUSY) { + UADK_ERR("do hmac async failed.\n"); goto free_poll_task; } if (unlikely(++cnt > ENGINE_SEND_MAX_CNT)) { - UADK_ERR("do digest async operation timeout.\n"); + UADK_ERR("do hmac async operation timeout.\n"); goto free_poll_task; } - } while (ret == -EBUSY); + } while (true); ret = async_pause_job(priv, op, ASYNC_TASK_HMAC); if (!ret || priv->req.state) diff --git a/src/uadk_prov_pkey.c b/src/uadk_prov_pkey.c index 994ea07..2e2ca0b 100644 --- a/src/uadk_prov_pkey.c +++ b/src/uadk_prov_pkey.c @@ -407,7 +407,10 @@ int uadk_prov_ecc_crypto(handle_t sess, struct wd_ecc_req *req, void *usr) cnt = 0; do { ret = wd_do_ecc_async(sess, req); - if (ret < 0 && ret != -EBUSY) { + if (likely(!ret)) + break; + + if (ret != -EBUSY) { UADK_ERR("failed to do ecc async\n"); goto free_poll_task; } @@ -416,7 +419,7 @@ int uadk_prov_ecc_crypto(handle_t sess, struct wd_ecc_req *req, void *usr) UADK_ERR("do ecc async operation timeout\n"); goto free_poll_task; } - } while (ret == -EBUSY); + } while (true); ret = async_pause_job(usr, &op, ASYNC_TASK_ECC); if (ret == 0) diff --git a/src/uadk_prov_rsa.c b/src/uadk_prov_rsa.c index f77f718..4fe415f 100644 --- a/src/uadk_prov_rsa.c +++ b/src/uadk_prov_rsa.c @@ -335,6 +335,7 @@ int rsa_do_crypto(struct uadk_rsa_sess *rsa_sess) struct uadk_e_cb_info cb_param; struct async_op op; int idx, ret; + int cnt = 0; ret = async_setup_async_event_notification(&op); if (!ret) { @@ -361,11 +362,19 @@ int rsa_do_crypto(struct uadk_rsa_sess *rsa_sess) op.idx = idx; do { ret = wd_do_rsa_async(rsa_sess->sess, &(rsa_sess->req)); - if (ret < 0 && ret != -EBUSY) { - async_free_poll_task(op.idx, 0); - goto err; + if (likely(!ret)) + break; + + if (ret != -EBUSY) { + UADK_ERR("failed to do rsa async\n"); + goto free_poll_task; } - } while (ret == -EBUSY); + + if (unlikely(++cnt > PROV_SEND_MAX_CNT)) { + UADK_ERR("do rsa async operation timeout\n"); + goto free_poll_task; + } + } while (true); ret = async_pause_job(rsa_sess, &op, ASYNC_TASK_RSA); if (!ret) @@ -375,7 +384,8 @@ int rsa_do_crypto(struct uadk_rsa_sess *rsa_sess) return UADK_P_FAIL; return UADK_P_SUCCESS; - +free_poll_task: + async_free_poll_task(op.idx, 0); err: (void)async_clear_async_event_notification(); return UADK_P_FAIL; -- 2.43.0