From: Longfang Liu <liulongfang(a)huawei.com>
After removing the shared queue memory allocation interface, the UADK
test tools must also eliminate the shared memory functionality.
For individual memory reservations, the wd_reserve_memory interface
should be used. When allocating memory for multiple queues, each queue
should independently request its own reserved memory allocation.
Signed-off-by: Longfang Liu <liulongfang(a)huawei.com>
---
 v1/test/hisi_hpre_test/hpre_test_tools.c | 392 -----------------------
 v1/test/hisi_zip_test_sgl/wd_sched_sgl.c | 310 +++++++++---------
 v1/test/test_mm/test_wd_mem.c            |   8 +-
 v1/test/wd_sched.c                       | 247 +++++++-------
 4 files changed, 300 insertions(+), 657 deletions(-)
diff --git a/v1/test/hisi_hpre_test/hpre_test_tools.c b/v1/test/hisi_hpre_test/hpre_test_tools.c
index 7f562f34..10a4ade9 100755
--- a/v1/test/hisi_hpre_test/hpre_test_tools.c
+++ b/v1/test/hisi_hpre_test/hpre_test_tools.c
@@ -644,317 +644,6 @@ int application_release_multiple_queue(char *dev, char *alg_type, unsigned int q
 	printf("application_release_multiple_queue test end!\n");
 	return 0;
 }
-
-/***
-
-***/
-int hpre_dev_queue_share(char *dev, char * share_dev, char *alg_type, unsigned long m_size)
-{
-	void *addr=NULL;
-	int ret = 0;
-	struct wd_queue q;
-	struct wd_queue target_q;
-	unsigned long memory_size;
-
-	memset((void *)&q, 0, sizeof(q));
-	q.capa.alg = alg_type;
-	snprintf(q.dev_path, sizeof(q.dev_path), "%s", dev);
-	printf("queue path:%s\n", q.dev_path);
-
-	ret = wd_request_queue(&q);
-	if(ret)
-	{
-		printf("wd request queue fail!\n");
-		return 1;
-	}
-	printf("wd request queue success!\n");
-	memory_size = m_size;
-	addr = wd_reserve_memory(&q, memory_size);
-	if(!addr)
-	{
-		wd_release_queue(&q);
-		printf("wd reserve memory fail!\n");
-		return 1;
-	}
-	printf("wd reserve memory success!\n");
-	memset(addr, 0, memory_size);
-
-	memset((void *)&target_q, 0, sizeof(target_q));
-	target_q.capa.alg = alg_type;
-	snprintf(target_q.dev_path, sizeof(target_q.dev_path), "%s", share_dev);
-	printf("target queue path:%s\n", target_q.dev_path);
-
-	ret = wd_request_queue(&target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		printf("wd request target_q queue fail!\n");
-		return 1;
-	}
-	printf("wd request target_q queue success!\n");
-	//target_q队列共享q队列预留内存;
-	ret = wd_share_reserved_memory(&q, &target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		wd_release_queue(&target_q);
-		printf("wd target_q queue share reserved memory fail!\n");
-		return 1;
-	}
-	printf("wd target_q queue share reserved memory success!\n");
-	wd_release_queue(&target_q);
-	wd_release_queue(&q);
-
-	return 0;
-}
-/***
-
-***/
-int hpre_node_queue_share(char *dev, unsigned int node, unsigned int share_node, char *alg_type, unsigned long m_size)
-{
-	void *addr=NULL;
-	int ret = 0;
-	struct wd_queue q;
-	struct wd_queue target_q;
-	unsigned long memory_size;
-
-	memset((void *)&q, 0, sizeof(q));
-	q.capa.alg = alg_type;
-	snprintf(q.dev_path, sizeof(q.dev_path), "%s", dev);
-	printf("queue path:%s\n", q.dev_path);
-	q.node_mask = node;
-
-	ret = wd_request_queue(&q);
-	if(ret)
-	{
-		printf("wd request queue fail!\n");
-		return 1;
-	}
-	printf("wd request queue success!\n");
-	memory_size = m_size;
-	addr = wd_reserve_memory(&q, memory_size);
-	if(!addr)
-	{
-		wd_release_queue(&q);
-		printf("wd reserve memory fail!\n");
-		return 1;
-	}
-	printf("wd reserve memory success!\n");
-	memset(addr, 0, memory_size);
-
-	memset((void *)&target_q, 0, sizeof(target_q));
-	target_q.capa.alg = alg_type;
-	target_q.node_mask = node;
-
-	ret = wd_request_queue(&target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		printf("wd request target_q queue fail!\n");
-		return 1;
-	}
-	printf("wd request target_q queue success!\n");
-	//target_q队列共享q队列预留内存;
-	ret = do_dh(&q);
-	if(ret)
-	{
-		printf("do dh on q fail!\n");
-		return 1;
-	}
-	ret = do_dh(&target_q);
-	if(ret)
-	{
-		printf("do dh on target q fail!\n");
-		return 1;
-	}
-
-	ret = wd_share_reserved_memory(&q, &target_q);
-
-	if(ret)
-	{
-		wd_release_queue(&q);
-		wd_release_queue(&target_q);
-		printf("wd target_q queue share reserved memory fail!\n");
-		return 1;
-	}
-	printf("wd target_q queue share reserved memory success!\n");
-        ret = do_dh(&q);
-	if(ret)
-	{
-		printf("do dh on share q fail!\n");
-		return 1;
-	}
-	ret = do_dh(&target_q);
-	if(ret)
-	{
-		printf("do dh on share target q fail!\n");
-		return 1;
-	}
-
-	wd_release_queue(&target_q);
-	wd_release_queue(&q);
-
-	return 0;
-}
-/***
-
-***/
-int hpre_dev_queue_interact_share(char *dev, char * share_dev, char *alg_type, unsigned long m_size)
-{
-	void *addr=NULL;
-	int ret = 0;
-	struct wd_queue q;
-	struct wd_queue target_q;
-	unsigned long memory_size;
-
-	memset((void *)&q, 0, sizeof(q));
-	q.capa.alg = alg_type;
-	snprintf(q.dev_path, sizeof(q.dev_path), "%s", dev);
-	printf("queue path:%s\n", q.dev_path);
-
-	ret = wd_request_queue(&q);
-	if(ret)
-	{
-		printf("wd request queue fail!\n");
-		return ret;
-	}
-	printf("wd request queue success!\n");
-	memory_size = m_size;
-	addr = wd_reserve_memory(&q, memory_size);
-	if(!addr)
-	{
-		wd_release_queue(&q);
-		printf("wd reserve memory fail!\n");
-		return 1;
-	}
-	printf("wd reserve memory success!\n");
-	memset(addr, 0, memory_size);
-
-	memset((void *)&target_q, 0, sizeof(target_q));
-	target_q.capa.alg = alg_type;
-	snprintf(target_q.dev_path, sizeof(target_q.dev_path), "%s", share_dev);
-	printf("target queue path:%s\n", target_q.dev_path);
-
-	ret = wd_request_queue(&target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		printf("wd request target_q queue fail!\n");
-		return 1;
-	}
-	printf("wd request target_q queue success!\n");
-	addr = wd_reserve_memory(&target_q, memory_size);
-	if(!addr)
-	{
-		wd_release_queue(&q);
-		wd_release_queue(&target_q);
-		printf("wd reserve memory fail!\n");
-		return 1;
-	}
-	printf("wd reserve memory success!\n");
-	memset(addr, 0, memory_size);
-
-	//target_q
-	ret = wd_share_reserved_memory(&q, &target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		wd_release_queue(&target_q);
-		printf("wd target_q queue share reserved memory fail!\n");
-		return 1;
-	}
-	printf("wd target_q queue share reserved memory success!\n");
-
-	wd_release_queue(&target_q);
-	wd_release_queue(&q);
-
-	return 0;
-}
-
-/***
-
-***/
-int hpre_dev_queue_cross_proc_share(char *dev, char *alg_type, unsigned long m_size)
-{
-	void *addr=NULL;
-	int ret = 0;
-	pid_t pid;
-	struct wd_queue q;
-	struct wd_queue target_q;
-	unsigned long memory_size=0;
-
-	pid = fork();
-	if(pid < 0)
-	{
-		printf("Creation process failed, pid:%d\n",pid);
-		return 1;
-	}
-	else if(pid == 0)
-	{
-		printf("child process:%d\n", pid);
-		memset((void *)&q, 0, sizeof(q));
-		q.capa.alg = alg_type;
-		snprintf(q.dev_path, sizeof(q.dev_path), "%s", dev);
-		printf("queue path:%s\n", q.dev_path);
-
-		ret = wd_request_queue(&q);
-		if(ret)
-		{
-			printf("request queue fail!\n");
-			exit(1);
-		}
-		printf("wd request queue success!\n");
-		memory_size = m_size;
-		addr = wd_reserve_memory(&q, memory_size);
-		if(!addr)
-		{
-			wd_release_queue(&q);
-			printf("queue reserve memory fail!\n");
-			exit(2);
-		}
-		printf("queue reserve memory success!\n");
-		memset(addr, 0, memory_size);
-		exit(0);
-	}
-	printf("parent process:%d\n", pid);
-	pid_t wpid;
-	int status = -1;
-	wpid = waitpid(pid, &status, WUNTRACED | WCONTINUED);
-	if( wpid < 0)
-	{
-		printf("exited, status=%d\n", WEXITSTATUS(status));
-		return(status);
-	}
-
-	memset((void *)&target_q, 0, sizeof(target_q));
-	target_q.capa.alg = alg_type;
-	snprintf(target_q.dev_path, sizeof(target_q.dev_path), "%s", dev);
-	printf("target queue path:%s\n", target_q.dev_path);
-
-	ret = wd_request_queue(&target_q);
-	if(ret)
-	{
-		wd_release_queue(&q);
-		printf("wd request target_q queue fail!\n");
-		return 1;
-	}
-	printf("wd request target_q queue success!\n");
-	ret = wd_share_reserved_memory(&q, &target_q);
-	if(ret)
-	{
-		wd_release_queue(&target_q);
-		wd_release_queue(&q);
-		printf("wd target_q queue share reserved memory fail!\n");
-		return 1;
-	}
-	printf("wd target_q queue share reserved memory success!\n");
-
-	wd_release_queue(&target_q);
-	wd_release_queue(&q);
-
-	return 0;
-}
-
 /***
 
 ***/
@@ -1696,87 +1385,6 @@ int main(int arc, char *argv[])
 			return 1;
 		}
 	}
-	else if(!strcmp(argv[1], "queue-share"))
-	{
-		/***
-		argv[2] - 表示算法类型
-		argv[3] - 表示申请队列设备
-		argv[4] - 表示共享预留内存的设备
-		argv[5] - 表示申请队列的预留内存大小
-		***/
-		//申请单个队列,预留内存,与其它队列共享预留内存
-		snprintf(algorithm_type, sizeof(algorithm_type), "%s", argv[2]);
-		snprintf(dev, sizeof(dev), "%s", argv[3]);
-		snprintf(share_dev, sizeof(share_dev), "%s", argv[4]);
-		memory_size = strtoul(argv[5], NULL, 10);
-
-		ret = hpre_dev_queue_share(dev, share_dev, algorithm_type, memory_size);
-		if(0 != ret)
-		{
-			return 1;
-		}
-	}
-	else if(!strcmp(argv[1], "node-queue-share"))
-	{
-		/***
-		argv[2] - 表示算法类型
-		argv[3] - 表示申请队列设备
-		argv[4] - 表示设备node
-		argv[5] - 表示共享内存设备node
-		argv[6] - 表示申请队列的预留内存大小
-		***/
-		//申请单个队列,预留内存,与其它队列共享预留内存
-		snprintf(algorithm_type, sizeof(algorithm_type), "%s", argv[2]);
-		snprintf(dev, sizeof(dev), "%s", argv[3]);
-		unsigned int node=0;
-        node = strtoul(argv[4], NULL, 16);
-		unsigned int share_node=0;
-        share_node = strtoul(argv[5], NULL, 16);
-		memory_size = strtoul(argv[6], NULL, 10);
-
-		ret = hpre_node_queue_share(dev, node, share_node, algorithm_type, memory_size);
-		if(0 != ret)
-		{
-			return 1;
-		}
-	}
-	else if(!strcmp(argv[1], "queue-interact-share"))
-	{
-		/***
-		argv[2] - 表示算法类型
-		argv[3] - 表示申请队列设备
-		argv[4] - 表示共享预留内存的设备
-		argv[5] - 表示申请队列的预留内存大小
-		***/
-		//队列预留内存后作为共享的目标队列
-		snprintf(algorithm_type, sizeof(algorithm_type), "%s", argv[2]);
-		snprintf(dev, sizeof(dev), "%s", argv[3]);
-		snprintf(share_dev, sizeof(share_dev), "%s", argv[4]);
-		memory_size = strtoul(argv[5], NULL, 10);
-
-		ret = hpre_dev_queue_interact_share(dev, share_dev, algorithm_type, memory_size);
-		if(0 != ret)
-		{
-			return 1;
-		}
-	}
-	else if(!strcmp(argv[1], "queue-cross-proc-share"))
-	{
-		/***
-		argv[2] - 表示算法类型
-		argv[3] - 表示申请队列设备
-		argv[4] - 表示申请队列的预留内存大小
-		***/
-		//跨进程进行队列共享
-		snprintf(algorithm_type, sizeof(algorithm_type), "%s", argv[2]);
-		snprintf(dev, sizeof(dev), "%s", argv[3]);
-		memory_size = strtoul(argv[4], NULL, 10);
-		ret = hpre_dev_queue_cross_proc_share(dev, algorithm_type, memory_size);
-		if(0 != ret)
-		{
-			return 1;
-		}
-	}
 	else if(!strcmp(argv[1], "mult-thread-queue"))
 	{
 		/***
diff --git a/v1/test/hisi_zip_test_sgl/wd_sched_sgl.c b/v1/test/hisi_zip_test_sgl/wd_sched_sgl.c
index 31637565..7a3be22c 100644
--- a/v1/test/hisi_zip_test_sgl/wd_sched_sgl.c
+++ b/v1/test/hisi_zip_test_sgl/wd_sched_sgl.c
@@ -23,96 +23,33 @@
 #define EXTRA_SIZE		4096
 #define WD_WAIT_MS		1000
 
-static int __init_cache(struct wd_scheduler *sched, int data_fmt)
+static int wd_sched_pre_uninit(struct wd_scheduler *sched, int data_fmt)
 {
-	int i;
-	int ret = -ENOMEM;
+	unsigned int flags = 0;
 	struct q_info *qinfo;
 	void *pool;
+	int  i;
 
-	sched->msgs = calloc(sched->msg_cache_num, sizeof(*sched->msgs));
-	if (!sched->msgs) {
-		WD_ERR("calloc for sched->msgs fail!\n");
-		return ret;
-	}
-	sched->stat = calloc(sched->q_num, sizeof(*sched->stat));
-	if (!sched->stat) {
-		WD_ERR("calloc for sched->stat fail!\n");
-		goto err_with_msgs;
-	}
 	qinfo = sched->qs[0].qinfo;
-	pool = qinfo->br.usr;
-	for (i = 0; i < sched->msg_cache_num; i++) {
-		if (data_fmt == WD_FLAT_BUF) {  /* use pbuffer */
-			sched->msgs[i].data_in = wd_alloc_blk(pool);
-			sched->msgs[i].data_out = wd_alloc_blk(pool);
-			if (!sched->msgs[i].data_in || !sched->msgs[i].data_out) {
-				dbg("not enough data ss_region memory "
-				"for cache %d (bs=%d)\n", i, sched->msg_data_size);
-				goto err_with_stat;
-			}
-		} else {  /* use sgl */
-			sched->msgs[i].data_in = wd_alloc_sgl(pool, sched->msg_data_size);
-			sched->msgs[i].data_out = wd_alloc_sgl(pool, sched->msg_data_size);
-			if (!sched->msgs[i].data_in || !sched->msgs[i].data_out) {
-				dbg("not enough data ss_region memory "
-				"for cache %d (bs=%d)\n", i, sched->msg_data_size);
-				goto err_with_stat;
-			}
+	flags = qinfo->dev_flags;
+	if (flags & WD_UACCE_DEV_PASID) {
+		if (sched->ss_region) {
+			free(sched->ss_region);
+			sched->ss_region = NULL;
 		}
+		return 0;
+	}
 
-		if (sched->init_cache)
-			sched->init_cache(sched, i, data_fmt);
+	for (i = 0; i < sched->q_num; i++) {
+		wd_release_queue(&sched->qs[i]);
+		qinfo = sched->qs[i].qinfo;
+		if (data_fmt == WD_FLAT_BUF)
+			wd_blkpool_destroy(qinfo->br.usr);
+		else
+			wd_sglpool_destroy(qinfo->br.usr);
 	}
 
 	return 0;
-
-err_with_stat:
-	free(sched->stat);
-	sched->stat = NULL;
-err_with_msgs:
-	free(sched->msgs);
-	sched->msgs = NULL;
-	return ret;
-}
-
-static void __fini_cache(struct wd_scheduler *sched, int data_fmt)
-{
-	struct q_info *qinfo = sched->qs[0].qinfo;
-	unsigned int flags = qinfo->dev_flags;
-	void *pool;
-	int i;
-
-	if (sched->stat) {
-		free(sched->stat);
-		sched->stat = NULL;
-	}
-	if (!(flags & WD_UACCE_DEV_PASID)) {
-		pool = qinfo->br.usr;
-		if (pool) {
-			if (data_fmt == WD_FLAT_BUF) { /* use pbuffer */
-				for (i = 0; i < sched->msg_cache_num; i++) {
-					if (sched->msgs[i].data_in)
-						wd_free_blk(pool, sched->msgs[i].data_in);
-					if (sched->msgs[i].data_out)
-						wd_free_blk(pool, sched->msgs[i].data_out);
-					}
-				wd_blkpool_destroy(pool);
-			} else { /* use sgl */
-				for (i = 0; i < sched->msg_cache_num; i++) {
-					if (sched->msgs[i].data_in)
-						wd_free_sgl(pool, sched->msgs[i].data_in);
-					if (sched->msgs[i].data_out)
-						wd_free_sgl(pool, sched->msgs[i].data_out);
-					}
-				wd_sglpool_destroy(pool);
-			}
-		}
-	}
-	if (sched->msgs) {
-		free(sched->msgs);
-		sched->msgs = NULL;
-	}
 }
 
 static int wd_sched_preinit(struct wd_scheduler *sched, int data_fmt)
@@ -124,14 +61,6 @@ static int wd_sched_preinit(struct wd_scheduler *sched, int data_fmt)
 	struct wd_sglpool_setup sp;
 	void *pool;
 
-	for (i = 0; i < sched->q_num; i++) {
-		ret = wd_request_queue(&sched->qs[i]);
-		if (ret) {
-			WD_ERR("fail to request queue!\n");
-			goto out_with_queues;
-		}
-	}
-
 	if (!sched->ss_region_size)
 		sched->ss_region_size = EXTRA_SIZE + /* add 1 page extra */
 			sched->msg_cache_num * (sched->msg_data_size << 0x1);
@@ -145,12 +74,22 @@ static int wd_sched_preinit(struct wd_scheduler *sched, int data_fmt)
 			ret = -ENOMEM;
 			goto out_with_queues;
 		}
-	} else {
-		if (data_fmt == WD_FLAT_BUF) {  /* use pbuffer*/
-			memset(&mm_setup, 0, sizeof(mm_setup));
-			mm_setup.block_size = sched->msg_data_size;
-			mm_setup.block_num = sched->msg_cache_num << 0x1; /* in and out */
-			mm_setup.align_size = 128;
+		return 0;
+	}
+
+	if (data_fmt == WD_FLAT_BUF) {  /* use pbuffer*/
+		memset(&mm_setup, 0, sizeof(mm_setup));
+		mm_setup.block_size = sched->msg_data_size;
+		mm_setup.block_num = sched->msg_cache_num << 0x1; /* in and out */
+		mm_setup.align_size = 128;
+		for (i = 0; i < sched->q_num; i++) {
+			ret = wd_request_queue(&sched->qs[i]);
+			if (ret) {
+				WD_ERR("fail to request queue!\n");
+				goto out_with_queues;
+			}
+
+			qinfo = sched->qs[i].qinfo;
 			pool = wd_blkpool_create(&sched->qs[0], &mm_setup);
 			if (!pool) {
 				WD_ERR("%s(): create pool fail!\n", __func__);
@@ -162,15 +101,18 @@ static int wd_sched_preinit(struct wd_scheduler *sched, int data_fmt)
 			qinfo->br.iova_map = (void *)wd_blk_iova_map;
 			qinfo->br.iova_unmap = (void *)wd_blk_iova_unmap;
 			qinfo->br.usr = pool;
-		} else {  /* use sgl*/
-			memset(&sp, 0, sizeof(sp));
-			sp.buf_size = sched->msg_data_size / 10;
-			sp.align_size = 64;
-			sp.sge_num_in_sgl = 60;
-			sp.buf_num_in_sgl = sp.sge_num_in_sgl;
-			sp.sgl_num = 3 * sched->msg_cache_num;
-			sp.buf_num = sp.buf_num_in_sgl * sp.sgl_num  + sp.sgl_num * 2;
-
+		}
+	} else {  /* use sgl*/
+		memset(&sp, 0, sizeof(sp));
+		sp.buf_size = sched->msg_data_size / 10;
+		sp.align_size = 64;
+		sp.sge_num_in_sgl = 60;
+		sp.buf_num_in_sgl = sp.sge_num_in_sgl;
+		sp.sgl_num = 3 * sched->msg_cache_num;
+		sp.buf_num = sp.buf_num_in_sgl * sp.sgl_num  + sp.sgl_num * 2;
+
+		for (i = 0; i < sched->q_num; i++) {
+			qinfo = sched->qs[i].qinfo;
 			pool = wd_sglpool_create(&sched->qs[0], &sp);
 			if (!pool) {
 				WD_ERR("%s(): create pool fail!\n", __func__);
@@ -189,17 +131,132 @@ static int wd_sched_preinit(struct wd_scheduler *sched, int data_fmt)
 	return 0;
 
 out_with_queues:
+	for (j = i-1; j >= 0; j--) {
+		wd_release_queue(&sched->qs[j]);
+		qinfo = sched->qs[j].qinfo;
+		if (data_fmt == WD_FLAT_BUF)
+			wd_blkpool_destroy(qinfo->br.usr);
+		else
+			wd_sglpool_destroy(qinfo->br.usr);
+	}
+
 	if (flags & WD_UACCE_DEV_PASID) {
 		if (sched->ss_region) {
 			free(sched->ss_region);
 			sched->ss_region = NULL;
 		}
 	}
-	for (j = i-1; j >= 0; j--)
-		wd_release_queue(&sched->qs[j]);
+
 	return ret;
 }
 
+static void __fini_cache(struct wd_scheduler *sched, int data_fmt)
+{
+	struct q_info *qinfo = sched->qs[0].qinfo;
+	unsigned int flags = qinfo->dev_flags;
+	void *pool;
+	int i, j;
+
+	if (sched->stat) {
+		free(sched->stat);
+		sched->stat = NULL;
+	}
+
+	if (sched->msgs) {
+		free(sched->msgs);
+		sched->msgs = NULL;
+	}
+
+	if (!(flags & WD_UACCE_DEV_PASID)) {
+		for (j = 0; j < sched->q_num; j++) {
+			qinfo = sched->qs[j].qinfo;
+			pool = qinfo->br.usr;
+			if (!pool)
+				continue;
+
+			if (data_fmt == WD_FLAT_BUF) { /* use pbuffer */
+				for (i = 0; i < sched->msg_cache_num; i++) {
+					if (sched->msgs[i].data_in)
+						wd_free_blk(pool, sched->msgs[i].data_in);
+					if (sched->msgs[i].data_out)
+						wd_free_blk(pool, sched->msgs[i].data_out);
+				}
+			} else { /* use sgl */
+				for (i = 0; i < sched->msg_cache_num; i++) {
+					if (sched->msgs[i].data_in)
+						wd_free_sgl(pool, sched->msgs[i].data_in);
+					if (sched->msgs[i].data_out)
+						wd_free_sgl(pool, sched->msgs[i].data_out);
+				}
+			}
+		}
+	}
+}
+
+static int __init_cache(struct wd_scheduler *sched, int data_fmt)
+{
+	struct q_info *qinfo;
+	unsigned int flags;
+	int ret = -ENOMEM;
+	int i, j;
+	void *pool;
+
+	sched->msgs = calloc(sched->msg_cache_num, sizeof(*sched->msgs));
+	if (!sched->msgs) {
+		WD_ERR("calloc for sched->msgs fail!\n");
+		return ret;
+	}
+	sched->stat = calloc(sched->q_num, sizeof(*sched->stat));
+	if (!sched->stat) {
+		WD_ERR("calloc for sched->stat fail!\n");
+		goto err_with_msgs;
+	}
+	qinfo = sched->qs[0].qinfo;
+	pool = qinfo->br.usr;
+	flags = qinfo->dev_flags;
+	if ((flags & WD_UACCE_DEV_PASID))
+		return 0;
+
+	for (i = 0; i < sched->q_num; i++) {
+		qinfo = sched->qs[i].qinfo;
+		pool = qinfo->br.usr;
+		for (j = 0; j < sched->msg_cache_num; j++) {
+			if (data_fmt == WD_FLAT_BUF) {  /* use pbuffer */
+				sched->msgs[j].data_in = wd_alloc_blk(pool);
+				sched->msgs[j].data_out = wd_alloc_blk(pool);
+				if (!sched->msgs[j].data_in || !sched->msgs[j].data_out) {
+					dbg("not enough data ss_region memory "
+					"for cache %d (bs=%d)\n", j, sched->msg_data_size);
+					goto err_with_stat;
+				}
+			} else {  /* use sgl */
+				sched->msgs[j].data_in = wd_alloc_sgl(pool, sched->msg_data_size);
+				sched->msgs[j].data_out = wd_alloc_sgl(pool, sched->msg_data_size);
+				if (!sched->msgs[j].data_in || !sched->msgs[j].data_out) {
+					dbg("not enough data ss_region memory "
+					"for cache %d (bs=%d)\n", j, sched->msg_data_size);
+					goto err_with_stat;
+				}
+			}
+
+			if (sched->init_cache)
+				sched->init_cache(sched, j, data_fmt);
+		}
+	}
+
+	return 0;
+
+err_with_stat:
+	free(sched->stat);
+	sched->stat = NULL;
+	__fini_cache(sched, data_fmt);
+err_with_msgs:
+	if (sched->msgs) {
+		free(sched->msgs);
+		sched->msgs = NULL;
+	}
+	return ret;
+}
 
 int wd_sched_init(struct wd_scheduler *sched, int data_fmt)
 {
@@ -211,57 +268,22 @@ int wd_sched_init(struct wd_scheduler *sched, int data_fmt)
 	if (ret < 0)
 		return -EINVAL;
 
-	qinfo = sched->qs[0].qinfo;
-	flags = qinfo->dev_flags;
-	if (!(flags & WD_UACCE_DEV_PASID)) {
-		for (k = 1; k < sched->q_num; k++) {
-			ret = wd_share_reserved_memory(&sched->qs[0],
-						       &sched->qs[k]);
-			if (ret) {
-				WD_ERR("fail to share queue reserved mem!\n");
-				goto out_with_queues;
-			}
-		}
-	}
-
 	sched->cl = sched->msg_cache_num;
 
 	ret = __init_cache(sched, data_fmt);
 	if (ret) {
 		WD_ERR("fail to init caches!\n");
-		goto out_with_queues;
+		wd_sched_pre_uninit(sched, data_fmt);
+		return -EINVAL;
 	}
 
 	return 0;
-
-out_with_queues:
-	if (flags & WD_UACCE_DEV_PASID) {
-		if (sched->ss_region) {
-			free(sched->ss_region);
-			sched->ss_region = NULL;
-		}
-	}
-	for (j = sched->q_num - 1; j >= 0; j--)
-		wd_release_queue(&sched->qs[j]);
-	return ret;
 }
 
 void wd_sched_fini(struct wd_scheduler *sched, int data_fmt)
 {
-	int i;
-	struct q_info *qinfo = sched->qs[0].qinfo;
-	unsigned int flags = qinfo->dev_flags;
-
 	__fini_cache(sched, data_fmt);
-	if (flags & WD_UACCE_DEV_PASID) {
-		if (sched->ss_region) {
-			free(sched->ss_region);
-			sched->ss_region = NULL;
-		}
-	}
-
-	for (i = sched->q_num - 1; i >= 0; i--)
-		wd_release_queue(&sched->qs[i]);
+	wd_sched_pre_uninit(sched, data_fmt);
 }
 
 static int __sync_send(struct wd_scheduler *sched)
@@ -350,4 +372,4 @@ int wd_sched_work(struct wd_scheduler *sched, int remained)
 	}
 
 	return sched->cl;
-}
\ No newline at end of file
+}
diff --git a/v1/test/test_mm/test_wd_mem.c b/v1/test/test_mm/test_wd_mem.c
index 09824b99..e2eec60e 100644
--- a/v1/test/test_mm/test_wd_mem.c
+++ b/v1/test/test_mm/test_wd_mem.c
@@ -208,10 +208,10 @@ void *mmt_sys_test_thread(void *data)
 		return NULL;
 	}
 
-	ret = wd_share_reserved_memory(pdata->qinfo1.q, &rsa_q);
+	ret = wd_request_queue(&pdata->qinfo1.q);
 	if (ret) {
 		wd_release_queue(&rsa_q);
-		MMT_PRT("Proc-%d, thrd-%d:share mem on rsa queue fail!\n",
+		MMT_PRT("Proc-%d, thrd-%d:rsa queue fail!\n",
 			pid, thread_id);
 		return NULL;
 	}
@@ -226,9 +226,9 @@ void *mmt_sys_test_thread(void *data)
 
 		return NULL;
 	}
-	ret = wd_share_reserved_memory(pdata->qinfo2.q, &zlib_q);
+	ret = wd_request_queue(&pdata->qinfo2.q);
 	if (ret) {
-		MMT_PRT("Proc-%d, thrd-%d:share mem on zlib queue fail!\n",
+		MMT_PRT("Proc-%d, thrd-%d:zlib queue fail!\n",
 			pid, thread_id);
 
 		goto fail_release;
diff --git a/v1/test/wd_sched.c b/v1/test/wd_sched.c
index f5e46699..ce1d2604 100644
--- a/v1/test/wd_sched.c
+++ b/v1/test/wd_sched.c
@@ -22,94 +22,40 @@
 #define EXTRA_SIZE		4096
 #define WD_WAIT_MS		1000
 
-static int __init_cache(struct wd_scheduler *sched)
+static int wd_sched_pre_uninit(struct wd_scheduler *sched)
 {
-	int i;
-	int ret = -ENOMEM;
+	unsigned int flags = 0;
 	struct q_info *qinfo;
 	void *pool;
+	int  i;
 
-	sched->msgs = calloc(sched->msg_cache_num, sizeof(*sched->msgs));
-	if (!sched->msgs) {
-		WD_ERR("calloc for sched->msgs fail!\n");
-		return ret;
-	}
-	sched->stat = calloc(sched->q_num, sizeof(*sched->stat));
-	if (!sched->stat) {
-		WD_ERR("calloc for sched->stat fail!\n");
-		goto err_with_msgs;
-	}
 	qinfo = sched->qs[0].qinfo;
-	pool = qinfo->br.usr;
-	for (i = 0; i < sched->msg_cache_num; i++) {
-		sched->msgs[i].data_in = wd_alloc_blk(pool);
-		sched->msgs[i].data_out = wd_alloc_blk(pool);
-		if (!sched->msgs[i].data_in || !sched->msgs[i].data_out) {
-			dbg("not enough data ss_region memory "
-			    "for cache %d (bs=%d)\n", i, sched->msg_data_size);
-			goto err_with_stat;
+	flags = qinfo->dev_flags;
+	if (flags & WD_UACCE_DEV_PASID) {
+		if (sched->ss_region) {
+			free(sched->ss_region);
+			sched->ss_region = NULL;
 		}
+		return 0;
+	}
 
-		if (sched->init_cache)
-			sched->init_cache(sched, i);
+	for (i = 0; i < sched->q_num; i++) {
+		wd_release_queue(&sched->qs[i]);
+		qinfo = sched->qs[i].qinfo;
+		wd_blkpool_destroy(qinfo->br.usr);
 	}
 
 	return 0;
-
-err_with_stat:
-	free(sched->stat);
-	sched->stat = NULL;
-err_with_msgs:
-	free(sched->msgs);
-	sched->msgs = NULL;
-	return ret;
-}
-
-static void __fini_cache(struct wd_scheduler *sched)
-{
-	struct q_info *qinfo = sched->qs[0].qinfo;
-	unsigned int flags = qinfo->dev_flags;
-	void *pool;
-	int i;
-
-	if (sched->stat) {
-		free(sched->stat);
-		sched->stat = NULL;
-	}
-	if (!(flags & WD_UACCE_DEV_PASID)) {
-		pool = qinfo->br.usr;
-		if (pool) {
-			for (i = 0; i < sched->msg_cache_num; i++) {
-				if (sched->msgs[i].data_in)
-					wd_free_blk(pool, sched->msgs[i].data_in);
-				if (sched->msgs[i].data_out)
-					wd_free_blk(pool, sched->msgs[i].data_out);
-				}
-			wd_blkpool_destroy(pool);
-		}
-	}
-	if (sched->msgs) {
-		free(sched->msgs);
-		sched->msgs = NULL;
-	}
 }
 
 static int wd_sched_preinit(struct wd_scheduler *sched)
 {
-	int ret, i, j;
+	struct wd_blkpool_setup mm_setup;
 	unsigned int flags = 0;
 	struct q_info *qinfo;
-	struct wd_blkpool_setup mm_setup;
+	int ret, i, j;
 	void *pool;
 
-	for (i = 0; i < sched->q_num; i++) {
-		ret = wd_request_queue(&sched->qs[i]);
-		if (ret) {
-			WD_ERR("fail to request queue!\n");
-			goto out_with_queues;
-		}
-	}
-
 	if (!sched->ss_region_size)
 		sched->ss_region_size = EXTRA_SIZE + /* add 1 page extra */
 			sched->msg_cache_num * (sched->msg_data_size << 0x1);
@@ -120,18 +66,29 @@ static int wd_sched_preinit(struct wd_scheduler *sched)
 		sched->ss_region = malloc(sched->ss_region_size);
 		if (!sched->ss_region) {
 			WD_ERR("fail to alloc sched ss region mem!\n");
+			return -ENOMEM;
+		}
+		return 0;
+	}
+
+	memset(&mm_setup, 0, sizeof(mm_setup));
+	mm_setup.block_size = sched->msg_data_size;
+	mm_setup.block_num = sched->msg_cache_num << 0x1; /* in and out */
+	mm_setup.align_size = 128;
+	for (i = 0; i < sched->q_num; i++) {
+		ret = wd_request_queue(&sched->qs[i]);
+		if (ret) {
+			WD_ERR("fail to request queue!\n");
 			ret = -ENOMEM;
 			goto out_with_queues;
 		}
-	} else {
-		memset(&mm_setup, 0, sizeof(mm_setup));
-		mm_setup.block_size = sched->msg_data_size;
-		mm_setup.block_num = sched->msg_cache_num << 0x1; /* in and out */
-		mm_setup.align_size = 128;
-		pool = wd_blkpool_create(&sched->qs[0], &mm_setup);
+
+		qinfo = sched->qs[i].qinfo;
+		pool = wd_blkpool_create(&sched->qs[i], &mm_setup);
 		if (!pool) {
 			WD_ERR("%s(): create pool fail!\n", __func__);
 			ret = -ENOMEM;
+			wd_release_queue(&sched->qs[i]);
 			goto out_with_queues;
 		}
 		qinfo->br.alloc = (void *)wd_alloc_blk;
@@ -144,79 +101,135 @@ static int wd_sched_preinit(struct wd_scheduler *sched)
 	return 0;
 
 out_with_queues:
+	for (j = i-1; j >= 0; j--) {
+		wd_release_queue(&sched->qs[j]);
+		qinfo = sched->qs[j].qinfo;
+		wd_blkpool_destroy(qinfo->br.usr);
+	}
+
 	if (flags & WD_UACCE_DEV_PASID) {
 		if (sched->ss_region) {
 			free(sched->ss_region);
 			sched->ss_region = NULL;
 		}
 	}
-	for (j = i-1; j >= 0; j--)
-		wd_release_queue(&sched->qs[j]);
+
 	return ret;
 }
 
+static void __fini_cache(struct wd_scheduler *sched)
+{
+	struct q_info *qinfo = sched->qs[0].qinfo;
+	unsigned int flags = qinfo->dev_flags;
+	void *pool;
+	int i, j;
 
-int wd_sched_init(struct wd_scheduler *sched)
+	if (sched->stat) {
+		free(sched->stat);
+		sched->stat = NULL;
+	}
+
+	if (sched->msgs) {
+		free(sched->msgs);
+		sched->msgs = NULL;
+	}
+
+	if (!(flags & WD_UACCE_DEV_PASID)) {
+		for (j = 0; j < sched->q_num; j++) {
+			qinfo = sched->qs[j].qinfo;
+			pool = qinfo->br.usr;
+			if (!pool)
+				continue;
+
+			for (i = 0; i < sched->msg_cache_num; i++) {
+				if (sched->msgs[i].data_in)
+					wd_free_blk(pool, sched->msgs[i].data_in);
+				if (sched->msgs[i].data_out)
+					wd_free_blk(pool, sched->msgs[i].data_out);
+			}
+		}
+	}
+}
+
+static int __init_cache(struct wd_scheduler *sched)
 {
-	int ret, j, k;
-	unsigned int flags;
 	struct q_info *qinfo;
+	unsigned int flags;
+	int ret = -ENOMEM;
+	int i, j;
+	void *pool;
 
-	ret = wd_sched_preinit(sched);
-	if (ret < 0)
-		return -EINVAL;
+	sched->msgs = calloc(sched->msg_cache_num, sizeof(*sched->msgs));
+	if (!sched->msgs) {
+		WD_ERR("calloc for sched->msgs fail!\n");
+		return ret;
+	}
+	sched->stat = calloc(sched->q_num, sizeof(*sched->stat));
+	if (!sched->stat) {
+		WD_ERR("calloc for sched->stat fail!\n");
+		goto err_with_msgs;
+	}
 
 	qinfo = sched->qs[0].qinfo;
+	pool = qinfo->br.usr;
 	flags = qinfo->dev_flags;
-	if (!(flags & WD_UACCE_DEV_PASID)) {
-		for (k = 1; k < sched->q_num; k++) {
-			ret = wd_share_reserved_memory(&sched->qs[0],
-						       &sched->qs[k]);
-			if (ret) {
-				WD_ERR("fail to share queue reserved mem!\n");
-				goto out_with_queues;
+	if ((flags & WD_UACCE_DEV_PASID))
+		return 0;
+
+	for (i = 0; i < sched->q_num; i++) {
+		qinfo = sched->qs[i].qinfo;
+		pool = qinfo->br.usr;
+		for (j = 0; j < sched->msg_cache_num; j++) {
+			sched->msgs[j].data_in = wd_alloc_blk(pool);
+			sched->msgs[j].data_out = wd_alloc_blk(pool);
+			if (!sched->msgs[j].data_in || !sched->msgs[j].data_out) {
+				dbg("not enough data ss_region memory "
+				    "for cache %d (bs=%d)\n", j, sched->msg_data_size);
+				goto err_with_alloc;
 			}
+
+			if (sched->init_cache)
+				sched->init_cache(sched, j);
 		}
 	}
 
-	sched->cl = sched->msg_cache_num;
+	return 0;
+
+err_with_alloc:
+	free(sched->stat);
+	sched->stat = NULL;
+	__fini_cache(sched);
+err_with_msgs:
+	if (sched->msgs) {
+		free(sched->msgs);
+		sched->msgs = NULL;
+	}
+	return ret;
+}
+
+int wd_sched_init(struct wd_scheduler *sched)
+{
+	int ret;
 
+	ret = wd_sched_preinit(sched);
+	if (ret < 0)
+		return -EINVAL;
+
+	sched->cl = sched->msg_cache_num;
 	ret = __init_cache(sched);
 	if (ret) {
 		WD_ERR("fail to init caches!\n");
-		goto out_with_queues;
+		wd_sched_pre_uninit(sched);
+		return -EINVAL;
 	}
 
 	return 0;
-
-out_with_queues:
-	if (flags & WD_UACCE_DEV_PASID) {
-		if (sched->ss_region) {
-			free(sched->ss_region);
-			sched->ss_region = NULL;
-		}
-	}
-	for (j = sched->q_num - 1; j >= 0; j--)
-		wd_release_queue(&sched->qs[j]);
-	return ret;
 }
 
 void wd_sched_fini(struct wd_scheduler *sched)
 {
-	int i;
-	struct q_info *qinfo = sched->qs[0].qinfo;
-	unsigned int flags = qinfo->dev_flags;
-
 	__fini_cache(sched);
-	if (flags & WD_UACCE_DEV_PASID) {
-		if (sched->ss_region) {
-			free(sched->ss_region);
-			sched->ss_region = NULL;
-		}
-	}
-
-	for (i = sched->q_num - 1; i >= 0; i--)
-		wd_release_queue(&sched->qs[i]);
+	wd_sched_pre_uninit(sched);
 }
 
 static int __sync_send(struct wd_scheduler *sched)
-- 
2.33.0