1. Modify part of the repeated code macro.
2. Add new random number generation method.
3. Add new test parameters, support test algorithm
query and address pre-step function.
Signed-off-by: Longfang Liu <liulongfang(a)huawei.com>
---
 uadk_tool/benchmark/sec_soft_benchmark.c |   7 +-
 uadk_tool/benchmark/sec_soft_benchmark.h |   1 -
 uadk_tool/benchmark/sec_uadk_benchmark.c |  65 ++++----
 uadk_tool/benchmark/sec_wd_benchmark.c   | 192 +++++++----------------
 uadk_tool/benchmark/uadk_benchmark.c     | 115 ++++++++------
 uadk_tool/benchmark/uadk_benchmark.h     |  20 ++-
 6 files changed, 167 insertions(+), 233 deletions(-)
diff --git a/uadk_tool/benchmark/sec_soft_benchmark.c b/uadk_tool/benchmark/sec_soft_benchmark.c
index 2f6bccb..a622329 100644
--- a/uadk_tool/benchmark/sec_soft_benchmark.c
+++ b/uadk_tool/benchmark/sec_soft_benchmark.c
@@ -56,11 +56,8 @@ typedef struct soft_jobs_res {
 	u32 use_engine;
 } jobs_data;
 
-#define MAX_POOL_LENTH		4096
 #define MAX_IVK_LENTH		64
 #define DEF_IVK_DATA		0xAA
-#define MAX_TRY_CNT		5000
-#define SEND_USLEEP		100
 
 static unsigned int g_thread_num;
 static unsigned int g_ctxnum;
@@ -613,7 +610,7 @@ static void *sec_soft_async_run(void *arg)
 exit_pause:
 	ASYNC_WAIT_CTX_free(waitctx);
 
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
 	return NULL;
 }
@@ -802,7 +799,7 @@ static void *sec_soft_sync_run(void *arg)
 		break;
 	}
 
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
 	return NULL;
 }
diff --git a/uadk_tool/benchmark/sec_soft_benchmark.h b/uadk_tool/benchmark/sec_soft_benchmark.h
index 8331eb5..c1374d6 100644
--- a/uadk_tool/benchmark/sec_soft_benchmark.h
+++ b/uadk_tool/benchmark/sec_soft_benchmark.h
@@ -4,6 +4,5 @@
 
 #include "uadk_benchmark.h"
 
-
 extern int sec_soft_benchmark(struct acc_option *options);
 #endif /* SEC_SOFT_BENCHMARK_H */
diff --git a/uadk_tool/benchmark/sec_uadk_benchmark.c b/uadk_tool/benchmark/sec_uadk_benchmark.c
index 6eeee12..09cd8f4 100644
--- a/uadk_tool/benchmark/sec_uadk_benchmark.c
+++ b/uadk_tool/benchmark/sec_uadk_benchmark.c
@@ -10,6 +10,8 @@
 #include "include/wd_sched.h"
 
 #define SEC_TST_PRT printf
+#define MAX_IVK_LENTH		64
+#define DEF_IVK_DATA		0xAA
 
 struct uadk_bd {
 	u8 *src;
@@ -37,18 +39,12 @@ typedef struct uadk_thread_res {
 	u32 td_id;
 } thread_data;
 
-#define MAX_POOL_LENTH		4096
-#define MAX_IVK_LENTH		64
-#define DEF_IVK_DATA		0xAA
-#define MAX_TRY_CNT		5000
-#define SEND_USLEEP		100
-
 static struct wd_ctx_config g_ctx_cfg;
 static struct wd_sched *g_sched;
 static unsigned int g_thread_num;
 static unsigned int g_ctxnum;
+static unsigned int g_prefetch;
 static unsigned int g_pktlen;
-static struct sched_params g_param;
 
 static void *cipher_async_cb(struct wd_cipher_req *req, void *data)
 {
@@ -349,6 +345,7 @@ static int sec_uadk_param_parse(thread_data *tddata, struct acc_option *options)
 static int init_ctx_config(char *alg, int subtype, int mode)
 {
 	struct uacce_dev_list *list;
+	struct sched_params param;
 	int i, max_node;
 	int ret = 0;
 
@@ -385,7 +382,7 @@ static int init_ctx_config(char *alg, int subtype, int mode)
 		break;
 	default:
 		SEC_TST_PRT("Fail to parse alg subtype!\n");
-		return -EINVAL;
+		goto out;
 	}
 	if (!g_sched) {
 		SEC_TST_PRT("Fail to alloc sched!\n");
@@ -397,12 +394,12 @@ static int init_ctx_config(char *alg, int subtype, int mode)
 		list->dev->numa_id = 0;
 
 	g_sched->name = SCHED_SINGLE;
-	g_param.numa_id = list->dev->numa_id;
-	g_param.type = 0;
-	g_param.mode = mode;
-	g_param.begin = 0;
-	g_param.end = g_ctxnum - 1;
-	ret = wd_sched_rr_instance(g_sched, &g_param);
+	param.numa_id = list->dev->numa_id;
+	param.type = 0;
+	param.mode = mode;
+	param.begin = 0;
+	param.end = g_ctxnum - 1;
+	ret = wd_sched_rr_instance(g_sched, ¶m);
 	if (ret) {
 		SEC_TST_PRT("Fail to fill sched data!\n");
 		goto out;
@@ -419,6 +416,8 @@ static int init_ctx_config(char *alg, int subtype, int mode)
 	case DIGEST_TYPE:
 		ret = wd_digest_init(&g_ctx_cfg, g_sched);
 		break;
+	default:
+		goto out;
 	}
 	if (ret) {
 		SEC_TST_PRT("Fail to cipher ctx!\n");
@@ -461,18 +460,13 @@ static void uninit_ctx_config(int subtype)
 	wd_sched_rr_release(g_sched);
 }
 
-int init_uadk_bd_pool(void)
+static int init_uadk_bd_pool(void)
 {
 	unsigned long step;
-	int fill_size;
 	int i, j;
 
 	// make the block not align to 4K
 	step = sizeof(char) * g_pktlen * 2;
-	if (g_pktlen > MAX_IVK_LENTH)
-		fill_size = MAX_IVK_LENTH;
-	else
-		fill_size = g_pktlen;
 
 	g_uadk_pool.iv = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char));
 	g_uadk_pool.key = malloc(g_thread_num * MAX_IVK_LENTH * sizeof(char));
@@ -498,7 +492,9 @@ int init_uadk_bd_pool(void)
 				if (!g_uadk_pool.pool[i].bds[j].dst)
 					goto malloc_error3;
 
-				get_rand_data(g_uadk_pool.pool[i].bds[j].src, fill_size);
+				get_rand_data(g_uadk_pool.pool[i].bds[j].src, g_pktlen);
+				if (g_prefetch)
+					get_rand_data(g_uadk_pool.pool[i].bds[j].dst, g_pktlen);
 			}
 		}
 	}
@@ -526,12 +522,13 @@ malloc_error1:
 
 	free(g_uadk_pool.iv);
 	free(g_uadk_pool.key);
+	free(g_uadk_pool.mac);
 
 	SEC_TST_PRT("init uadk bd pool alloc failed!\n");
 	return -ENOMEM;
 }
 
-void free_uadk_bd_pool(void)
+static void free_uadk_bd_pool(void)
 {
 	int i, j;
 
@@ -550,21 +547,22 @@ void free_uadk_bd_pool(void)
 
 	free(g_uadk_pool.iv);
 	free(g_uadk_pool.key);
+	free(g_uadk_pool.mac);
 }
 
 /*-------------------------------uadk benchmark main code-------------------------------------*/
 
-void *sec_uadk_poll(void *data)
+static void *sec_uadk_poll(void *data)
 {
 	typedef int (*poll_ctx)(__u32 idx, __u32 expt, __u32 *count);
 	poll_ctx uadk_poll_ctx = NULL;
 	thread_data *pdata = (thread_data *)data;
 	u32 expt = ACC_QUEUE_SIZE * g_thread_num;
 	u32 id = pdata->td_id;
-	u32 last_time = 2; /* poll need one more recv time */
+	u32 last_time = 2; // poll need one more recv time
 	u32 count = 0;
 	u32 recv = 0;
-	int ret;
+	int  ret;
 
 	if (id > g_ctxnum)
 		return NULL;
@@ -586,7 +584,6 @@ void *sec_uadk_poll(void *data)
 
 	while (last_time) {
 		ret = uadk_poll_ctx(id, expt, &recv);
-		// SEC_TST_PRT("expt %u, poll %d recv: %u!\n", expt, i, recv);
 		count += recv;
 		recv = 0;
 		if (unlikely(ret != -WD_EAGAIN && ret < 0)) {
@@ -599,7 +596,7 @@ void *sec_uadk_poll(void *data)
 	}
 
 recv_error:
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
 	return NULL;
 }
@@ -636,7 +633,6 @@ static void *sec_uadk_async_run(void *arg)
 	case CIPHER_TYPE:
 		cipher_setup.alg = pdata->alg;
 		cipher_setup.mode = pdata->mode;
-		cipher_setup.sched_param = (void *)&g_param;
 		h_sess = wd_cipher_alloc_sess(&cipher_setup);
 		if (!h_sess)
 			return NULL;
@@ -682,7 +678,6 @@ static void *sec_uadk_async_run(void *arg)
 	case AEAD_TYPE: // just ccm and gcm
 		aead_setup.calg = pdata->alg;
 		aead_setup.cmode = pdata->mode;
-		aead_setup.sched_param = (void *)&g_param;
 		h_sess = wd_aead_alloc_sess(&aead_setup);
 		if (!h_sess)
 			return NULL;
@@ -740,7 +735,6 @@ static void *sec_uadk_async_run(void *arg)
 	case DIGEST_TYPE:
 		digest_setup.alg = pdata->alg;
 		digest_setup.mode = pdata->mode; // digest mode is optype
-		digest_setup.sched_param = (void *)&g_param;
 		h_sess = wd_digest_alloc_sess(&digest_setup);
 		if (!h_sess)
 			return NULL;
@@ -820,7 +814,6 @@ static void *sec_uadk_sync_run(void *arg)
 	case CIPHER_TYPE:
 		cipher_setup.alg = pdata->alg;
 		cipher_setup.mode = pdata->mode;
-		cipher_setup.sched_param = (void *)&g_param;
 		h_sess = wd_cipher_alloc_sess(&cipher_setup);
 		if (!h_sess)
 			return NULL;
@@ -845,7 +838,7 @@ static void *sec_uadk_sync_run(void *arg)
 			creq.src = uadk_pool->bds[i].src;
 			creq.dst = uadk_pool->bds[i].dst;
 			ret = wd_do_cipher_sync(h_sess, &creq);
-			if (ret || creq.state)
+			if ((ret < 0 && ret != -WD_EBUSY) || creq.state)
 				break;
 			count++;
 			if (get_run_state() == 0)
@@ -856,7 +849,6 @@ static void *sec_uadk_sync_run(void *arg)
 	case AEAD_TYPE: // just ccm and gcm
 		aead_setup.calg = pdata->alg;
 		aead_setup.cmode = pdata->mode;
-		aead_setup.sched_param = (void *)&g_param;
 		h_sess = wd_aead_alloc_sess(&aead_setup);
 		if (!h_sess)
 			return NULL;
@@ -905,7 +897,6 @@ static void *sec_uadk_sync_run(void *arg)
 	case DIGEST_TYPE:
 		digest_setup.alg = pdata->alg;
 		digest_setup.mode = pdata->mode; // digest mode is optype
-		digest_setup.sched_param = (void *)&g_param;
 		h_sess = wd_digest_alloc_sess(&digest_setup);
 		if (!h_sess)
 			return NULL;
@@ -939,7 +930,7 @@ static void *sec_uadk_sync_run(void *arg)
 		break;
 	}
 
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
 	return NULL;
 }
@@ -982,7 +973,6 @@ int sec_uadk_sync_threads(struct acc_option *options)
 
 sync_error:
 	return ret;
-
 }
 
 int sec_uadk_async_threads(struct acc_option *options)
@@ -998,10 +988,10 @@ int sec_uadk_async_threads(struct acc_option *options)
 	if (ret)
 		return ret;
 
-	/* poll thread */
 	for (i = 0; i < g_ctxnum; i++) {
 		threads_args[i].subtype = threads_option.subtype;
 		threads_args[i].td_id = i;
+		/* poll thread */
 		ret = pthread_create(&pollid[i], NULL, sec_uadk_poll, &threads_args[i]);
 		if (ret) {
 			SEC_TST_PRT("Create poll thread fail!\n");
@@ -1053,6 +1043,7 @@ int sec_uadk_benchmark(struct acc_option *options)
 	g_thread_num = options->threads;
 	g_pktlen = options->pktlen;
 	g_ctxnum = options->ctxnums;
+	g_prefetch = options->prefetch;
 	if (options->optype > WD_CIPHER_DECRYPTION) {
 		SEC_TST_PRT("SEC optype error: %u\n", options->optype);
 		return -EINVAL;
diff --git a/uadk_tool/benchmark/sec_wd_benchmark.c b/uadk_tool/benchmark/sec_wd_benchmark.c
index 2e9c55d..d7cfe75 100644
--- a/uadk_tool/benchmark/sec_wd_benchmark.c
+++ b/uadk_tool/benchmark/sec_wd_benchmark.c
@@ -11,6 +11,9 @@
 #include "v1/wd_util.h"
 
 #define SEC_TST_PRT printf
+#define MAX_IVK_LENTH		64
+#define DEF_IVK_DATA		0xAA
+#define SQE_SIZE		128
 
 typedef struct wd_thread_res {
 	u32 subtype;
@@ -32,57 +35,31 @@ struct thread_bd_res {
 
 struct thread_queue_res {
 	struct thread_bd_res *bd_res;
-} g_thread_queue;
+};
 
 struct wcrypto_async_tag {
 	void *ctx;
-	char *out_buf;
 	int thread_id;
 	int cnt;
 };
 
-#define MAX_IVK_LENTH		64
-#define DEF_IVK_DATA		0xAA
-#define MAX_TRY_CNT		5000
-#define SEND_USLEEP		100
-#define TEST_MAX_THRD		128
-#define SQE_SIZE		128
-#define MAX_BLOCK_NM		4096
-
+static struct thread_queue_res g_thread_queue;
 static unsigned int g_thread_num;
-static unsigned int g_ctxnum;
 static unsigned int g_pktlen;
 
 static void *cipher_async_cb(void *message, void *cipher_tag)
 {
-	struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)cipher_tag;
-	struct wcrypto_cipher_msg *req = (struct wcrypto_cipher_msg *)message;
-
-	// no-sva data copy from uadk to user
-	memcpy(async_tag->out_buf, req->out, g_pktlen);
-
 	return NULL;
 }
 
-static void *aead_async_cb(void *message, void *aead_tag)
+static void *aead_async_cb(void *message, void *cipher_tag)
 {
-	struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)aead_tag;
-	struct wcrypto_aead_msg *req = (struct wcrypto_aead_msg *)message;
-
-	// no-sva data copy from uadk to user
-	memcpy(async_tag->out_buf, req->out, g_pktlen);
-
 	return NULL;
 }
 
 static void *digest_async_cb(void *message, void *digest_tag)
 {
-	struct wcrypto_async_tag *async_tag = (struct wcrypto_async_tag *)digest_tag;
-	struct wcrypto_digest_msg *req = (struct wcrypto_digest_msg *)message;
-
-	// no-sva data copy from uadk to user
-	memcpy(async_tag->out_buf, req->out, 16);
-
+	// struct WCRYPTO_req *req = (struct WCRYPTO_req *)data;
 	return NULL;
 }
 
@@ -396,9 +373,9 @@ static int init_wd_queue(struct acc_option *options)
 	// use no-sva pbuffer
 	memset(&blksetup, 0, sizeof(blksetup));
 	blksetup.block_size = g_pktlen + SQE_SIZE; //aead need mac and aad out
-	blksetup.block_num = MAX_BLOCK_NM * 4; //set pool  inv + key + in + out
+	blksetup.block_num = MAX_BLOCK_NM; //set pool  inv + key + in + out
 	blksetup.align_size = SQE_SIZE;
-	SEC_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10);
+	// SEC_TST_PRT("create pool memory: %d KB\n", (MAX_BLOCK_NM * blksetup.block_size) >> 10);
 
 	for (j = 0; j < g_thread_num; j++) {
 		g_thread_queue.bd_res[j].pool = wd_blkpool_create(g_thread_queue.bd_res[j].queue, &blksetup);
@@ -411,8 +388,8 @@ static int init_wd_queue(struct acc_option *options)
 
 	// alloc in pbuffer res
 	for (m = 0; m < g_thread_num; m++) {
-		g_thread_queue.bd_res[m].in = malloc(MAX_BLOCK_NM * sizeof(void *));
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++) {
+		g_thread_queue.bd_res[m].in = malloc(MAX_POOL_LENTH * sizeof(void *));
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++) {
 			g_thread_queue.bd_res[m].in[idx] = wd_alloc_blk(g_thread_queue.bd_res[m].pool);
 			if (!g_thread_queue.bd_res[m].in[idx]) {
 				SEC_TST_PRT("create pool %dth in memory fail!\n", m);
@@ -427,8 +404,8 @@ static int init_wd_queue(struct acc_option *options)
 
 	// alloc out pbuffer res
 	for (n = 0; n < g_thread_num; n++) {
-		g_thread_queue.bd_res[n].out = malloc(MAX_BLOCK_NM * sizeof(void *));
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++) {
+		g_thread_queue.bd_res[n].out = malloc(MAX_POOL_LENTH * sizeof(void *));
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++) {
 			g_thread_queue.bd_res[n].out[idx] = wd_alloc_blk(g_thread_queue.bd_res[n].pool);
 			if (!g_thread_queue.bd_res[n].out[idx]) {
 				SEC_TST_PRT("create pool %dth out memory fail!\n", n);
@@ -443,8 +420,8 @@ static int init_wd_queue(struct acc_option *options)
 
 	// alloc iv pbuffer res
 	for (k = 0; k < g_thread_num; k++) {
-		g_thread_queue.bd_res[k].iv = malloc(MAX_BLOCK_NM * sizeof(void *));
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++) {
+		g_thread_queue.bd_res[k].iv = malloc(MAX_POOL_LENTH * sizeof(void *));
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++) {
 			g_thread_queue.bd_res[k].iv[idx] = wd_alloc_blk(g_thread_queue.bd_res[k].pool);
 			if (!g_thread_queue.bd_res[k].iv[idx]) {
 				SEC_TST_PRT("create pool %dth iv memory fail!\n", k);
@@ -462,21 +439,21 @@ static int init_wd_queue(struct acc_option *options)
 
 iv_err:
 	for (k--; k >= 0; k--) {
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++)
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++)
 			wd_free_blk(g_thread_queue.bd_res[k].pool,
 					g_thread_queue.bd_res[k].iv[idx]);
 		free(g_thread_queue.bd_res[k].iv);
 	}
 out_err:
 	for (n--; n >= 0; n--) {
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++)
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++)
 			wd_free_blk(g_thread_queue.bd_res[n].pool,
 					g_thread_queue.bd_res[n].out[idx]);
 		free(g_thread_queue.bd_res[n].out);
 	}
 in_err:
 	for (m--; m >= 0; m--) {
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++)
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++)
 			wd_free_blk(g_thread_queue.bd_res[m].pool,
 					g_thread_queue.bd_res[m].in[idx]);
 		free(g_thread_queue.bd_res[m].in);
@@ -498,7 +475,7 @@ static void uninit_wd_queue(void)
 	int i, j, idx;
 
 	for (i = 0; i < g_thread_num; i++) {
-		for (idx = 0; idx < MAX_BLOCK_NM; idx++) {
+		for (idx = 0; idx < MAX_POOL_LENTH; idx++) {
 			wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].iv[idx]);
 			wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].in[idx]);
 			wd_free_blk(g_thread_queue.bd_res[i].pool, g_thread_queue.bd_res[i].out[idx]);
@@ -522,22 +499,22 @@ void *sec_wd_poll(void *data)
 {
 	typedef int (*poll_ctx)(struct wd_queue *q, unsigned int num);
 	thread_data *pdata = (thread_data *)data;
-	poll_ctx uadk_poll_ctx = NULL;
+	poll_ctx wd_poll_ctx = NULL;
 	u32 expt = ACC_QUEUE_SIZE * g_thread_num;
-	u32 last_time = 2; /* poll need one more recv time */
+	u32 last_time = 2; // poll need one more recv time
 	u32 id = pdata->td_id;
 	u32 count = 0;
-	u32 recv = 0;
+	int recv = 0;
 
 	switch(pdata->subtype) {
 	case CIPHER_TYPE:
-		uadk_poll_ctx = wcrypto_cipher_poll;
+		wd_poll_ctx = wcrypto_cipher_poll;
 		break;
 	case AEAD_TYPE:
-		uadk_poll_ctx = wcrypto_aead_poll;
+		wd_poll_ctx = wcrypto_aead_poll;
 		break;
 	case DIGEST_TYPE:
-		uadk_poll_ctx = wcrypto_digest_poll;
+		wd_poll_ctx = wcrypto_digest_poll;
 		break;
 	default:
 		SEC_TST_PRT("<<<<<<async poll interface is NULL!\n");
@@ -548,7 +525,7 @@ void *sec_wd_poll(void *data)
 		return NULL;
 
 	while (last_time) {
-		recv = uadk_poll_ctx(g_thread_queue.bd_res[id].queue, expt);
+		recv = wd_poll_ctx(g_thread_queue.bd_res[id].queue, expt);
 		/*
 		 * warpdrive async mode poll easy to 100% with small package.
 		 * SEC_TST_PRT("warpdrive poll %d recv: %u!\n", i, recv);
@@ -565,7 +542,7 @@ void *sec_wd_poll(void *data)
 	}
 
 recv_error:
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
 	return NULL;
 }
@@ -582,8 +559,6 @@ static void *sec_wd_async_run(void *arg)
 	struct wcrypto_async_tag *tag = NULL;
 	char priv_key[MAX_IVK_LENTH];
 	struct thread_bd_res *bd_res;
-	char *src_data_buf = NULL;
-	char *out_data_buf = NULL;
 	struct wd_queue *queue;
 	void *ctx = NULL;
 	void **res_in;
@@ -605,27 +580,13 @@ static void *sec_wd_async_run(void *arg)
 	res_out = bd_res->out;
 	res_iv = bd_res->iv;
 
-	/* create user data buffer */
-	src_data_buf = malloc(g_pktlen * sizeof(char));
-	if (!src_data_buf)
-		return NULL;
-
-	get_rand_data((u8 *)src_data_buf, g_pktlen);
-	out_data_buf = malloc(g_pktlen * sizeof(char));
-	if (!out_data_buf) {
-		free(src_data_buf);
-		return NULL;
-	}
-
 	memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
 	tag = malloc(sizeof(struct wcrypto_async_tag)); // set the user tag
 	if (!tag) {
 		SEC_TST_PRT("wcrypto async alloc tag fail!\n");
-		free(src_data_buf);
-		free(out_data_buf);
 		return NULL;
 	}
-	tag->out_buf = out_data_buf;
+	tag->thread_id = pdata->td_id;
 
 	switch(pdata->subtype) {
 	case CIPHER_TYPE:
@@ -642,7 +603,7 @@ static void *sec_wd_async_run(void *arg)
 		ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create cipher ctx fail!\n");
-			goto async_err;
+			return NULL;
 		}
 		tag->ctx = ctx;
 
@@ -650,7 +611,7 @@ static void *sec_wd_async_run(void *arg)
 		if (ret) {
 			SEC_TST_PRT("wd cipher set key fail!\n");
 			wcrypto_del_cipher_ctx(ctx);
-			goto async_err;
+			return NULL;
 		}
 
 		if (queue->capa.priv.direction == 0)
@@ -672,9 +633,6 @@ static void *sec_wd_async_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(copdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_cipher(ctx, &copdata, (void *)tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -687,7 +645,7 @@ static void *sec_wd_async_run(void *arg)
 			}
 
 			count++;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			tag->cnt = i;
 			try_cnt = 0;
 			copdata.in = res_in[i];
@@ -710,7 +668,7 @@ static void *sec_wd_async_run(void *arg)
 		ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create aead ctx fail!\n");
-			goto async_err;
+			return NULL;
 		}
 		tag->ctx = ctx;
 
@@ -718,7 +676,7 @@ static void *sec_wd_async_run(void *arg)
 		if (ret) {
 			SEC_TST_PRT("wd aead set key fail!\n");
 			wcrypto_del_aead_ctx(ctx);
-			goto async_err;
+			return NULL;
 		}
 
 		authsize = 16; //set defaut size
@@ -726,7 +684,7 @@ static void *sec_wd_async_run(void *arg)
 		if (ret) {
 			SEC_TST_PRT("set authsize fail!\n");
 			wcrypto_del_aead_ctx(ctx);
-			goto async_err;
+			return NULL;
 		}
 
 		if (queue->capa.priv.direction == 0) {
@@ -753,9 +711,6 @@ static void *sec_wd_async_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(aopdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_aead(ctx, &aopdata, (void *)tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -768,7 +723,7 @@ static void *sec_wd_async_run(void *arg)
 			}
 
 			count++;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			tag->cnt = i;
 			try_cnt = 0;
 			aopdata.in = res_in[i];
@@ -791,7 +746,7 @@ static void *sec_wd_async_run(void *arg)
 		ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create digest ctx fail!\n");
-			goto async_err;
+			return NULL;
 		}
 		tag->ctx = ctx;
 
@@ -801,7 +756,7 @@ static void *sec_wd_async_run(void *arg)
 			if (ret) {
 				SEC_TST_PRT("wd digest set key fail!\n");
 				wcrypto_del_digest_ctx(ctx);
-				goto async_err;
+				return NULL;
 			}
 		}
 
@@ -818,9 +773,6 @@ static void *sec_wd_async_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(dopdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -833,7 +785,7 @@ static void *sec_wd_async_run(void *arg)
 			}
 
 			count++;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			tag->cnt = i;
 			try_cnt = 0;
 			dopdata.in = res_in[i];
@@ -846,7 +798,7 @@ static void *sec_wd_async_run(void *arg)
 	add_send_complete();
 
 	while (1) {
-		if (get_recv_time() == g_thread_num) // wait Async mode finish recv
+		if (get_recv_time() > 0) // wait Async mode finish recv
 			break;
 		usleep(SEND_USLEEP);
 	}
@@ -863,10 +815,6 @@ static void *sec_wd_async_run(void *arg)
 		break;
 	}
 
-async_err:
-	free(tag);
-	free(src_data_buf);
-	free(out_data_buf);
 	return NULL;
 }
 
@@ -882,8 +830,6 @@ static void *sec_wd_sync_run(void *arg)
 	char priv_key[MAX_IVK_LENTH];
 	struct thread_bd_res *bd_res;
 	struct wd_queue *queue;
-	char *src_data_buf = NULL;
-	char *out_data_buf = NULL;
 	void *ctx = NULL;
 	void *tag = NULL;
 	void **res_in;
@@ -905,18 +851,6 @@ static void *sec_wd_sync_run(void *arg)
 	res_out = bd_res->out;
 	res_iv = bd_res->iv;
 
-	/* create user data buffer */
-	src_data_buf = malloc(g_pktlen * sizeof(char));
-	if (!src_data_buf)
-		return NULL;
-
-	get_rand_data((u8 *)src_data_buf, g_pktlen);
-	out_data_buf = malloc(g_pktlen * sizeof(char));
-	if (!out_data_buf) {
-		free(src_data_buf);
-		return NULL;
-	}
-
 	memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
 
 	switch(pdata->subtype) {
@@ -933,14 +867,14 @@ static void *sec_wd_sync_run(void *arg)
 		ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create cipher ctx fail!\n");
-			goto sync_err;
+			return NULL;
 		}
 
 		ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
 		if (ret) {
 			SEC_TST_PRT("wd cipher set key fail!\n");
 			wcrypto_del_cipher_ctx(ctx);
-			goto sync_err;
+			return NULL;
 		}
 
 		if (queue->capa.priv.direction == 0)
@@ -961,9 +895,6 @@ static void *sec_wd_sync_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(copdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_cipher(ctx, &copdata, tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -977,13 +908,10 @@ static void *sec_wd_sync_run(void *arg)
 
 			count++;
 			try_cnt = 0;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			copdata.in = res_in[i];
 			copdata.out   = res_out[i];
 			copdata.iv = res_iv[i];
-
-			// no-sva data copy from uadk to user
-			memcpy(out_data_buf, copdata.out, g_pktlen);
 		}
 		wcrypto_del_cipher_ctx(ctx);
 
@@ -1001,14 +929,14 @@ static void *sec_wd_sync_run(void *arg)
 		ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create aead ctx fail!\n");
-			goto sync_err;
+			return NULL;
 		}
 
 		ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
 		if (ret) {
 			SEC_TST_PRT("wd aead set key fail!\n");
 			wcrypto_del_aead_ctx(ctx);
-			goto sync_err;
+			return NULL;
 		}
 
 		authsize = 16; //set defaut size
@@ -1016,7 +944,7 @@ static void *sec_wd_sync_run(void *arg)
 		if (ret) {
 			SEC_TST_PRT("set authsize fail!\n");
 			wcrypto_del_aead_ctx(ctx);
-			goto sync_err;
+			return NULL;
 		}
 
 		if (queue->capa.priv.direction == 0) {
@@ -1042,9 +970,6 @@ static void *sec_wd_sync_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(aopdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_aead(ctx, &aopdata, tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -1058,13 +983,10 @@ static void *sec_wd_sync_run(void *arg)
 
 			count++;
 			try_cnt = 0;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			aopdata.in = res_in[i];
 			aopdata.out   = res_out[i];
 			aopdata.iv = res_iv[i];
-
-			// no-sva data copy from uadk to user
-			memcpy(out_data_buf, aopdata.out, g_pktlen);
 		}
 		wcrypto_del_aead_ctx(ctx);
 
@@ -1082,7 +1004,7 @@ static void *sec_wd_sync_run(void *arg)
 		ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
 		if (!ctx) {
 			SEC_TST_PRT("wd create digest ctx fail!\n");
-			goto sync_err;
+			return NULL;
 		}
 
 		if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) {
@@ -1091,7 +1013,7 @@ static void *sec_wd_sync_run(void *arg)
 			if (ret) {
 				SEC_TST_PRT("wd digest set key fail!\n");
 				wcrypto_del_digest_ctx(ctx);
-				goto sync_err;
+				return NULL;
 			}
 		}
 
@@ -1107,9 +1029,6 @@ static void *sec_wd_sync_run(void *arg)
 			if (get_run_state() == 0)
 				break;
 
-			// no-sva data copy to uadk
-			memcpy(dopdata.in, src_data_buf, g_pktlen);
-
 			ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
 			if (ret == -WD_EBUSY) {
 				usleep(SEND_USLEEP * try_cnt);
@@ -1123,22 +1042,16 @@ static void *sec_wd_sync_run(void *arg)
 
 			count++;
 			try_cnt = 0;
-			i = count % MAX_BLOCK_NM;
+			i = count % MAX_POOL_LENTH;
 			dopdata.in = res_in[i];
-			dopdata.out = res_out[i];
-
-			// no-sva data copy from uadk to user
-			memcpy(out_data_buf, dopdata.out, 16);
+			dopdata.out   = res_out[i];
 		}
 		wcrypto_del_digest_ctx(ctx);
 		break;
 	}
 
-	add_recv_data(count);
+	add_recv_data(count, g_pktlen);
 
-sync_err:
-	free(src_data_buf);
-	free(out_data_buf);
 	return NULL;
 }
 
@@ -1180,6 +1093,7 @@ int sec_wd_sync_threads(struct acc_option *options)
 
 sync_error:
 	return ret;
+
 }
 
 int sec_wd_async_threads(struct acc_option *options)
@@ -1249,7 +1163,6 @@ int sec_wd_benchmark(struct acc_option *options)
 
 	g_thread_num = options->threads;
 	g_pktlen = options->pktlen;
-	g_ctxnum = options->ctxnums;
 	if (options->optype > WCRYPTO_CIPHER_DECRYPTION) {
 		SEC_TST_PRT("SEC optype error: %u\n", options->optype);
 		return -EINVAL;
@@ -1273,3 +1186,4 @@ int sec_wd_benchmark(struct acc_option *options)
 
 	return 0;
 }
+
diff --git a/uadk_tool/benchmark/uadk_benchmark.c b/uadk_tool/benchmark/uadk_benchmark.c
index 84941d5..2904cba 100644
--- a/uadk_tool/benchmark/uadk_benchmark.c
+++ b/uadk_tool/benchmark/uadk_benchmark.c
@@ -10,19 +10,19 @@
 
 #define BYTES_TO_KB	10
 #define TABLE_SPACE_SIZE	8
-#define ARRAY_SIZE(x)		(sizeof(x) / sizeof((x)[0]))
 
 /*----------------------------------------head struct--------------------------------------------------------*/
 static unsigned int g_run_state = 1;
 static pthread_mutex_t acc_mutex = PTHREAD_MUTEX_INITIALIZER;
 static struct _recv_data {
+	double pkg_len;
 	u64 send_cnt;
 	u64 recv_cnt;
 	u32 send_times;
 	u32 recv_times;
 } g_recv_data;
 
-/* SVA mode and NOSVA mode change need re_insmode driver ko */
+/* SVA mode and NOSVA mode change need re_insmod driver ko */
 enum test_type {
 	SVA_MODE = 0x1,
 	NOSVA_MODE = 0x2,
@@ -63,7 +63,7 @@ static struct acc_alg_item alg_options[] = {
 	{"rsa-2048-crt", RSA_2048_CRT},
 	{"rsa-3072-crt", RSA_3072_CRT},
 	{"rsa-4096-crt", RSA_4096_CRT},
-	{"dh-768 ", DH_768},
+	{"dh-768", DH_768},
 	{"dh-1024",    DH_1024},
 	{"dh-1536",    DH_1536},
 	{"dh-2048", DH_2048},
@@ -131,10 +131,14 @@ void add_send_complete(void)
 	__atomic_add_fetch(&g_recv_data.send_times, 1, __ATOMIC_RELAXED);
 }
 
-void add_recv_data(u32 cnt)
+void add_recv_data(u32 cnt, u32 pkglen)
 {
 	pthread_mutex_lock(&acc_mutex);
 	g_recv_data.recv_cnt += cnt;
+	if (g_recv_data.pkg_len == 0)
+		g_recv_data.pkg_len = pkglen;
+	else
+		g_recv_data.pkg_len = ((double)pkglen + g_recv_data.pkg_len) / 2;
 	g_recv_data.recv_times++;
 	pthread_mutex_unlock(&acc_mutex);
 }
@@ -148,6 +152,7 @@ void init_recv_data(void)
 {
 	g_recv_data.send_cnt = 0;
 	g_recv_data.recv_cnt = 0;
+	g_recv_data.pkg_len = 0.0;
 	g_recv_data.send_times = 0;
 	g_recv_data.recv_times = 0;
 }
@@ -263,28 +268,21 @@ void time_start(u32 seconds)
 	alarm(seconds);
 }
 
-int get_rand_int(int range)
-{
-	int randnum;
-
-	if (range <= 0) {
-		ACC_TST_PRT("rand range error!\n");
-		return 1;
-	}
-	srand((unsigned)time(NULL) * getpid());
-	randnum = rand() % range;
-
-	return randnum;
-}
-
-void get_rand_data(u8 *addr, int size)
+void get_rand_data(u8 *addr, u32 size)
 {
+	unsigned short rand_state[3] = {
+		(0xae >> 16) & 0xffff, 0xae & 0xffff, 0x330e};
 	int i;
 
-	srand((unsigned)time(NULL) * getpid());
-	for (i = 0; i < size; i++) {
-		addr[i] = rand() % 0xFF;
-	}
+#if 1
+	// only 32bit valid, other 32bit is zero
+	for (i = 0; i < size >> 3; i++)
+		*((u64 *)addr + i) = nrand48(rand_state);
+#else
+	// full 64bit valid
+	for (i = 0; i < size >> 2; i++)
+		*((u32 *)addr + i) = nrand48(rand_state);
+#endif
 }
 
 /*-------------------------------------main code------------------------------------------------------*/
@@ -320,7 +318,7 @@ static void parse_alg_param(struct acc_option *option)
 	case X25519_ALG:
 		snprintf(option->algclass, MAX_ALG_NAME, "%s", "x25519");
 		option->acctype = HPRE_TYPE;
-		option->subtype = X22519_TYPE;
+		option->subtype = X25519_TYPE;
 		break;
 	case X448_ALG:
 		snprintf(option->algclass, MAX_ALG_NAME, "%s", "x448");
@@ -366,8 +364,8 @@ void cal_perfermance_data(struct acc_option *option, u32 sttime)
 	double perfermance;
 	double cpu_rate;
 	u32 ttime = 1000;
-	u32 perfdata;
-	u32 perfops;
+	double perfdata;
+	double perfops;
 	double ops;
 	u32 ptime;
 	int i, len;
@@ -397,13 +395,13 @@ void cal_perfermance_data(struct acc_option *option, u32 sttime)
 		palgname[i] = '\0';
 
 	ptime = ptime - sttime;
-	perfdata = (g_recv_data.recv_cnt * option->pktlen) >> BYTES_TO_KB;
-	perfops = (g_recv_data.recv_cnt) >> BYTES_TO_KB;
-	perfermance = (double)perfdata / option->times;
-	ops = (double)perfops / option->times;
+	perfdata = g_recv_data.pkg_len * g_recv_data.recv_cnt / 1024.0;
+	perfops = (double)(g_recv_data.recv_cnt) / 1000.0;
+	perfermance = perfdata / option->times;
+	ops = perfops / option->times;
 	cpu_rate = (double)ptime / option->times;
 	ACC_TST_PRT("algname:	length:		perf:		iops:		CPU_rate:\n"
-			"%s	%uBytes	%.1fKB/s	%.1fKops 	%.2f%%\n",
+			"%s	%-2uBytes 	%.1fKB/s 	%.1fKops 	%.2f%%\n",
 			palgname, option->pktlen, perfermance, ops, cpu_rate);
 }
 
@@ -419,11 +417,11 @@ static int benchmark_run(struct acc_option *option)
 			ret = sec_wd_benchmark(option);
 		}
 		usleep(20000);
-		#ifdef WITH_OPENSSL_DIR
+#ifdef WITH_OPENSSL_DIR
 		if (option->modetype & SOFT_MODE) {
 			ret = sec_soft_benchmark(option);
 		}
-		#endif
+#endif
 		break;
 	case HPRE_TYPE:
 		break;
@@ -447,6 +445,7 @@ static void dump_param(struct acc_option *option)
 	ACC_TST_PRT("    [--ctxnum]:  %u\n", option->ctxnums);
 	ACC_TST_PRT("    [--algclass]:%s\n", option->algclass);
 	ACC_TST_PRT("    [--acctype]: %u\n", option->acctype);
+	ACC_TST_PRT("    [--prefetch]:%u\n", option->prefetch);
 	ACC_TST_PRT("    [--engine]:  %s\n", option->engine);
 }
 
@@ -457,6 +456,7 @@ int acc_benchmark_run(struct acc_option *option)
 	int i, ret = 0;
 	int status;
 
+	ACC_TST_PRT("start UADK benchmark test.\n");
 	parse_alg_param(option);
 	dump_param(option);
 
@@ -558,13 +558,27 @@ static void print_help(void)
 	ACC_TST_PRT("        set the number of threads\n");
 	ACC_TST_PRT("    [--ctxnum]:\n");
 	ACC_TST_PRT("        the number of QP queues used by the entire test task\n");
+	ACC_TST_PRT("    [--prefetch]:\n");
+	ACC_TST_PRT("        in SVA mode, Enable prefetch can reduce page faults and improve performance\n");
 	ACC_TST_PRT("    [--engine]:\n");
 	ACC_TST_PRT("        set the test openssl engine\n");
+	ACC_TST_PRT("    [--alglist]:\n");
+	ACC_TST_PRT("        list the all support alg\n");
 	ACC_TST_PRT("    [--help]  = usage\n");
 	ACC_TST_PRT("Example\n");
 	ACC_TST_PRT("    ./uadk_tool benchmark --alg aes-128-cbc --mode sva --opt 0 --sync\n");
 	ACC_TST_PRT("    	     --pktlen 1024 --seconds 1 --multi 1 --thread 1 --ctxnum 4\n");
-	ACC_TST_PRT("UPDATE:2021-7-28\n");
+	ACC_TST_PRT("UPDATE:2022-7-18\n");
+}
+
+static void print_support_alg(void)
+{
+	int i;
+
+	ACC_TST_PRT("UADK benchmark supported ALG:\n");
+	for (i = 0; i < ALG_MAX; i++) {
+		ACC_TST_PRT("%s\n", alg_options[i].name);
+	}
 }
 
 int acc_cmd_parse(int argc, char *argv[], struct acc_option *option)
@@ -583,8 +597,10 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option)
 		{"thread",    required_argument, 0, 9},
 		{"multi",     required_argument, 0, 10},
 		{"ctxnum",    required_argument, 0, 11},
-		{"engine",    required_argument, 0, 12},
-		{"help",      no_argument,       0, 13},
+		{"prefetch",     no_argument,    0, 12},
+		{"engine",    required_argument, 0, 13},
+		{"alglist",      no_argument,    0, 14},
+		{"help",      no_argument,       0, 15},
 		{0, 0, 0, 0}
 	};
 
@@ -593,7 +609,6 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option)
 		if (c == -1)
 			break;
 
-		// ACC_TST_PRT("index:%d , optarg name:%s\n", c, optarg);
 		switch (c) {
 		case 2:
 			option->algtype = get_alg_type(optarg);
@@ -627,26 +642,36 @@ int acc_cmd_parse(int argc, char *argv[], struct acc_option *option)
 			option->ctxnums = strtol(optarg, NULL, 0);
 			break;
 		case 12:
-			strcpy(option->engine, optarg);
+			option->prefetch = 1;
 			break;
 		case 13:
-			print_help();
+			strcpy(option->engine, optarg);
 			break;
+		case 14:
+			print_support_alg();
+			goto to_exit;
+		case 15:
+			print_help();
+			goto to_exit;
 		default:
 			ACC_TST_PRT("bad input test parameter!\n");
 			print_help();
-			exit(-1);
+			goto to_exit;
 		}
 	}
+
 	return 0;
+
+to_exit:
+	return -EINVAL;
 }
 
 int acc_option_convert(struct acc_option *option)
 {
-	if (option->algtype >= ALG_MAX)
+	if (option->algtype >= ALG_MAX) {
+		ACC_TST_PRT("invalid: input algname is wrong!\n");
 		goto param_err;
-	else if (option->algtype < 0)
-		option->algtype = AES_128_CBC;
+	}
 
 	if (option->modetype >= INVALID_MODE)
 		goto param_err;
@@ -657,8 +682,8 @@ int acc_option_convert(struct acc_option *option)
 	/* Min test package size is 64Bytes */
 	if (option->pktlen > MAX_DATA_SIZE)
 		goto param_err;
-	else if (option->pktlen < 64)
-		option->pktlen = 64;
+	else if (option->pktlen < 16)
+		option->pktlen = 16;
 
 	if (option->times > MAX_TIME_SECONDS) {
 		ACC_TST_PRT("uadk benchmark max test times to 128 seconds\n");
diff --git a/uadk_tool/benchmark/uadk_benchmark.h b/uadk_tool/benchmark/uadk_benchmark.h
index 2cb3dc0..a344fac 100644
--- a/uadk_tool/benchmark/uadk_benchmark.h
+++ b/uadk_tool/benchmark/uadk_benchmark.h
@@ -15,7 +15,6 @@
 #include <signal.h>
 #include <linux/random.h>
 #include <sys/syscall.h>
-#include <sys/mman.h>
 #include <sys/time.h>
 
 #define ACC_TST_PRT printf
@@ -24,21 +23,30 @@
 #define MAX_CTX_NUM	64
 #define MAX_TIME_SECONDS	128
 #define BYTES_TO_MB	20
-#define MAX_OPT_TYPE	5
+#define MAX_OPT_TYPE	6
 #define MAX_DATA_SIZE	(15 * 1024 * 1024)
 #define MAX_ALG_NAME 64
 #define ACC_QUEUE_SIZE	1024
 
+#define MAX_BLOCK_NM		16384 /* BLOCK_NUM must 4 times of POOL_LENTH */
+#define MAX_POOL_LENTH		4096
+#define MAX_TRY_CNT		5000
+#define SEND_USLEEP		100
+
 typedef unsigned char u8;
 typedef unsigned int u32;
 typedef unsigned     long long   u64;
 #define SCHED_SINGLE "sched_single"
+#define ARRAY_SIZE(x)		(sizeof(x) / sizeof((x)[0]))
 
 /**
  * struct acc_option - Define the test acc app option list.
  * @algclass: 0:cipher 1:digest
  * @acctype: The sub alg type, reference func get_cipher_resource.
  * @syncmode: 0:sync mode 1:async mode
+ * @modetype: sva, no-sva, soft mode
+ * @optype: enc/dec, comp/decomp
+ * @prefetch: write allocated memory to prevent page faults
  */
 struct acc_option {
 	char  algname[64];
@@ -56,6 +64,7 @@ struct acc_option {
 	u32 subtype;
 	char  engine[64];
 	u32 engine_flag;
+	u32 prefetch;
 };
 
 enum acc_type {
@@ -74,7 +83,7 @@ enum alg_type {
 	ECDH_TYPE,
 	ECDSA_TYPE,
 	SM2_TYPE,
-	X22519_TYPE,
+	X25519_TYPE,
 	X448_TYPE,
 };
 
@@ -164,9 +173,8 @@ extern void cal_perfermance_data(struct acc_option *option, u32 sttime);
 extern void time_start(u32 seconds);
 extern int get_run_state(void);
 extern void set_run_state(int state);
-extern int get_rand_int(int range);
-extern void get_rand_data(u8 *addr, int size);
-extern void add_recv_data(u32 cnt);
+extern void get_rand_data(u8 *addr, u32 size);
+extern void add_recv_data(u32 cnt, u32 pkglen);
 extern void add_send_complete(void);
 extern u32 get_recv_time(void);
 
-- 
2.33.0