From ba0a9ede4f72387f065e88c054e35dc6fdb59079 Mon Sep 17 00:00:00 2001 From: Zhiqi Song Date: Sat, 23 Jul 2022 17:10:47 +0800 Subject: [PATCH 50/57] uadk_engine: add timeout protection mechanism in poll Count the cycle times of poll. When the count times exceed the maximum number, exit to prevent the task from timeout. Signed-off-by: Zhiqi Song --- src/uadk_cipher.c | 13 ++++++++----- src/uadk_dh.c | 11 +++++++---- src/uadk_digest.c | 11 +++++++---- src/uadk_pkey.c | 13 ++++++++----- src/uadk_rsa.c | 11 +++++++---- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/uadk_cipher.c b/src/uadk_cipher.c index 472c0ad..54d0a7d 100644 --- a/src/uadk_cipher.c +++ b/src/uadk_cipher.c @@ -517,7 +517,7 @@ static int uadk_e_cipher_poll(void *ctx) do { ret = wd_cipher_poll_ctx(idx, expt, &recv); - if (recv >= expt) + if (recv == expt) return 0; else if (ret < 0 && ret != -EAGAIN) return ret; @@ -530,18 +530,21 @@ static int uadk_e_cipher_poll(void *ctx) static int uadk_e_cipher_env_poll(void *ctx) { + __u64 rx_cnt = 0; __u32 recv = 0; - /* poll one packet currently */ + /* Poll one packet currently */ int expt = 1; int ret; do { ret = wd_cipher_poll(expt, &recv); - if (ret < 0) + if (ret < 0 || recv == expt) return ret; - } while (recv < expt); + } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - return ret; + fprintf(stderr, "failed to poll msg: timeout!\n"); + + return -ETIMEDOUT; } static int uadk_e_wd_cipher_env_init(struct uacce_dev *dev) diff --git a/src/uadk_dh.c b/src/uadk_dh.c index 893b0f2..cf319e5 100644 --- a/src/uadk_dh.c +++ b/src/uadk_dh.c @@ -212,7 +212,7 @@ static int uadk_e_dh_poll(void *ctx) do { ret = wd_dh_poll_ctx(idx, expect, &recv); - if (recv >= expect) + if (recv == expect) return UADK_E_POLL_SUCCESS; else if (ret < 0 && ret != -EAGAIN) return ret; @@ -273,6 +273,7 @@ static struct dh_res_config dh_res_config = { static int uadk_e_dh_env_poll(void *ctx) { + __u64 rx_cnt = 0; __u32 recv = 0; /* Poll one packet currently */ int expt = 1; @@ -280,11 +281,13 @@ static int uadk_e_dh_env_poll(void *ctx) do { ret = wd_dh_poll(expt, &recv); - if (ret < 0) + if (ret < 0 || recv == expt) return ret; - } while (recv < expt); + } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - return ret; + fprintf(stderr, "failed to poll msg: timeout!\n"); + + return -ETIMEDOUT; } static int uadk_e_wd_dh_env_init(struct uacce_dev *dev) diff --git a/src/uadk_digest.c b/src/uadk_digest.c index 8127373..853aa39 100644 --- a/src/uadk_digest.c +++ b/src/uadk_digest.c @@ -343,7 +343,7 @@ static int uadk_e_digest_poll(void *ctx) do { ret = wd_digest_poll_ctx(CTX_ASYNC, expt, &recv); - if (recv >= expt) + if (recv == expt) return 0; else if (ret < 0 && ret != -EAGAIN) return ret; @@ -356,6 +356,7 @@ static int uadk_e_digest_poll(void *ctx) static int uadk_e_digest_env_poll(void *ctx) { + __u64 rx_cnt = 0; __u32 recv = 0; /* Poll one packet currently */ int expt = 1; @@ -363,11 +364,13 @@ static int uadk_e_digest_env_poll(void *ctx) do { ret = wd_digest_poll(expt, &recv); - if (ret < 0) + if (ret < 0 || recv == expt) return ret; - } while (recv < expt); + } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - return ret; + fprintf(stderr, "failed to poll msg: timeout!\n"); + + return -ETIMEDOUT; } static int uadk_e_wd_digest_env_init(struct uacce_dev *dev) diff --git a/src/uadk_pkey.c b/src/uadk_pkey.c index a0b74af..9a3a725 100644 --- a/src/uadk_pkey.c +++ b/src/uadk_pkey.c @@ -110,7 +110,7 @@ static int uadk_ecc_poll(void *ctx) do { ret = wd_ecc_poll_ctx(CTX_ASYNC, expt, &recv); - if (recv >= expt) + if (recv == expt) return 0; else if (ret < 0 && ret != -EAGAIN) return ret; @@ -143,18 +143,21 @@ int uadk_e_ecc_get_numa_id(void) static int uadk_e_ecc_env_poll(void *ctx) { + __u64 rx_cnt = 0; __u32 recv = 0; - /* poll one packet currently */ + /* Poll one packet currently */ int expt = 1; int ret; do { ret = wd_ecc_poll(expt, &recv); - if (ret < 0) + if (ret < 0 || recv == expt) return ret; - } while (recv < expt); + } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - return ret; + fprintf(stderr, "failed to poll msg: timeout!\n"); + + return -ETIMEDOUT; } static int uadk_e_wd_ecc_env_init(struct uacce_dev *dev) diff --git a/src/uadk_rsa.c b/src/uadk_rsa.c index 29b2521..a74343f 100644 --- a/src/uadk_rsa.c +++ b/src/uadk_rsa.c @@ -663,7 +663,7 @@ static int uadk_e_rsa_poll(void *ctx) do { ret = wd_rsa_poll_ctx(CTX_ASYNC, expt, &recv); - if (recv >= expt) + if (recv == expt) return UADK_E_POLL_SUCCESS; else if (ret < 0 && ret != -EAGAIN) return ret; @@ -689,6 +689,7 @@ static struct rsa_res_config rsa_res_config = { static int uadk_e_rsa_env_poll(void *ctx) { + __u64 rx_cnt = 0; __u32 recv = 0; /* Poll one packet currently */ int expt = 1; @@ -696,11 +697,13 @@ static int uadk_e_rsa_env_poll(void *ctx) do { ret = wd_rsa_poll(expt, &recv); - if (ret < 0) + if (ret < 0 || recv == expt) return ret; - } while (recv < expt); + } while (rx_cnt++ < ENGINE_RECV_MAX_CNT); - return ret; + fprintf(stderr, "failed to poll msg: timeout!\n"); + + return -ETIMEDOUT; } static int uadk_e_wd_rsa_env_init(struct uacce_dev *dev) -- 2.27.0