From: Akhil Goyal <gakhil@marvell.com>
To: Fan Zhang <roy.fan.zhang@intel.com>, "dev@dpdk.org" <dev@dpdk.org>
Cc: "maxime.coquelin@redhat.com" <maxime.coquelin@redhat.com>,
"chandu@amd.com" <chandu@amd.com>,
"ruifeng.wang@arm.com" <ruifeng.wang@arm.com>,
"ajit.khaparde@broadcom.com" <ajit.khaparde@broadcom.com>,
Anoob Joseph <anoobj@marvell.com>,
"pablo.de.lara.guarch@intel.com" <pablo.de.lara.guarch@intel.com>,
"matan@nvidia.com" <matan@nvidia.com>,
"g.singh@nxp.com" <g.singh@nxp.com>,
"jianjay.zhou@huawei.com" <jianjay.zhou@huawei.com>
Subject: RE: [EXT] [PATCH 2/3] crypto/scheduler: use unified session
Date: Thu, 15 Sep 2022 07:06:23 +0000 [thread overview]
Message-ID: <CO6PR18MB44844EF8C44ABE611F954C3ED8499@CO6PR18MB4484.namprd18.prod.outlook.com> (raw)
In-Reply-To: <20220829160645.378406-3-roy.fan.zhang@intel.com>
Hi Fan,
Are these patches getting compiled at your end? Are these a working patchset on Intel platform?
For me it is failing for each of the patch
'drivers/a715181@@tmp_rte_crypto_scheduler@sta/crypto_scheduler_scheduler_pmd_ops.c.o' -MF 'drivers/a715181@@tmp_rte_crypto_scheduler@sta/crypto_scheduler_scheduler_pmd_ops.c.o.d' -o 'drivers/a715181@@tmp_rte_crypto_scheduler@sta/crypto_scheduler_scheduler_pmd_ops.c.o' -c ../drivers/crypto/scheduler/scheduler_pmd_ops.c
../drivers/crypto/scheduler/scheduler_pmd_ops.c: In function 'scheduler_pmd_sym_session_configure':
../drivers/crypto/scheduler/scheduler_pmd_ops.c:525:1: error: label at end of compound statement
525 | next_worker:
| ^~~~~~~~~~~
../drivers/crypto/scheduler/scheduler_pmd_ops.c: In function 'scheduler_pmd_sym_session_clear':
../drivers/crypto/scheduler/scheduler_pmd_ops.c:569:1: error: label at end of compound statement
569 | next_worker:
| ^~~~~~~~~~~
> This patch updates the scheduler PMD to use unified session
> data structure. Previously thanks to the private session
> array in cryptodev sym session there are no necessary
> change needed for scheduler PMD other than the way ops
> are enqueued/dequeued. The patch inherits the same design
> in the original session data structure to the scheduler PMD
> so the cryptodev sym session can be as a linear buffer for
> both session header and driver private data.
>
> With the change there are inevitable extra cost on both memory
> (64 bytes per session per driver type) and cycle count (set
> the correct session for each cop based on the worker before
> enqueue, and retrieve the original session after dequeue).
>
> Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
> ---
> app/test/test_cryptodev.c | 4 +-
> drivers/crypto/scheduler/scheduler_failover.c | 19 ++-
> .../crypto/scheduler/scheduler_multicore.c | 17 +++
> .../scheduler/scheduler_pkt_size_distr.c | 84 +++++++++---
> drivers/crypto/scheduler/scheduler_pmd_ops.c | 101 ++++++++++++++-
> .../crypto/scheduler/scheduler_pmd_private.h | 120 +++++++++++++++++-
> .../crypto/scheduler/scheduler_roundrobin.c | 11 +-
> 7 files changed, 314 insertions(+), 42 deletions(-)
>
> diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c
> index c975c38001..e181b0aa3e 100644
> --- a/app/test/test_cryptodev.c
> +++ b/app/test/test_cryptodev.c
> @@ -14986,8 +14986,8 @@ test_scheduler_attach_worker_op(void)
> ts_params->session_mpool =
> rte_cryptodev_sym_session_pool_create(
> "test_sess_mp",
> - MAX_NB_SESSIONS, 0, 0, 0,
> - SOCKET_ID_ANY);
> + MAX_NB_SESSIONS,
> session_size,
> + 0, 0, SOCKET_ID_ANY);
> TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
> "session mempool allocation failed");
> }
> diff --git a/drivers/crypto/scheduler/scheduler_failover.c
> b/drivers/crypto/scheduler/scheduler_failover.c
> index 2a0e29fa72..7fadcf66d0 100644
> --- a/drivers/crypto/scheduler/scheduler_failover.c
> +++ b/drivers/crypto/scheduler/scheduler_failover.c
> @@ -16,18 +16,19 @@
> struct fo_scheduler_qp_ctx {
> struct scheduler_worker primary_worker;
> struct scheduler_worker secondary_worker;
> + uint8_t primary_worker_index;
> + uint8_t secondary_worker_index;
>
> uint8_t deq_idx;
> };
>
> static __rte_always_inline uint16_t
> failover_worker_enqueue(struct scheduler_worker *worker,
> - struct rte_crypto_op **ops, uint16_t nb_ops)
> + struct rte_crypto_op **ops, uint16_t nb_ops, uint8_t index)
> {
> - uint16_t i, processed_ops;
> + uint16_t processed_ops;
>
> - for (i = 0; i < nb_ops && i < 4; i++)
> - rte_prefetch0(ops[i]->sym->session);
> + scheduler_set_worker_session(ops, nb_ops, index);
>
> processed_ops = rte_cryptodev_enqueue_burst(worker->dev_id,
> worker->qp_id, ops, nb_ops);
> @@ -47,13 +48,14 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> return 0;
>
> enqueued_ops = failover_worker_enqueue(&qp_ctx->primary_worker,
> - ops, nb_ops);
> + ops, nb_ops, PRIMARY_WORKER_IDX);
>
> if (enqueued_ops < nb_ops)
> enqueued_ops += failover_worker_enqueue(
> &qp_ctx->secondary_worker,
> &ops[enqueued_ops],
> - nb_ops - enqueued_ops);
> + nb_ops - enqueued_ops,
> + SECONDARY_WORKER_IDX);
>
> return enqueued_ops;
> }
> @@ -94,7 +96,7 @@ schedule_dequeue(void *qp, struct rte_crypto_op **ops,
> uint16_t nb_ops)
> qp_ctx->deq_idx = (~qp_ctx->deq_idx) & WORKER_SWITCH_MASK;
>
> if (nb_deq_ops == nb_ops)
> - return nb_deq_ops;
> + goto retrieve_session;
>
> worker = workers[qp_ctx->deq_idx];
>
> @@ -104,6 +106,9 @@ schedule_dequeue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> worker->nb_inflight_cops -= nb_deq_ops2;
> }
>
> +retrieve_session:
> + scheduler_retrieve_session(ops, nb_deq_ops + nb_deq_ops2);
> +
> return nb_deq_ops + nb_deq_ops2;
> }
>
> diff --git a/drivers/crypto/scheduler/scheduler_multicore.c
> b/drivers/crypto/scheduler/scheduler_multicore.c
> index 900ab4049d..3dea850661 100644
> --- a/drivers/crypto/scheduler/scheduler_multicore.c
> +++ b/drivers/crypto/scheduler/scheduler_multicore.c
> @@ -183,11 +183,19 @@ mc_scheduler_worker(struct rte_cryptodev *dev)
>
> while (!mc_ctx->stop_signal) {
> if (pending_enq_ops) {
> + scheduler_set_worker_session(
> + &enq_ops[pending_enq_ops_idx],
> pending_enq_ops,
> + worker_idx);
> processed_ops =
> rte_cryptodev_enqueue_burst(worker->dev_id,
> worker->qp_id,
> &enq_ops[pending_enq_ops_idx],
> pending_enq_ops);
> + if (processed_ops < pending_deq_ops)
> + scheduler_retrieve_session(
> + &enq_ops[pending_enq_ops_idx +
> + processed_ops],
> + pending_deq_ops - processed_ops);
> pending_enq_ops -= processed_ops;
> pending_enq_ops_idx += processed_ops;
> inflight_ops += processed_ops;
> @@ -195,9 +203,16 @@ mc_scheduler_worker(struct rte_cryptodev *dev)
> processed_ops = rte_ring_dequeue_burst(enq_ring,
> (void *)enq_ops,
>
> MC_SCHED_BUFFER_SIZE, NULL);
> if (processed_ops) {
> + scheduler_set_worker_session(enq_ops,
> + processed_ops, worker_idx);
> pending_enq_ops_idx =
> rte_cryptodev_enqueue_burst(
> worker->dev_id, worker-
> >qp_id,
> enq_ops, processed_ops);
> + if (pending_enq_ops_idx < processed_ops)
> + scheduler_retrieve_session(
> + enq_ops +
> pending_enq_ops_idx,
> + processed_ops -
> + pending_enq_ops_idx);
> pending_enq_ops = processed_ops -
> pending_enq_ops_idx;
> inflight_ops += pending_enq_ops_idx;
> }
> @@ -214,6 +229,8 @@ mc_scheduler_worker(struct rte_cryptodev *dev)
> worker->dev_id, worker->qp_id,
> deq_ops,
> MC_SCHED_BUFFER_SIZE);
> if (processed_ops) {
> + scheduler_retrieve_session(deq_ops,
> + processed_ops);
> inflight_ops -= processed_ops;
> if (reordering_enabled) {
> uint16_t j;
> diff --git a/drivers/crypto/scheduler/scheduler_pkt_size_distr.c
> b/drivers/crypto/scheduler/scheduler_pkt_size_distr.c
> index 933a5c6978..9204f6f608 100644
> --- a/drivers/crypto/scheduler/scheduler_pkt_size_distr.c
> +++ b/drivers/crypto/scheduler/scheduler_pkt_size_distr.c
> @@ -48,34 +48,54 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> };
> struct psd_schedule_op *p_enq_op;
> uint16_t i, processed_ops_pri = 0, processed_ops_sec = 0;
> - uint32_t job_len;
>
> if (unlikely(nb_ops == 0))
> return 0;
>
> for (i = 0; i < nb_ops && i < 4; i++) {
> rte_prefetch0(ops[i]->sym);
> - rte_prefetch0(ops[i]->sym->session);
> + rte_prefetch0((uint8_t *)ops[i]->sym->session +
> + sizeof(struct rte_cryptodev_sym_session));
> }
>
> for (i = 0; (i < (nb_ops - 8)) && (nb_ops > 8); i += 4) {
> + struct scheduler_session_ctx *sess_ctx[4];
> + uint8_t target[4];
> + uint32_t job_len[4];
> +
> rte_prefetch0(ops[i + 4]->sym);
> - rte_prefetch0(ops[i + 4]->sym->session);
> + rte_prefetch0((uint8_t *)ops[i + 4]->sym->session +
> + sizeof(struct rte_cryptodev_sym_session));
> rte_prefetch0(ops[i + 5]->sym);
> - rte_prefetch0(ops[i + 5]->sym->session);
> + rte_prefetch0((uint8_t *)ops[i + 5]->sym->session +
> + sizeof(struct rte_cryptodev_sym_session));
> rte_prefetch0(ops[i + 6]->sym);
> - rte_prefetch0(ops[i + 6]->sym->session);
> + rte_prefetch0((uint8_t *)ops[i + 6]->sym->session +
> + sizeof(struct rte_cryptodev_sym_session));
> rte_prefetch0(ops[i + 7]->sym);
> - rte_prefetch0(ops[i + 7]->sym->session);
> + rte_prefetch0((uint8_t *)ops[i + 7]->sym->session +
> + sizeof(struct rte_cryptodev_sym_session));
> +
> + sess_ctx[0] = (void *)ops[i]->sym->session->driver_priv_data;
> + sess_ctx[1] =
> + (void *)ops[i + 1]->sym->session->driver_priv_data;
> + sess_ctx[2] =
> + (void *)ops[i + 2]->sym->session->driver_priv_data;
> + sess_ctx[3] =
> + (void *)ops[i + 3]->sym->session->driver_priv_data;
>
> /* job_len is initialized as cipher data length, once
> * it is 0, equals to auth data length
> */
> - job_len = ops[i]->sym->cipher.data.length;
> - job_len += (ops[i]->sym->cipher.data.length == 0) *
> + job_len[0] = ops[i]->sym->cipher.data.length;
> + job_len[0] += (ops[i]->sym->cipher.data.length == 0) *
> ops[i]->sym->auth.data.length;
> /* decide the target op based on the job length */
> - p_enq_op = &enq_ops[!(job_len & psd_qp_ctx->threshold)];
> + target[0] = !(job_len[0] & psd_qp_ctx->threshold);
> + if (ops[i]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + ops[i]->sym->session =
> + sess_ctx[0]->worker_sess[target[0]];
> + p_enq_op = &enq_ops[target[0]];
>
> /* stop schedule cops before the queue is full, this shall
> * prevent the failed enqueue
> @@ -89,10 +109,14 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> sched_ops[p_enq_op->worker_idx][p_enq_op->pos] = ops[i];
> p_enq_op->pos++;
>
> - job_len = ops[i+1]->sym->cipher.data.length;
> - job_len += (ops[i+1]->sym->cipher.data.length == 0) *
> + job_len[1] = ops[i + 1]->sym->cipher.data.length;
> + job_len[1] += (ops[i + 1]->sym->cipher.data.length == 0) *
> ops[i+1]->sym->auth.data.length;
> - p_enq_op = &enq_ops[!(job_len & psd_qp_ctx->threshold)];
> + target[1] = !(job_len[1] & psd_qp_ctx->threshold);
> + if (ops[i + 1]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + ops[i + 1]->sym->session =
> + sess_ctx[1]->worker_sess[target[1]];
> + p_enq_op = &enq_ops[target[1]];
>
> if (p_enq_op->pos + in_flight_ops[p_enq_op->worker_idx] ==
> qp_ctx->max_nb_objs) {
> @@ -103,10 +127,14 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> sched_ops[p_enq_op->worker_idx][p_enq_op->pos] = ops[i+1];
> p_enq_op->pos++;
>
> - job_len = ops[i+2]->sym->cipher.data.length;
> - job_len += (ops[i+2]->sym->cipher.data.length == 0) *
> - ops[i+2]->sym->auth.data.length;
> - p_enq_op = &enq_ops[!(job_len & psd_qp_ctx->threshold)];
> + job_len[2] = ops[i + 2]->sym->cipher.data.length;
> + job_len[2] += (ops[i + 2]->sym->cipher.data.length == 0) *
> + ops[i + 2]->sym->auth.data.length;
> + target[2] = !(job_len[2] & psd_qp_ctx->threshold);
> + if (ops[i + 2]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + ops[i + 2]->sym->session =
> + sess_ctx[2]->worker_sess[target[2]];
> + p_enq_op = &enq_ops[target[2]];
>
> if (p_enq_op->pos + in_flight_ops[p_enq_op->worker_idx] ==
> qp_ctx->max_nb_objs) {
> @@ -117,10 +145,14 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> sched_ops[p_enq_op->worker_idx][p_enq_op->pos] = ops[i+2];
> p_enq_op->pos++;
>
> - job_len = ops[i+3]->sym->cipher.data.length;
> - job_len += (ops[i+3]->sym->cipher.data.length == 0) *
> - ops[i+3]->sym->auth.data.length;
> - p_enq_op = &enq_ops[!(job_len & psd_qp_ctx->threshold)];
> + job_len[3] = ops[i + 3]->sym->cipher.data.length;
> + job_len[3] += (ops[i + 3]->sym->cipher.data.length == 0) *
> + ops[i + 3]->sym->auth.data.length;
> + target[3] = !(job_len[3] & psd_qp_ctx->threshold);
> + if (ops[i + 3]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + ops[i + 3]->sym->session =
> + sess_ctx[1]->worker_sess[target[3]];
> + p_enq_op = &enq_ops[target[3]];
>
> if (p_enq_op->pos + in_flight_ops[p_enq_op->worker_idx] ==
> qp_ctx->max_nb_objs) {
> @@ -133,10 +165,18 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> }
>
> for (; i < nb_ops; i++) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)ops[i]->sym->session->driver_priv_data;
> + uint32_t job_len;
> + uint8_t target;
> +
> job_len = ops[i]->sym->cipher.data.length;
> job_len += (ops[i]->sym->cipher.data.length == 0) *
> ops[i]->sym->auth.data.length;
> - p_enq_op = &enq_ops[!(job_len & psd_qp_ctx->threshold)];
> + target = !(job_len & psd_qp_ctx->threshold);
> + if (ops[i]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + ops[i]->sym->session = sess_ctx->worker_sess[target];
> + p_enq_op = &enq_ops[target];
>
> if (p_enq_op->pos + in_flight_ops[p_enq_op->worker_idx] ==
> qp_ctx->max_nb_objs) {
> @@ -199,6 +239,7 @@ schedule_dequeue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> if (worker->nb_inflight_cops) {
> nb_deq_ops_pri = rte_cryptodev_dequeue_burst(worker-
> >dev_id,
> worker->qp_id, ops, nb_ops);
> + scheduler_retrieve_session(ops, nb_deq_ops_pri);
> worker->nb_inflight_cops -= nb_deq_ops_pri;
> }
>
> @@ -213,6 +254,7 @@ schedule_dequeue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> nb_deq_ops_sec = rte_cryptodev_dequeue_burst(worker-
> >dev_id,
> worker->qp_id, &ops[nb_deq_ops_pri],
> nb_ops - nb_deq_ops_pri);
> + scheduler_retrieve_session(ops, nb_deq_ops_sec);
> worker->nb_inflight_cops -= nb_deq_ops_sec;
>
> if (!worker->nb_inflight_cops)
> diff --git a/drivers/crypto/scheduler/scheduler_pmd_ops.c
> b/drivers/crypto/scheduler/scheduler_pmd_ops.c
> index b93821783b..f8aa10af64 100644
> --- a/drivers/crypto/scheduler/scheduler_pmd_ops.c
> +++ b/drivers/crypto/scheduler/scheduler_pmd_ops.c
> @@ -9,6 +9,7 @@
> #include <rte_cryptodev.h>
> #include <cryptodev_pmd.h>
> #include <rte_reorder.h>
> +#include <rte_errno.h>
>
> #include "scheduler_pmd_private.h"
>
> @@ -467,19 +468,107 @@ scheduler_pmd_sym_session_get_size(struct
> rte_cryptodev *dev __rte_unused)
> return max_priv_sess_size;
> }
>
> +struct scheduler_configured_sess_info {
> + uint8_t dev_id;
> + uint8_t driver_id;
> + struct rte_cryptodev_sym_session *sess;
> +};
> +
> static int
> -scheduler_pmd_sym_session_configure(struct rte_cryptodev *dev
> __rte_unused,
> - struct rte_crypto_sym_xform *xform __rte_unused,
> - struct rte_cryptodev_sym_session *sess __rte_unused)
> +scheduler_pmd_sym_session_configure(struct rte_cryptodev *dev,
> + struct rte_crypto_sym_xform *xform,
> + struct rte_cryptodev_sym_session *sess)
> {
> + struct scheduler_ctx *sched_ctx = dev->data->dev_private;
> + struct rte_mempool *mp = rte_mempool_from_obj(sess);
> + struct scheduler_session_ctx *sess_ctx = (void *)sess->driver_priv_data;
> + struct scheduler_configured_sess_info configured_sess[
> + RTE_CRYPTODEV_SCHEDULER_MAX_NB_WORKERS] =
> { 0 };
> + uint32_t i, j, n_configured_sess = 0;
> + int ret = 0;
> +
> + if (mp == NULL)
> + return -EINVAL;
> +
> + for (i = 0; i < sched_ctx->nb_workers; i++) {
> + struct scheduler_worker *worker = &sched_ctx->workers[i];
> + struct rte_cryptodev_sym_session *worker_sess;
> +
> + for (j = 0; j < n_configured_sess; j++) {
> + if (configured_sess[j].driver_id ==
> + worker->driver_id) {
> + sess_ctx->worker_sess[i] =
> + configured_sess[j].sess;
> + goto next_worker;
> + }
> + }
> +
> + if (rte_mempool_avail_count(mp) == 0) {
> + ret = -ENOMEM;
> + goto error_exit;
> + }
> +
> + worker_sess = rte_cryptodev_sym_session_create(worker-
> >dev_id,
> + xform, mp);
> + if (worker_sess == NULL) {
> + ret = -rte_errno;
> + goto error_exit;
> + }
> +
> + worker_sess->opaque_data = (uint64_t)sess;
> + sess_ctx->worker_sess[i] = worker_sess;
> + configured_sess[n_configured_sess].driver_id =
> + worker->driver_id;
> + configured_sess[n_configured_sess].dev_id = worker->dev_id;
> + configured_sess[n_configured_sess].sess = worker_sess;
> + n_configured_sess++;
> +next_worker:
> + }
> +
> return 0;
> +error_exit:
> + sess_ctx->ref_cnt = sched_ctx->ref_cnt;
> + for (i = 0; i < n_configured_sess; i++)
> + rte_cryptodev_sym_session_free(configured_sess[i].dev_id,
> + configured_sess[i].sess);
> + return ret;
> }
>
> /** Clear the memory of session so it doesn't leave key material behind */
> static void
> -scheduler_pmd_sym_session_clear(struct rte_cryptodev *dev __rte_unused,
> - struct rte_cryptodev_sym_session *sess __rte_unused)
> -{}
> +scheduler_pmd_sym_session_clear(struct rte_cryptodev *dev,
> + struct rte_cryptodev_sym_session *sess)
> +{
> + struct scheduler_ctx *sched_ctx = dev->data->dev_private;
> + struct scheduler_session_ctx *sess_ctx = (void *)sess->driver_priv_data;
> + struct scheduler_configured_sess_info deleted_sess[
> + RTE_CRYPTODEV_SCHEDULER_MAX_NB_WORKERS] =
> { 0 };
> + uint32_t i, j, n_deleted_sess = 0;
> +
> + if (sched_ctx->ref_cnt != sess_ctx->ref_cnt) {
> + CR_SCHED_LOG(WARNING,
> + "Worker updated between session creation/deletion. "
> + "The session may not be freed fully.");
> + }
> +
> + for (i = 0; i < sched_ctx->nb_workers; i++) {
> + struct scheduler_worker *worker = &sched_ctx->workers[i];
> +
> + for (j = 0; j < n_deleted_sess; j++) {
> + if (deleted_sess[j].driver_id == worker->driver_id) {
> + sess_ctx->worker_sess[i] = NULL;
> + goto next_worker;
> + }
> + }
> +
> + rte_cryptodev_sym_session_free(worker->dev_id,
> + sess_ctx->worker_sess[i]);
> +
> + deleted_sess[n_deleted_sess++].driver_id = worker->driver_id;
> + sess_ctx->worker_sess[i] = NULL;
> +next_worker:
> + }
> +}
>
> static struct rte_cryptodev_ops scheduler_pmd_ops = {
> .dev_configure = scheduler_pmd_config,
> diff --git a/drivers/crypto/scheduler/scheduler_pmd_private.h
> b/drivers/crypto/scheduler/scheduler_pmd_private.h
> index 4d33b9ab44..0e508727a4 100644
> --- a/drivers/crypto/scheduler/scheduler_pmd_private.h
> +++ b/drivers/crypto/scheduler/scheduler_pmd_private.h
> @@ -22,7 +22,6 @@ struct scheduler_worker {
> uint8_t dev_id;
> uint16_t qp_id;
> uint32_t nb_inflight_cops;
> -
> uint8_t driver_id;
> };
>
> @@ -37,6 +36,8 @@ struct scheduler_ctx {
>
> struct scheduler_worker
> workers[RTE_CRYPTODEV_SCHEDULER_MAX_NB_WORKERS];
> uint32_t nb_workers;
> + /* reference count when the workers are incremented/decremented */
> + uint32_t ref_cnt;
>
> enum rte_cryptodev_scheduler_mode mode;
>
> @@ -61,6 +62,11 @@ struct scheduler_qp_ctx {
> struct rte_ring *order_ring;
> } __rte_cache_aligned;
>
> +struct scheduler_session_ctx {
> + uint32_t ref_cnt;
> + struct rte_cryptodev_sym_session *worker_sess[
> + RTE_CRYPTODEV_SCHEDULER_MAX_NB_WORKERS];
> +};
>
> extern uint8_t cryptodev_scheduler_driver_id;
>
> @@ -101,6 +107,118 @@ scheduler_order_drain(struct rte_ring *order_ring,
> return nb_ops_to_deq;
> }
>
> +static __rte_always_inline void
> +scheduler_set_worker_session(struct rte_crypto_op **ops, uint16_t nb_ops,
> + uint8_t worker_index)
> +{
> + struct rte_crypto_op **op = ops;
> + uint16_t n = nb_ops;
> +
> + if (n >= 4) {
> + rte_prefetch0(op[0]->sym->session);
> + rte_prefetch0(op[1]->sym->session);
> + rte_prefetch0(op[2]->sym->session);
> + rte_prefetch0(op[3]->sym->session);
> + }
> +
> + while (n >= 4) {
> + if (n >= 8) {
> + rte_prefetch0(op[4]->sym->session);
> + rte_prefetch0(op[5]->sym->session);
> + rte_prefetch0(op[6]->sym->session);
> + rte_prefetch0(op[7]->sym->session);
> + }
> +
> + if (op[0]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)op[0]->sym->session->driver_priv_data;
> + op[0]->sym->session =
> + sess_ctx->worker_sess[worker_index];
> + }
> +
> + if (op[1]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)op[1]->sym->session->driver_priv_data;
> + op[1]->sym->session =
> + sess_ctx->worker_sess[worker_index];
> + }
> +
> + if (op[2]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)op[2]->sym->session->driver_priv_data;
> + op[2]->sym->session =
> + sess_ctx->worker_sess[worker_index];
> + }
> +
> + if (op[3]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)op[3]->sym->session->driver_priv_data;
> + op[3]->sym->session =
> + sess_ctx->worker_sess[worker_index];
> + }
> +
> + op += 4;
> + n -= 4;
> + }
> +
> + while (n--) {
> + if (op[0]->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
> + struct scheduler_session_ctx *sess_ctx =
> + (void *)op[0]->sym->session->driver_priv_data;
> +
> + op[0]->sym->session =
> + sess_ctx->worker_sess[worker_index];
> + op++;
> + }
> + }
> +}
> +
> +static __rte_always_inline void
> +scheduler_retrieve_session(struct rte_crypto_op **ops, uint16_t nb_ops)
> +{
> + uint16_t n = nb_ops;
> + struct rte_crypto_op **op = ops;
> +
> + if (n >= 4) {
> + rte_prefetch0(op[0]->sym->session);
> + rte_prefetch0(op[1]->sym->session);
> + rte_prefetch0(op[2]->sym->session);
> + rte_prefetch0(op[3]->sym->session);
> + }
> +
> + while (n >= 4) {
> + if (n >= 8) {
> + rte_prefetch0(op[4]->sym->session);
> + rte_prefetch0(op[5]->sym->session);
> + rte_prefetch0(op[6]->sym->session);
> + rte_prefetch0(op[7]->sym->session);
> + }
> +
> + if (op[0]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + op[0]->sym->session =
> + (void *)op[0]->sym->session->opaque_data;
> + if (op[1]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + op[1]->sym->session =
> + (void *)op[1]->sym->session->opaque_data;
> + if (op[2]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + op[2]->sym->session =
> + (void *)op[2]->sym->session->opaque_data;
> + if (op[3]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + op[3]->sym->session =
> + (void *)op[3]->sym->session->opaque_data;
> +
> + op += 4;
> + n -= 4;
> + }
> +
> + while (n--) {
> + if (op[0]->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
> + op[0]->sym->session =
> + (void *)op[0]->sym->session->opaque_data;
> + op++;
> + }
> +}
> +
> /** device specific operations function pointer structure */
> extern struct rte_cryptodev_ops *rte_crypto_scheduler_pmd_ops;
>
> diff --git a/drivers/crypto/scheduler/scheduler_roundrobin.c
> b/drivers/crypto/scheduler/scheduler_roundrobin.c
> index ace2dec2ec..ad3f8b842a 100644
> --- a/drivers/crypto/scheduler/scheduler_roundrobin.c
> +++ b/drivers/crypto/scheduler/scheduler_roundrobin.c
> @@ -23,16 +23,17 @@ schedule_enqueue(void *qp, struct rte_crypto_op
> **ops, uint16_t nb_ops)
> ((struct scheduler_qp_ctx *)qp)->private_qp_ctx;
> uint32_t worker_idx = rr_qp_ctx->last_enq_worker_idx;
> struct scheduler_worker *worker = &rr_qp_ctx->workers[worker_idx];
> - uint16_t i, processed_ops;
> + uint16_t processed_ops;
>
> if (unlikely(nb_ops == 0))
> return 0;
>
> - for (i = 0; i < nb_ops && i < 4; i++)
> - rte_prefetch0(ops[i]->sym->session);
> -
> + scheduler_set_worker_session(ops, nb_ops, worker_idx);
> processed_ops = rte_cryptodev_enqueue_burst(worker->dev_id,
> worker->qp_id, ops, nb_ops);
> + if (processed_ops < nb_ops)
> + scheduler_retrieve_session(ops + processed_ops,
> + nb_ops - processed_ops);
>
> worker->nb_inflight_cops += processed_ops;
>
> @@ -86,7 +87,7 @@ schedule_dequeue(void *qp, struct rte_crypto_op **ops,
> uint16_t nb_ops)
>
> nb_deq_ops = rte_cryptodev_dequeue_burst(worker->dev_id,
> worker->qp_id, ops, nb_ops);
> -
> + scheduler_retrieve_session(ops, nb_deq_ops);
> last_worker_idx += 1;
> last_worker_idx %= rr_qp_ctx->nb_workers;
>
> --
> 2.34.1
next prev parent reply other threads:[~2022-09-15 7:06 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-29 16:06 [PATCH 0/3] cryptodev: sym session framework rework Fan Zhang
2022-08-29 16:06 ` [PATCH 1/3] cryptodev: rework session framework Fan Zhang
2022-09-15 7:07 ` [EXT] " Akhil Goyal
2022-09-15 7:26 ` Akhil Goyal
2022-08-29 16:06 ` [PATCH 2/3] crypto/scheduler: use unified session Fan Zhang
2022-09-15 7:06 ` Akhil Goyal [this message]
2022-09-15 7:23 ` [EXT] " Akhil Goyal
2022-09-18 13:01 ` Akhil Goyal
2022-08-29 16:06 ` [PATCH 3/3] cryptodev: hide sym session structure Fan Zhang
2022-09-18 13:19 ` [EXT] " Akhil Goyal
2022-09-21 15:02 ` [PATCH v2 0/6] crypto/security session framework rework Akhil Goyal
2022-09-21 15:02 ` [PATCH v2 1/6] cryptodev: rework session framework Akhil Goyal
2022-09-22 14:06 ` Ji, Kai
2022-09-21 15:02 ` [PATCH v2 2/6] crypto/scheduler: use unified session Akhil Goyal
2022-09-22 14:04 ` Ji, Kai
2022-09-21 15:02 ` [PATCH v2 3/6] cryptodev: hide sym session structure Akhil Goyal
2022-09-22 13:49 ` Ji, Kai
2022-09-21 15:02 ` [PATCH v2 4/6] security: remove priv mempool usage Akhil Goyal
2022-09-21 15:02 ` [PATCH v2 5/6] drivers/crypto: support security session get size op Akhil Goyal
2022-09-22 13:52 ` Ji, Kai
2022-09-21 15:02 ` [PATCH v2 6/6] security: hide session structure Akhil Goyal
2022-09-21 15:11 ` [PATCH v2 0/6] crypto/security session framework rework Akhil Goyal
2022-09-23 13:00 ` Coyle, David
2022-09-23 9:29 ` Gagandeep Singh
2022-09-24 16:35 ` [PATCH v3 " Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 1/6] cryptodev: rework session framework Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 2/6] crypto/scheduler: use unified session Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 3/6] cryptodev: hide sym session structure Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 4/6] security: remove priv mempool usage Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 5/6] drivers/crypto: support security session get size op Akhil Goyal
2022-09-24 16:35 ` [PATCH v3 6/6] security: hide session structure Akhil Goyal
2022-09-24 16:39 ` [PATCH v3 0/6] crypto/security session framework rework Akhil Goyal
2022-09-26 10:09 ` Ruifeng Wang
2022-09-26 10:12 ` Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 " Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 1/6] cryptodev: rework session framework Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 2/6] crypto/scheduler: use unified session Akhil Goyal
2022-09-27 11:03 ` Ji, Kai
2022-09-27 19:25 ` Akhil Goyal
2022-09-28 12:56 ` Akhil Goyal
2022-09-28 15:29 ` Ji, Kai
2022-09-26 19:14 ` [PATCH v4 3/6] cryptodev: hide sym session structure Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 4/6] security: remove priv mempool usage Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 5/6] drivers/crypto: support security session get size op Akhil Goyal
2022-09-26 19:14 ` [PATCH v4 6/6] security: hide session structure Akhil Goyal
2022-09-26 19:23 ` [PATCH v4 0/6] crypto/security session framework rework Akhil Goyal
2022-09-27 3:27 ` Ruifeng Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO6PR18MB44844EF8C44ABE611F954C3ED8499@CO6PR18MB4484.namprd18.prod.outlook.com \
--to=gakhil@marvell.com \
--cc=ajit.khaparde@broadcom.com \
--cc=anoobj@marvell.com \
--cc=chandu@amd.com \
--cc=dev@dpdk.org \
--cc=g.singh@nxp.com \
--cc=jianjay.zhou@huawei.com \
--cc=matan@nvidia.com \
--cc=maxime.coquelin@redhat.com \
--cc=pablo.de.lara.guarch@intel.com \
--cc=roy.fan.zhang@intel.com \
--cc=ruifeng.wang@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).