[v3] test/crypto: fix enqueue dequeue callback case
Checks
Commit Message
The enqueue/dequeue callback test cases were using the
test_null_burst_operation() for doing enqueue/dequeue.
But this function is only designed to be run for NULL PMD.
Hence for other PMDs, the callback was not getting called.
Now, separate processing thread is removed, instead NULL crypto
operation is created and processed so that callbacks are called.
Also added a check on a global static variable to verify
that the callback is actually called and fail the case if
it is not getting called.
Fixes: 5523a75af539 ("test/crypto: add case for enqueue/dequeue callbacks")
Cc: stable@dpdk.org
Signed-off-by: Akhil Goyal <gakhil@marvell.com>
---
-v3: replaced AES-SHA1 with NULL crypto and removed separate thread.
app/test/test_cryptodev.c | 106 ++++++++++++++++++++++++++++++++------
1 file changed, 89 insertions(+), 17 deletions(-)
Comments
Tested cryptodev_qat_autotest and cryptodev_null_autotest this patch along with https://patches.dpdk.org/project/dpdk/patch/20240416081222.3002268-1-ganapati.kundapura@intel.com/, callbacks are getting called for both NULL pmd and qat pmd.
Acked-by: Ganapati Kundapura <ganapati.kundapura@intel.com>
Thanks,
Ganapati
> -----Original Message-----
> From: Akhil Goyal <gakhil@marvell.com>
> Sent: Friday, May 24, 2024 10:43 PM
> To: dev@dpdk.org
> Cc: Kundapura, Ganapati <ganapati.kundapura@intel.com>; Gujjar,
> Abhinandan S <abhinandan.gujjar@intel.com>; fanzhang.oss@gmail.com;
> anoobj@marvell.com; Akhil Goyal <gakhil@marvell.com>; stable@dpdk.org
> Subject: [PATCH v3] test/crypto: fix enqueue dequeue callback case
>
> The enqueue/dequeue callback test cases were using the
> test_null_burst_operation() for doing enqueue/dequeue.
> But this function is only designed to be run for NULL PMD.
> Hence for other PMDs, the callback was not getting called.
> Now, separate processing thread is removed, instead NULL crypto operation is
> created and processed so that callbacks are called.
> Also added a check on a global static variable to verify that the callback is
> actually called and fail the case if it is not getting called.
>
> Fixes: 5523a75af539 ("test/crypto: add case for enqueue/dequeue callbacks")
> Cc: stable@dpdk.org
>
> Signed-off-by: Akhil Goyal <gakhil@marvell.com>
> ---
> -v3: replaced AES-SHA1 with NULL crypto and removed separate thread.
>
> app/test/test_cryptodev.c | 106 ++++++++++++++++++++++++++++++++--
> ----
> 1 file changed, 89 insertions(+), 17 deletions(-)
>
> diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c index
> 1703ebccf1..b644e87106 100644
> --- a/app/test/test_cryptodev.c
> +++ b/app/test/test_cryptodev.c
> @@ -199,6 +199,8 @@ post_process_raw_dp_op(void *user_data,
> uint32_t index __rte_unused,
> static struct crypto_testsuite_params testsuite_params = { NULL }; struct
> crypto_testsuite_params *p_testsuite_params = &testsuite_params; static
> struct crypto_unittest_params unittest_params;
> +static bool enq_cb_called;
> +static bool deq_cb_called;
>
> int
> process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, @@ -14556,6
> +14558,7 @@ test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct
> rte_crypto_op **ops,
> RTE_SET_USED(ops);
> RTE_SET_USED(user_param);
>
> + enq_cb_called = true;
> printf("crypto enqueue callback called\n");
> return nb_ops;
> }
> @@ -14569,21 +14572,58 @@ test_deq_callback(uint16_t dev_id, uint16_t
> qp_id, struct rte_crypto_op **ops,
> RTE_SET_USED(ops);
> RTE_SET_USED(user_param);
>
> + deq_cb_called = true;
> printf("crypto dequeue callback called\n");
> return nb_ops;
> }
>
> /*
> - * Thread using enqueue/dequeue callback with RCU.
> + * Process enqueue/dequeue NULL crypto request to verify callback with
> RCU.
> */
> static int
> -test_enqdeq_callback_thread(void *arg)
> +test_enqdeq_callback_null_cipher(void)
> {
> - RTE_SET_USED(arg);
> - /* DP thread calls rte_cryptodev_enqueue_burst()/
> - * rte_cryptodev_dequeue_burst() and invokes callback.
> - */
> - test_null_burst_operation();
> + struct crypto_testsuite_params *ts_params = &testsuite_params;
> + struct crypto_unittest_params *ut_params = &unittest_params;
> +
> + /* Setup Cipher Parameters */
> + ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
> + ut_params->cipher_xform.next = &ut_params->auth_xform;
> +
> + ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
> + ut_params->cipher_xform.cipher.op =
> RTE_CRYPTO_CIPHER_OP_ENCRYPT;
> +
> + /* Setup HMAC Parameters */
> + ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
> + ut_params->auth_xform.next = NULL;
> +
> + ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
> + ut_params->auth_xform.auth.op =
> RTE_CRYPTO_AUTH_OP_GENERATE;
> +
> + /* Create Crypto session*/
> + ut_params->sess = rte_cryptodev_sym_session_create(ts_params-
> >valid_devs[0],
> + &ut_params->auth_xform, ts_params-
> >session_mpool);
> + TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
> +
> + ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
> RTE_CRYPTO_OP_TYPE_SYMMETRIC);
> + TEST_ASSERT_NOT_NULL(ut_params->op, "Failed to allocate
> symmetric
> +crypto op");
> +
> + /* Generate an operation for each mbuf in burst */
> + ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
> + TEST_ASSERT_NOT_NULL(ut_params->ibuf, "Failed to allocate mbuf");
> +
> + /* Append some random data */
> + TEST_ASSERT_NOT_NULL(rte_pktmbuf_append(ut_params->ibuf,
> sizeof(unsigned int)),
> + "no room to append data");
> +
> + rte_crypto_op_attach_sym_session(ut_params->op, ut_params-
> >sess);
> +
> + ut_params->op->sym->m_src = ut_params->ibuf;
> +
> + /* Process crypto operation */
> + TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params-
> >valid_devs[0], ut_params->op),
> + "failed to process sym crypto op");
> +
> return 0;
> }
>
> @@ -14591,6 +14631,7 @@ static int
> test_enq_callback_setup(void)
> {
> struct crypto_testsuite_params *ts_params = &testsuite_params;
> + struct rte_cryptodev_sym_capability_idx cap_idx;
> struct rte_cryptodev_info dev_info;
> struct rte_cryptodev_qp_conf qp_conf = {
> .nb_descriptors = MAX_NUM_OPS_INFLIGHT @@ -14598,6
> +14639,19 @@ test_enq_callback_setup(void)
>
> struct rte_cryptodev_cb *cb;
> uint16_t qp_id = 0;
> + int j = 0;
> +
> + /* Verify the crypto capabilities for which enqueue/dequeue is done.
> */
> + cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
> + cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
> + if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
> + &cap_idx) == NULL)
> + return TEST_SKIPPED;
> + cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
> + cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
> + if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
> + &cap_idx) == NULL)
> + return TEST_SKIPPED;
>
> /* Stop the device in case it's started so it can be configured */
> rte_cryptodev_stop(ts_params->valid_devs[0]);
> @@ -14621,6 +14675,7 @@ test_enq_callback_setup(void)
> qp_conf.nb_descriptors, qp_id,
> ts_params->valid_devs[0]);
>
> + enq_cb_called = false;
> /* Test with invalid crypto device */
> cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
> qp_id, test_enq_callback, NULL);
> @@ -14653,12 +14708,11 @@ test_enq_callback_setup(void)
>
> rte_cryptodev_start(ts_params->valid_devs[0]);
>
> - /* Launch a thread */
> - rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
> - rte_get_next_lcore(-1, 1, 0));
> + TEST_ASSERT_SUCCESS(test_enqdeq_callback_null_cipher(), "Crypto
> +Processing failed");
>
> - /* Wait until reader exited. */
> - rte_eal_mp_wait_lcore();
> + /* Wait until callback not called. */
> + while (!enq_cb_called && (j++ < 10))
> + rte_delay_ms(10);
>
> /* Test with invalid crypto device */
> TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
> @@ -14683,6 +14737,8 @@ test_enq_callback_setup(void)
> "qp %u on cryptodev %u",
> qp_id, ts_params->valid_devs[0]);
>
> + TEST_ASSERT(enq_cb_called == true, "Crypto enqueue callback not
> +called");
> +
> return TEST_SUCCESS;
> }
>
> @@ -14690,6 +14746,7 @@ static int
> test_deq_callback_setup(void)
> {
> struct crypto_testsuite_params *ts_params = &testsuite_params;
> + struct rte_cryptodev_sym_capability_idx cap_idx;
> struct rte_cryptodev_info dev_info;
> struct rte_cryptodev_qp_conf qp_conf = {
> .nb_descriptors = MAX_NUM_OPS_INFLIGHT @@ -14697,6
> +14754,19 @@ test_deq_callback_setup(void)
>
> struct rte_cryptodev_cb *cb;
> uint16_t qp_id = 0;
> + int j = 0;
> +
> + /* Verify the crypto capabilities for which enqueue/dequeue is done.
> */
> + cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
> + cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
> + if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
> + &cap_idx) == NULL)
> + return TEST_SKIPPED;
> + cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
> + cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
> + if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
> + &cap_idx) == NULL)
> + return TEST_SKIPPED;
>
> /* Stop the device in case it's started so it can be configured */
> rte_cryptodev_stop(ts_params->valid_devs[0]);
> @@ -14720,6 +14790,7 @@ test_deq_callback_setup(void)
> qp_conf.nb_descriptors, qp_id,
> ts_params->valid_devs[0]);
>
> + deq_cb_called = false;
> /* Test with invalid crypto device */
> cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
> qp_id, test_deq_callback, NULL);
> @@ -14752,12 +14823,11 @@ test_deq_callback_setup(void)
>
> rte_cryptodev_start(ts_params->valid_devs[0]);
>
> - /* Launch a thread */
> - rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
> - rte_get_next_lcore(-1, 1, 0));
> + TEST_ASSERT_SUCCESS(test_enqdeq_callback_null_cipher(), "Crypto
> +processing failed");
>
> - /* Wait until reader exited. */
> - rte_eal_mp_wait_lcore();
> + /* Wait until callback not called. */
> + while (!deq_cb_called && (j++ < 10))
> + rte_delay_ms(10);
>
> /* Test with invalid crypto device */
> TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
> @@ -14782,6 +14852,8 @@ test_deq_callback_setup(void)
> "qp %u on cryptodev %u",
> qp_id, ts_params->valid_devs[0]);
>
> + TEST_ASSERT(deq_cb_called == true, "Crypto dequeue callback not
> +called");
> +
> return TEST_SUCCESS;
> }
>
> --
> 2.25.1
> Tested cryptodev_qat_autotest and cryptodev_null_autotest this patch along
> with https://patches.dpdk.org/project/dpdk/patch/20240416081222.3002268-1-ganapati.kundapura@intel.com/ , callbacks are getting called for both NULL pmd and qat
> pmd.
>
> Acked-by: Ganapati Kundapura <ganapati.kundapura@intel.com>
Applied to dpdk-next-crypto
Fixed a couple of minor typos in comments.
@@ -199,6 +199,8 @@ post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
static struct crypto_testsuite_params testsuite_params = { NULL };
struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
static struct crypto_unittest_params unittest_params;
+static bool enq_cb_called;
+static bool deq_cb_called;
int
process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
@@ -14556,6 +14558,7 @@ test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
RTE_SET_USED(ops);
RTE_SET_USED(user_param);
+ enq_cb_called = true;
printf("crypto enqueue callback called\n");
return nb_ops;
}
@@ -14569,21 +14572,58 @@ test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
RTE_SET_USED(ops);
RTE_SET_USED(user_param);
+ deq_cb_called = true;
printf("crypto dequeue callback called\n");
return nb_ops;
}
/*
- * Thread using enqueue/dequeue callback with RCU.
+ * Process enqueue/dequeue NULL crypto request to verify callback with RCU.
*/
static int
-test_enqdeq_callback_thread(void *arg)
+test_enqdeq_callback_null_cipher(void)
{
- RTE_SET_USED(arg);
- /* DP thread calls rte_cryptodev_enqueue_burst()/
- * rte_cryptodev_dequeue_burst() and invokes callback.
- */
- test_null_burst_operation();
+ struct crypto_testsuite_params *ts_params = &testsuite_params;
+ struct crypto_unittest_params *ut_params = &unittest_params;
+
+ /* Setup Cipher Parameters */
+ ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
+ ut_params->cipher_xform.next = &ut_params->auth_xform;
+
+ ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
+ ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
+
+ /* Setup HMAC Parameters */
+ ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
+ ut_params->auth_xform.next = NULL;
+
+ ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
+ ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
+
+ /* Create Crypto session*/
+ ut_params->sess = rte_cryptodev_sym_session_create(ts_params->valid_devs[0],
+ &ut_params->auth_xform, ts_params->session_mpool);
+ TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
+
+ ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
+ TEST_ASSERT_NOT_NULL(ut_params->op, "Failed to allocate symmetric crypto op");
+
+ /* Generate an operation for each mbuf in burst */
+ ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
+ TEST_ASSERT_NOT_NULL(ut_params->ibuf, "Failed to allocate mbuf");
+
+ /* Append some random data */
+ TEST_ASSERT_NOT_NULL(rte_pktmbuf_append(ut_params->ibuf, sizeof(unsigned int)),
+ "no room to append data");
+
+ rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
+
+ ut_params->op->sym->m_src = ut_params->ibuf;
+
+ /* Process crypto operation */
+ TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], ut_params->op),
+ "failed to process sym crypto op");
+
return 0;
}
@@ -14591,6 +14631,7 @@ static int
test_enq_callback_setup(void)
{
struct crypto_testsuite_params *ts_params = &testsuite_params;
+ struct rte_cryptodev_sym_capability_idx cap_idx;
struct rte_cryptodev_info dev_info;
struct rte_cryptodev_qp_conf qp_conf = {
.nb_descriptors = MAX_NUM_OPS_INFLIGHT
@@ -14598,6 +14639,19 @@ test_enq_callback_setup(void)
struct rte_cryptodev_cb *cb;
uint16_t qp_id = 0;
+ int j = 0;
+
+ /* Verify the crypto capabilities for which enqueue/dequeue is done. */
+ cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
+ cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
+ if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
+ &cap_idx) == NULL)
+ return TEST_SKIPPED;
+ cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
+ cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
+ if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
+ &cap_idx) == NULL)
+ return TEST_SKIPPED;
/* Stop the device in case it's started so it can be configured */
rte_cryptodev_stop(ts_params->valid_devs[0]);
@@ -14621,6 +14675,7 @@ test_enq_callback_setup(void)
qp_conf.nb_descriptors, qp_id,
ts_params->valid_devs[0]);
+ enq_cb_called = false;
/* Test with invalid crypto device */
cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
qp_id, test_enq_callback, NULL);
@@ -14653,12 +14708,11 @@ test_enq_callback_setup(void)
rte_cryptodev_start(ts_params->valid_devs[0]);
- /* Launch a thread */
- rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
- rte_get_next_lcore(-1, 1, 0));
+ TEST_ASSERT_SUCCESS(test_enqdeq_callback_null_cipher(), "Crypto Processing failed");
- /* Wait until reader exited. */
- rte_eal_mp_wait_lcore();
+ /* Wait until callback not called. */
+ while (!enq_cb_called && (j++ < 10))
+ rte_delay_ms(10);
/* Test with invalid crypto device */
TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
@@ -14683,6 +14737,8 @@ test_enq_callback_setup(void)
"qp %u on cryptodev %u",
qp_id, ts_params->valid_devs[0]);
+ TEST_ASSERT(enq_cb_called == true, "Crypto enqueue callback not called");
+
return TEST_SUCCESS;
}
@@ -14690,6 +14746,7 @@ static int
test_deq_callback_setup(void)
{
struct crypto_testsuite_params *ts_params = &testsuite_params;
+ struct rte_cryptodev_sym_capability_idx cap_idx;
struct rte_cryptodev_info dev_info;
struct rte_cryptodev_qp_conf qp_conf = {
.nb_descriptors = MAX_NUM_OPS_INFLIGHT
@@ -14697,6 +14754,19 @@ test_deq_callback_setup(void)
struct rte_cryptodev_cb *cb;
uint16_t qp_id = 0;
+ int j = 0;
+
+ /* Verify the crypto capabilities for which enqueue/dequeue is done. */
+ cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
+ cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
+ if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
+ &cap_idx) == NULL)
+ return TEST_SKIPPED;
+ cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
+ cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
+ if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
+ &cap_idx) == NULL)
+ return TEST_SKIPPED;
/* Stop the device in case it's started so it can be configured */
rte_cryptodev_stop(ts_params->valid_devs[0]);
@@ -14720,6 +14790,7 @@ test_deq_callback_setup(void)
qp_conf.nb_descriptors, qp_id,
ts_params->valid_devs[0]);
+ deq_cb_called = false;
/* Test with invalid crypto device */
cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
qp_id, test_deq_callback, NULL);
@@ -14752,12 +14823,11 @@ test_deq_callback_setup(void)
rte_cryptodev_start(ts_params->valid_devs[0]);
- /* Launch a thread */
- rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
- rte_get_next_lcore(-1, 1, 0));
+ TEST_ASSERT_SUCCESS(test_enqdeq_callback_null_cipher(), "Crypto processing failed");
- /* Wait until reader exited. */
- rte_eal_mp_wait_lcore();
+ /* Wait until callback not called. */
+ while (!deq_cb_called && (j++ < 10))
+ rte_delay_ms(10);
/* Test with invalid crypto device */
TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
@@ -14782,6 +14852,8 @@ test_deq_callback_setup(void)
"qp %u on cryptodev %u",
qp_id, ts_params->valid_devs[0]);
+ TEST_ASSERT(deq_cb_called == true, "Crypto dequeue callback not called");
+
return TEST_SUCCESS;
}