[Accel-config] [PATCH 3/8] enable shadow compression

"Guo, Lingyan" <[email protected]> Fri, 27 Oct 2023 11:06:50 +0800
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
From: lingyan <[email protected]>

change:
   current compress could be reuse by chaining, so make the refactory

Signed-off-by: lingyan <[email protected]>
---
 test/accel_test.c |  2 ++
 test/accel_test.h | 14 +++++++++-----
 test/iaa.c        | 35 +++++++++++++++++++++++++++--------
 test/iaa.h        |  1 +
 test/iaa_prep.c   | 16 +++++++++++++---
 test/iaa_test.c   |  7 +++++++
 6 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/test/accel_test.c b/test/accel_test.c
index 61d9944..52a999c 100644
--- a/test/accel_test.c
+++ b/test/accel_test.c
@@ -491,6 +491,8 @@ void __clean_task(struct task *tsk)
 	free(tsk->dst2);
 	free(tsk->input);
 	free(tsk->output);
+	if (tsk->is_shadow_compress)
+		free(tsk->shadown_src2);
 }
 
 void free_batch_task(struct batch_task *btsk)
diff --git a/test/accel_test.h b/test/accel_test.h
index fea0fe6..71f948c 100644
--- a/test/accel_test.h
+++ b/test/accel_test.h
@@ -55,6 +55,8 @@ struct task {
 	uint32_t opcode;
 	void *src1;
 	void *src2;
+	int  is_shadow_compress;  //For chain operation & decompress use
+	void *shadown_src2;
 	void *dst1;
 	void *dst2;
 	void *delta1;
@@ -65,6 +67,7 @@ struct task {
 	uint64_t pattern2;
 	uint64_t xfer_size;
 	uint32_t dflags;
+	uint32_t shadow_dflags;
 	int test_flags;
 	int crc_seed;
 	unsigned long long *crc_seed_addr;
@@ -81,14 +84,15 @@ struct task {
 		uint16_t iaa_crc64_flags;
 		uint16_t iaa_cipher_flags;
 	};
-	uint32_t iaa_max_dst_size;
-	uint32_t iaa_src2_xfer_size;
+	uint32_t iaa_max_dst_size;				//Maximum Destination Size
+	uint32_t iaa_src2_xfer_size;			//Source 2 Transfer Size
+	uint32_t iaa_shadow_src2_xfer_size;			//Shadow Source 2 Transfer Size
 	union {
 		struct {
-			uint32_t iaa_filter_flags;
-			uint32_t iaa_num_inputs;
+			uint32_t iaa_filter_flags;		//Filter Flags
+			uint32_t iaa_num_inputs;		//Number of Input Elements
 		};
-		uint64_t iaa_crc64_poly;
+		uint64_t iaa_crc64_poly;			//CRC Polynomial
 	};
 	struct {
 		uint8_t algorithm;
diff --git a/test/iaa.c b/test/iaa.c
index 61d71fb..7ed639c 100644
--- a/test/iaa.c
+++ b/test/iaa.c
@@ -275,6 +275,13 @@ static int init_decompress(struct task *tsk, int tflags, int opcode, unsigned lo
 	memset_pattern(tsk->src1, 0, IAA_DECOMPRESS_MAX_DEST_SIZE);
 	memcpy(tsk->src1, tsk->input, src1_xfer_size);
 
+	if (tsk->is_shadow_compress) {
+		tsk->shadown_src2 = aligned_alloc(32, IAA_COMPRESS_SRC2_SIZE);
+		if (!tsk->shadown_src2)
+			return -ENOMEM;
+		memset_pattern(tsk->shadown_src2, 0, IAA_COMPRESS_SRC2_SIZE);
+	}
+
 	tsk->src2 = aligned_alloc(32, IAA_DECOMPRESS_SRC2_SIZE);
 	if (!tsk->src2)
 		return -ENOMEM;
@@ -1360,22 +1367,27 @@ static int iaa_wait_decompress(struct acctest_context *ctx, struct task *tsk)
 	return ACCTEST_STATUS_OK;
 }
 
-int iaa_decompress_multi_task_nodes(struct acctest_context *ctx)
+int iaa_prehook_compress_multi_task_nodes(struct acctest_context *ctx)
 {
 	struct task_node *tsk_node = ctx->multi_task_node;
 	int ret = ACCTEST_STATUS_OK;
 
 	// Compress
 	while (tsk_node) {
+		if (tsk_node->tsk->is_shadow_compress != 1)
+			err("Error drop to prehook compress");
+
 		tsk_node->tsk->opcode = IAX_OPCODE_COMPRESS;
-		tsk_node->tsk->dflags |= (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
+		tsk_node->tsk->shadow_dflags = (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
 		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
-			tsk_node->tsk->dflags |= IDXD_OP_FLAG_BOF;
+			tsk_node->tsk->shadow_dflags |= IDXD_OP_FLAG_BOF;
 
-		tsk_node->tsk->dflags |= (IDXD_OP_FLAG_WR_SRC2_CMPL | IDXD_OP_FLAG_RD_SRC2_AECS);
-		tsk_node->tsk->iaa_src2_xfer_size = IAA_COMPRESS_AECS_SIZE;
+		tsk_node->tsk->shadow_dflags |= (IDXD_OP_FLAG_WR_SRC2_CMPL
+					| IDXD_OP_FLAG_RD_SRC2_AECS);
+		tsk_node->tsk->iaa_shadow_src2_xfer_size = IAA_COMPRESS_AECS_SIZE;
 
-		memcpy(tsk_node->tsk->src2, (void *)iaa_compress_aecs, IAA_COMPRESS_AECS_SIZE);
+		memcpy(tsk_node->tsk->shadown_src2, (void *)iaa_compress_aecs,
+				IAA_COMPRESS_AECS_SIZE);
 
 		tsk_node->tsk->iaa_compr_flags = (IDXD_COMPRESS_FLAG_EOB_BFINAL |
 						  IDXD_COMPRESS_FLAG_FLUSH_OUTPUT);
@@ -1402,9 +1414,15 @@ int iaa_decompress_multi_task_nodes(struct acctest_context *ctx)
 	}
 
 	if (ret) {
-		printf("Before decompress, compress failed\n");
+		printf("Prehook, compress failed\n");
 		return ret;
 	}
+}
+
+int iaa_decompress_multi_task_nodes(struct acctest_context *ctx)
+{
+	struct task_node *tsk_node = ctx->multi_task_node;
+	int ret = ACCTEST_STATUS_OK;
 
 	// Decompress
 	tsk_node = ctx->multi_task_node;
@@ -1416,13 +1434,14 @@ int iaa_decompress_multi_task_nodes(struct acctest_context *ctx)
 		tsk_node->tsk->opcode = IAX_OPCODE_DECOMPRESS;
 		tsk_node->tsk->xfer_size = tsk_node->tsk->comp->iax_output_size;
 
-		tsk_node->tsk->dflags |= (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
+		tsk_node->tsk->dflags = (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
 		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
 			tsk_node->tsk->dflags |= IDXD_OP_FLAG_BOF;
 
 		tsk_node->tsk->dflags &= ~(IDXD_OP_FLAG_WR_SRC2_CMPL |
 					   IDXD_OP_FLAG_RD_SRC2_AECS);
 		tsk_node->tsk->iaa_src2_xfer_size = 0;
+		free(tsk_node->tsk->src2);
 		tsk_node->tsk->src2 = 0;
 
 		tsk_node->tsk->iaa_decompr_flags = (IDXD_DECOMPRESS_FLAG_SELECT_EOB_BFINAL |
diff --git a/test/iaa.h b/test/iaa.h
index bbb4bad..ddbf1d9 100644
--- a/test/iaa.h
+++ b/test/iaa.h
@@ -18,6 +18,7 @@ int iaa_zdecompress16_multi_task_nodes(struct acctest_context *ctx);
 int iaa_zcompress32_multi_task_nodes(struct acctest_context *ctx);
 int iaa_zdecompress32_multi_task_nodes(struct acctest_context *ctx);
 int iaa_compress_multi_task_nodes(struct acctest_context *ctx);
+int iaa_prehook_compress_multi_task_nodes(struct acctest_context *ctx);
 int iaa_decompress_multi_task_nodes(struct acctest_context *ctx);
 int iaa_scan_multi_task_nodes(struct acctest_context *ctx);
 int iaa_set_membership_multi_task_nodes(struct acctest_context *ctx);
diff --git a/test/iaa_prep.c b/test/iaa_prep.c
index 981a347..add8bf0 100644
--- a/test/iaa_prep.c
+++ b/test/iaa_prep.c
@@ -101,13 +101,23 @@ void iaa_prep_zdecompress32(struct task *tsk)
 void iaa_prep_compress(struct task *tsk)
 {
 	info("preparing descriptor for compress\n");
+	uint32_t dflags = tsk->dflags;
+
+	if (tsk->is_shadow_compress)
+		dflags = tsk->shadow_dflags;
 
 	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
-				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
+				 (uint64_t)(tsk->src1), tsk->xfer_size, dflags);
+
 	tsk->desc->completion_addr = (uint64_t)(tsk->comp);
 	tsk->desc->iax_compr_flags = tsk->iaa_compr_flags;
-	tsk->desc->iax_src2_addr = (uint64_t)(tsk->src2);
-	tsk->desc->iax_src2_xfer_size = tsk->iaa_src2_xfer_size;
+	if (tsk->is_shadow_compress) {
+		tsk->desc->iax_src2_addr = (uint64_t)(tsk->shadown_src2);
+		tsk->desc->iax_src2_xfer_size = tsk->iaa_shadow_src2_xfer_size;
+	} else {
+		tsk->desc->iax_src2_addr = (uint64_t)(tsk->src2);
+		tsk->desc->iax_src2_xfer_size = tsk->iaa_src2_xfer_size;
+	}
 	tsk->desc->iax_max_dst_size = tsk->iaa_max_dst_size;
 	tsk->comp->status = 0;
 }
diff --git a/test/iaa_test.c b/test/iaa_test.c
index 1417924..da76aef 100644
--- a/test/iaa_test.c
+++ b/test/iaa_test.c
@@ -273,6 +273,9 @@ static int test_compress(struct acctest_context *ctx, size_t buf_size, int tflag
 		/* allocate memory to src and dest buffers and fill in the desc for all the nodes*/
 		tsk_node = ctx->multi_task_node;
 		while (tsk_node) {
+			if (opcode == IAX_OPCODE_DECOMPRESS)
+				tsk_node->tsk->is_shadow_compress = 1;
+
 			tsk_node->tsk->iaa_compr_flags = extra_flags;
 
 			rc = init_task(tsk_node->tsk, tflags, opcode, buf_size);
@@ -294,6 +297,10 @@ static int test_compress(struct acctest_context *ctx, size_t buf_size, int tflag
 				return rc;
 			break;
 		case IAX_OPCODE_DECOMPRESS:
+			rc = iaa_prehook_compress_multi_task_nodes(ctx);
+			if (rc != ACCTEST_STATUS_OK)
+				return rc;
+
 			rc = iaa_decompress_multi_task_nodes(ctx);
 			if (rc != ACCTEST_STATUS_OK)
 				return rc;
-- 
2.34.1