[Accel-config] Re: [PATCH v3 7/8] accel-config/test: Add compl_size for completion record size

Dave Jiang <dave.jiang at intel.com> Fri, 08 Apr 2022 14:31:32 -0700
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
On 4/8/2022 5:30 AM, Li Zhang wrote:
> DSA and IAA test need to get completion record size for allocating
> and dumping completion record. DSA completion record is 32 bytes
> while IAA completion record is 64 bytes. So init compl_size field in
> struct accfg_device for using by DSA and IAA test code, modify
> DSA test code for using compl_size.
>
> Signed-off-by: Li Zhang <li4.zhang(a)intel.com>
> Reviewed-by: Dave Jiang <dave.jiang(a)intel.com>
> ---
>   accfg/lib/libaccel-config.sym |  1 +
>   accfg/lib/libaccfg.c          | 23 ++++++++++++++++++
>   accfg/lib/private.h           |  1 +
>   accfg/libaccel_config.h       |  6 +++++

Need to split the accel-config changes from the test changes. The 
accel-config changes can be 2 patches. One setup the accfg_device and 
the second exports the API calls.

accel-config: Add completion record size setup for accfg_device

accel-config: Export API to retrieve completion record for the device

accel-config: test: .....

>   test/dsa.c                    | 45 ++++++++++++++++++-----------------
>   test/dsa.h                    | 16 +++++++------
>   test/dsa_test.c               |  4 ++--
>   7 files changed, 65 insertions(+), 31 deletions(-)
>
> diff --git a/accfg/lib/libaccel-config.sym b/accfg/lib/libaccel-config.sym
> index fde9251..b85b9b5 100644
> --- a/accfg/lib/libaccel-config.sym
> +++ b/accfg/lib/libaccel-config.sym
> @@ -22,6 +22,7 @@ LIBACCFG_1 {
>   	accfg_device_get_ims_size;
>   	accfg_device_get_max_batch_size;
>   	accfg_device_get_max_transfer_size;
> +	accfg_device_get_compl_size;
This needs to be in a different symbol block. You can't just add to the 
existing one. Every release needs to rev the API symbol revision.
>   	accfg_device_get_configurable;
>   	accfg_device_get_pasid_enabled;
>   	accfg_device_get_errors;
> diff --git a/accfg/lib/libaccfg.c b/accfg/lib/libaccfg.c
> index 8d883b1..7e789b4 100644
> --- a/accfg/lib/libaccfg.c
> +++ b/accfg/lib/libaccfg.c
> @@ -547,6 +547,19 @@ static int device_parse_type(struct accfg_device *device)
>   	return -ENODEV;
>   }
>   
> +/*set completion record size*/
> +static int device_parse_compl_size(struct accfg_device *device)
device_set_completion_record_size().
> +{
> +	if (device->type == ACCFG_DEVICE_DSA)
> +		device->compl_size = ACCFG_DEVICE_COMPL_SIZE_DSA;
> +	else if (device->type == ACCFG_DEVICE_IAX)
> +		device->compl_size = ACCFG_DEVICE_COMPL_SIZE_IAX;
> +	else
> +		return -ENODEV;
> +
> +	return 0;
> +}
> +
>   static int mdev_str_to_type(char *mdev_type_str)
>   {
>   	char **b;
> @@ -706,6 +719,10 @@ static void *add_device(void *parent, int id, const char *ctl_base,
>   	if (rc < 0)
>   		goto err_dev_path;
>   
> +	rc = device_parse_compl_size(device);
> +	if (rc < 0)
> +		goto err_dev_path;
> +
>   	device->bus_type_str = bus_type;
>   
>   	if (is_mdev_registered(device) && add_device_mdevs(ctx, device))
> @@ -1340,6 +1357,12 @@ ACCFG_EXPORT uint64_t accfg_device_get_max_transfer_size(
>   	return device->max_transfer_size;
>   }
>   
> +/* Helper function to retrieve completion record size */
> +ACCFG_EXPORT unsigned int accfg_device_get_compl_size(struct accfg_device *device)
> +{
> +	return device->compl_size;
> +}
> +
>   ACCFG_EXPORT int accfg_device_get_op_cap(struct accfg_device *device,
>   		struct accfg_op_cap *op_cap)
>   {
> diff --git a/accfg/lib/private.h b/accfg/lib/private.h
> index f88044c..edbae10 100644
> --- a/accfg/lib/private.h
> +++ b/accfg/lib/private.h
> @@ -55,6 +55,7 @@ struct accfg_device {
>   	uint64_t opcap;
>   	uint64_t gencap;
>   	char *pasid_enabled;
> +	unsigned int compl_size;
>   };
>   
>   struct accfg_device_mdev {
> diff --git a/accfg/libaccel_config.h b/accfg/libaccel_config.h
> index 9e952a7..5cb49ce 100644
> --- a/accfg/libaccel_config.h
> +++ b/accfg/libaccel_config.h
> @@ -45,6 +45,11 @@ enum accfg_device_state {
>   	ACCFG_DEVICE_UNKNOWN = -1,
>   };
>   
> +enum accfg_device_compl_size {
> +	ACCFG_DEVICE_COMPL_SIZE_DSA = 32,
> +	ACCFG_DEVICE_COMPL_SIZE_IAX = 64,
> +};
> +
>   enum accfg_wq_mode {
>   	ACCFG_WQ_SHARED = 0,
>   	ACCFG_WQ_DEDICATED,
> @@ -183,6 +188,7 @@ int accfg_device_get_numa_node(struct accfg_device *device);
>   unsigned int accfg_device_get_ims_size(struct accfg_device *device);
>   unsigned int accfg_device_get_max_batch_size(struct accfg_device *device);
>   uint64_t accfg_device_get_max_transfer_size(struct accfg_device *device);
> +unsigned int accfg_device_get_compl_size(struct accfg_device *device);
>   int accfg_device_get_op_cap(struct accfg_device *device,
>   		struct accfg_op_cap *op_cap);
>   uint64_t accfg_device_get_gen_cap(struct accfg_device *device);
> diff --git a/test/dsa.c b/test/dsa.c
> index ec3ceb1..f1ca2e9 100644
> --- a/test/dsa.c
> +++ b/test/dsa.c
> @@ -255,6 +255,7 @@ int acctest_alloc(struct acctest_context *ctx, int shared, int dev_id, int wq_id
>   	ctx->max_batch_size = accfg_device_get_max_batch_size(dev);
>   	ctx->max_xfer_size = accfg_device_get_max_transfer_size(dev);
>   	ctx->max_xfer_bits = bsr(ctx->max_xfer_size);
> +	ctx->compl_size = accfg_device_get_compl_size(dev);
>   
>   	info("alloc wq %d shared %d size %d addr %p batch sz %#x xfer sz %#x\n",
>   	     ctx->wq_idx, ctx->dedicated, ctx->wq_size, ctx->wq_reg,
> @@ -274,7 +275,7 @@ int acctest_alloc_multiple_tasks(struct acctest_context *ctx, int num_itr)
>   		if (!ctx->multi_task_node)
>   			return -ENOMEM;
>   
> -		ctx->multi_task_node->tsk = acctest_alloc_task();
> +		ctx->multi_task_node->tsk = acctest_alloc_task(ctx);
>   		if (!ctx->multi_task_node->tsk)
>   			return -ENOMEM;
>   		ctx->multi_task_node->next = tmp_tsk_node;
> @@ -283,7 +284,7 @@ int acctest_alloc_multiple_tasks(struct acctest_context *ctx, int num_itr)
>   	return ACCTEST_STATUS_OK;
>   }
>   
> -struct task *acctest_alloc_task(void)
> +struct task *acctest_alloc_task(struct acctest_context *ctx)
>   {
>   	struct task *tsk;
>   
> @@ -299,8 +300,7 @@ struct task *acctest_alloc_task(void)
>   	}
>   	memset(tsk->desc, 0, sizeof(struct hw_desc));
>   
> -	/* To be compatible with IAX, completion record need to be 64-byte aligned */
> -	tsk->comp = aligned_alloc(64, sizeof(struct completion_record));
> +	tsk->comp = aligned_alloc(ctx->compl_size, sizeof(struct completion_record));
>   	if (!tsk->comp) {
>   		free_task(tsk);
>   		return NULL;
> @@ -815,7 +815,7 @@ int alloc_batch_task(struct acctest_context *ctx, unsigned int task_num, int num
>   
>   		btsk = ctx->multi_btask_node->btsk;
>   
> -		btsk->core_task = acctest_alloc_task();
> +		btsk->core_task = acctest_alloc_task(ctx);
>   		if (!btsk->core_task)
>   			return -ENOMEM;
>   
> @@ -912,6 +912,7 @@ static inline int umwait(unsigned long timeout, unsigned int state)
>   }
>   
>   static int acctest_wait_on_desc_timeout(struct completion_record *comp,
> +					struct acctest_context *ctx,
>   					unsigned int msec_timeout)
>   {
>   	unsigned int j = 0;
> @@ -945,7 +946,7 @@ static int acctest_wait_on_desc_timeout(struct completion_record *comp,
>   			j = msec_timeout;
>   	}
>   
> -	dump_compl_rec(comp);
> +	dump_compl_rec(comp, ctx->compl_size);
>   
>   	return (j == msec_timeout) ? -EAGAIN : 0;
>   }
> @@ -1088,7 +1089,7 @@ int dsa_wait_noop(struct acctest_context *ctx, struct task *tsk)
>   	struct completion_record *comp = tsk->comp;
>   	int rc;
>   
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("noop desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1127,7 +1128,7 @@ int dsa_noop_multi_task_nodes(struct acctest_context *ctx)
>   	return ret;
>   }
>   
> -int dsa_wait_batch(struct batch_task *btsk)
> +int dsa_wait_batch(struct batch_task *btsk, struct acctest_context *ctx)
>   {
>   	int rc;
>   
> @@ -1135,13 +1136,13 @@ int dsa_wait_batch(struct batch_task *btsk)
>   
>   	info("wait batch\n");
>   
> -	rc = acctest_wait_on_desc_timeout(ctsk->comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(ctsk->comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("batch desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
>   	}
>   
> -	dump_sub_compl_rec(btsk);
> +	dump_sub_compl_rec(btsk, ctx->compl_size);
>   	return ACCTEST_STATUS_OK;
>   }
>   
> @@ -1150,7 +1151,7 @@ int dsa_wait_drain(struct acctest_context *ctx, struct task *tsk)
>   	struct completion_record *comp = tsk->comp;
>   	int rc;
>   
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("drain desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1197,7 +1198,7 @@ int dsa_wait_memcpy(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("memcpy desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1253,7 +1254,7 @@ int dsa_wait_memfill(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   
>   	if (rc < 0) {
>   		err("memfill desc timeout\n");
> @@ -1310,7 +1311,7 @@ int dsa_wait_compare(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   
>   	if (rc < 0) {
>   		err("compare desc timeout\n");
> @@ -1367,7 +1368,7 @@ int dsa_wait_compval(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   
>   	if (rc < 0) {
>   		err("compval desc timeout\n");
> @@ -1424,7 +1425,7 @@ int dsa_wait_dualcast(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("dualcast desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1480,7 +1481,7 @@ int dsa_wait_cr_delta(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("memcpy desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1536,7 +1537,7 @@ int dsa_wait_ap_delta(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("memcpy desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1592,7 +1593,7 @@ int dsa_wait_crcgen(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("CRC desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1648,7 +1649,7 @@ int dsa_wait_crc_copy(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("CRC copy desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1704,7 +1705,7 @@ int dsa_wait_dif(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("DIF desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> @@ -1857,7 +1858,7 @@ int dsa_wait_cflush(struct acctest_context *ctx, struct task *tsk)
>   	int rc;
>   
>   again:
> -	rc = acctest_wait_on_desc_timeout(comp, ms_timeout);
> +	rc = acctest_wait_on_desc_timeout(comp, ctx, ms_timeout);
>   	if (rc < 0) {
>   		err("cflush desc timeout\n");
>   		return ACCTEST_STATUS_TIMEOUT;
> diff --git a/test/dsa.h b/test/dsa.h
> index e6205c5..496abb2 100644
> --- a/test/dsa.h
> +++ b/test/dsa.h
> @@ -136,6 +136,7 @@ struct acctest_context {
>   	unsigned int max_batch_size;
>   	unsigned int max_xfer_size;
>   	unsigned int max_xfer_bits;
> +	unsigned int compl_size;
>   
>   	int fd;
>   	int wq_idx;
> @@ -230,26 +231,27 @@ static inline void dump_sub_desc(struct batch_task *btsk)
>   }
>   
>   /* Dump DSA completion record to log */
> -static inline void dump_compl_rec(struct completion_record *compl)
> +static inline void dump_compl_rec(struct completion_record *compl, int compl_size)
>   {
> -	struct raw_completion_record *rcompl = (void *)compl;
>   	int i;
> +	struct raw_completion_record *rcompl = (void *)compl;
> +	int num_qword = compl_size / sizeof(uint64_t);
>   
>   	dbg("completion record addr: %p\n", compl);
>   
>   	/* To be compatible with IAX, completion record was allocated 64 bytes*/
> -	for (i = 0; i < 8; i++)
> +	for (i = 0; i < num_qword; i++)
>   		dbg("compl[%d]: 0x%016lx\n", i, rcompl->field[i]);
>   }
>   
>   /* dump all sub completion records for a batch task */
> -static inline void dump_sub_compl_rec(struct batch_task *btsk)
> +static inline void dump_sub_compl_rec(struct batch_task *btsk, int compl_size)
>   {
>   	int i;
>   
>   	for (i = 0; i < btsk->task_num; i++) {
>   		dbg("sub_comp[%d]:\n", i);
> -		dump_compl_rec(btsk->sub_tasks[i].comp);
> +		dump_compl_rec(btsk->sub_tasks[i].comp, compl_size);
>   	}
>   }
>   
> @@ -274,7 +276,7 @@ int acctest_enqcmd(struct acctest_context *ctx, struct hw_desc *hw);
>   struct acctest_context *acctest_init(void);
>   int acctest_alloc(struct acctest_context *ctx, int shared, int dev_id, int wq_id);
>   int acctest_alloc_multiple_tasks(struct acctest_context *ctx, int num_itr);
> -struct task *acctest_alloc_task(void);
> +struct task *acctest_alloc_task(struct acctest_context *ctx);
>   int init_memcpy(struct task *tsk, int tflags, int opcode, unsigned long xfer_size);
>   int init_memfill(struct task *tsk, int tflags, int opcode, unsigned long xfer_size);
>   int init_compare(struct task *tsk, int tflags, int opcode, unsigned long xfer_size);
> @@ -395,7 +397,7 @@ void dsa_prep_batch_dif_insert(struct batch_task *btsk);
>   void dsa_prep_batch_dif_strip(struct batch_task *btsk);
>   void dsa_prep_batch_dif_update(struct batch_task *btsk);
>   void dsa_prep_batch_cflush(struct batch_task *btsk);
> -int dsa_wait_batch(struct batch_task *btsk);
> +int dsa_wait_batch(struct batch_task *btsk, struct acctest_context *ctx);
>   
>   void acctest_free(struct acctest_context *ctx);
>   void acctest_free_task(struct acctest_context *ctx);
> diff --git a/test/dsa_test.c b/test/dsa_test.c
> index e882f6c..0c84190 100644
> --- a/test/dsa_test.c
> +++ b/test/dsa_test.c
> @@ -154,7 +154,7 @@ static int test_batch(struct acctest_context *ctx, size_t buf_size,
>   
>   		btsk_node = ctx->multi_btask_node;
>   		while (btsk_node) {
> -			rc = dsa_wait_batch(btsk_node->btsk);
> +			rc = dsa_wait_batch(btsk_node->btsk, ctx);
>   			if (rc != ACCTEST_STATUS_OK) {
>   				err("batch failed stat %d\n", rc);
>   				return rc;
> @@ -185,7 +185,7 @@ static int test_batch(struct acctest_context *ctx, size_t buf_size,
>   
>   			btsk_node = ctx->multi_btask_node;
>   			while (btsk_node) {
> -				rc = dsa_wait_batch(btsk_node->btsk);
> +				rc = dsa_wait_batch(btsk_node->btsk, ctx);
>   				if (rc != ACCTEST_STATUS_OK) {
>   					err("batch failed stat %d\n", rc);
>   					return rc;