summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNithinsen Kaithakadan <nkaithakadan@marvell.com>2025-01-07 16:32:13 +0530
committerDamjan Marion <dmarion@0xa5.net>2025-01-21 13:00:26 +0000
commit957ce524fb21d7267f712f7145977c75c3c55c33 (patch)
tree2dbf16e8c9b78b249bfa7f697c7b5d48d9419c6b
parent07ba8ae1b292225b2a72798699a1ccba59c1fc3e (diff)
octeon: rework octeon crypto framework
Added changes in the pending queue structure to incorporate each packet into a single inflight request entry. Type: improvement Change-Id: I18729e01b5f73b128ae245a1a8f77a4f97065026 Signed-off-by: Nithinsen Kaithakadan <nkaithakadan@marvell.com>
-rw-r--r--src/plugins/dev_octeon/crypto.c99
-rw-r--r--src/plugins/dev_octeon/crypto.h22
2 files changed, 60 insertions, 61 deletions
diff --git a/src/plugins/dev_octeon/crypto.c b/src/plugins/dev_octeon/crypto.c
index 7333da1119e..1c3aa42e515 100644
--- a/src/plugins/dev_octeon/crypto.c
+++ b/src/plugins/dev_octeon/crypto.c
@@ -1162,6 +1162,7 @@ oct_cpt_inst_w7_get (oct_crypto_sess_t *sess, struct roc_cpt *roc_cpt)
inst_w7.u64 = 0;
inst_w7.s.cptr = (u64) &sess->cpt_ctx.se_ctx.fctx;
+
/* Set the engine group */
inst_w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_IE];
@@ -1421,6 +1422,7 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
u32 crypto_total_length;
oct_crypto_key_t *key;
vlib_buffer_t *buffer;
+ void *sg_data;
u16 adj_len;
int ret = 0;
@@ -1429,22 +1431,26 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
pend_q = &ocm->pend_q[vlib_get_thread_index ()];
- enq_tail = pend_q->enq_tail;
-
nb_infl_allowed = pend_q->n_desc - pend_q->n_crypto_inflight;
- if (PREDICT_FALSE (nb_infl_allowed == 0))
+ if (PREDICT_FALSE (nb_infl_allowed < frame->n_elts))
{
oct_crypto_update_frame_error_status (
frame, 0, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
return -1;
}
- infl_req = &pend_q->req_queue[enq_tail];
- infl_req->frame = frame;
+ sg_data = pend_q->sg_data;
for (i = 0; i < frame->n_elts; i++)
{
+ enq_tail = pend_q->enq_tail;
+ infl_req = &pend_q->req_queue[enq_tail];
+ infl_req->frame = frame;
+ infl_req->last_elts = false;
+ infl_req->index = i;
+
elts = &frame->elts[i];
+ infl_req->fe = elts;
buffer_index = frame->buffer_indices[i];
key = vec_elt_at_index (ocm->keys[type], elts->key_index);
@@ -1485,7 +1491,7 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
ret = oct_crypto_fill_fc_params (
sess, inst + i, is_aead, aad_len, (u8 *) dptr_start_ptr, elts,
- (oct_crypto_scatter_gather_t *) (infl_req->sg_data) + i,
+ ((oct_crypto_scatter_gather_t *) (sg_data)) + enq_tail,
crypto_total_length /* cipher_len */,
crypto_start_offset /* cipher_offset */, 0 /* auth_len */,
integ_start_offset /* auth_off */, buffer, adj_len);
@@ -1512,7 +1518,7 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
ret = oct_crypto_fill_fc_params (
sess, inst + i, is_aead, aad_len, (u8 *) dptr_start_ptr, elts,
- (oct_crypto_scatter_gather_t *) (infl_req->sg_data) + i,
+ ((oct_crypto_scatter_gather_t *) (sg_data)) + enq_tail,
crypto_total_length /* cipher_len */,
crypto_start_offset /* cipher_offset */,
enc_auth_len /* auth_len */, integ_start_offset /* auth_off */,
@@ -1526,14 +1532,16 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame,
}
inst[i].w7.u64 = sess->cpt_inst_w7;
- inst[i].res_addr = (u64) &infl_req->res[i];
+ inst[i].res_addr = (u64) &infl_req->res;
+ OCT_MOD_INC (pend_q->enq_tail, pend_q->n_desc);
}
oct_crypto_burst_submit (crypto_dev, inst, frame->n_elts);
- infl_req->elts = frame->n_elts;
- OCT_MOD_INC (pend_q->enq_tail, pend_q->n_desc);
- pend_q->n_crypto_inflight++;
+ infl_req->last_elts = true;
+
+ pend_q->n_crypto_inflight += frame->n_elts;
+ pend_q->n_crypto_frame++;
return 0;
}
@@ -1623,22 +1631,22 @@ oct_crypto_frame_dequeue (vlib_main_t *vm, u32 *nb_elts_processed,
oct_crypto_pending_queue_t *pend_q;
vnet_crypto_async_frame_t *frame;
volatile union cpt_res_s *res;
- int i;
+ bool last_elts_processed;
pend_q = &ocm->pend_q[vlib_get_thread_index ()];
- if (!pend_q->n_crypto_inflight)
+ if (!pend_q->n_crypto_frame)
return NULL;
- deq_head = pend_q->deq_head;
- infl_req = &pend_q->req_queue[deq_head];
- frame = infl_req->frame;
-
- fe = frame->elts;
+ last_elts_processed = false;
- for (i = infl_req->deq_elts; i < infl_req->elts; ++i)
+ for (; last_elts_processed == false;)
{
- res = &infl_req->res[i];
+ deq_head = pend_q->deq_head;
+ infl_req = &pend_q->req_queue[deq_head];
+ fe = infl_req->fe;
+
+ res = &infl_req->res;
if (PREDICT_FALSE (res->cn10k.compcode == CPT_COMP_NOT_DONE))
return NULL;
@@ -1646,19 +1654,20 @@ oct_crypto_frame_dequeue (vlib_main_t *vm, u32 *nb_elts_processed,
if (PREDICT_FALSE (res->cn10k.uc_compcode))
{
if (res->cn10k.uc_compcode == ROC_SE_ERR_GC_ICV_MISCOMPARE)
- status = fe[i].status = VNET_CRYPTO_OP_STATUS_FAIL_BAD_HMAC;
+ status = fe->status = VNET_CRYPTO_OP_STATUS_FAIL_BAD_HMAC;
else
- status = fe[i].status = VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR;
+ status = fe->status = VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR;
}
- infl_req->deq_elts++;
+ clib_memset ((void *) &infl_req->res, 0, sizeof (union cpt_res_s));
+ last_elts_processed = infl_req->last_elts;
+ OCT_MOD_INC (pend_q->deq_head, pend_q->n_desc);
}
- clib_memset ((void *) infl_req->res, 0,
- sizeof (union cpt_res_s) * VNET_CRYPTO_FRAME_SIZE);
+ frame = infl_req->frame;
- OCT_MOD_INC (pend_q->deq_head, pend_q->n_desc);
- pend_q->n_crypto_inflight--;
+ pend_q->n_crypto_frame--;
+ pend_q->n_crypto_inflight -= frame->n_elts;
frame->state = status == VNET_CRYPTO_OP_STATUS_COMPLETED ?
VNET_CRYPTO_FRAME_STATE_SUCCESS :
@@ -1667,9 +1676,6 @@ oct_crypto_frame_dequeue (vlib_main_t *vm, u32 *nb_elts_processed,
*nb_elts_processed = frame->n_elts;
*enqueue_thread_idx = frame->enqueue_thread_index;
- infl_req->deq_elts = 0;
- infl_req->elts = 0;
-
return frame;
}
@@ -1715,9 +1721,8 @@ oct_conf_sw_queue (vlib_main_t *vm, vnet_dev_t *dev)
oct_crypto_main_t *ocm = &oct_crypto_main;
vlib_thread_main_t *tm = vlib_get_thread_main ();
extern oct_plt_init_param_t oct_plt_init_param;
- oct_crypto_inflight_req_t *infl_req_queue;
u32 n_inflight_req;
- int i, j = 0;
+ int i;
ocm->pend_q = oct_plt_init_param.oct_plt_zmalloc (
tm->n_vlib_mains * sizeof (oct_crypto_pending_queue_t),
@@ -1732,8 +1737,7 @@ oct_conf_sw_queue (vlib_main_t *vm, vnet_dev_t *dev)
* Each pending queue will get number of cpt desc / number of cores.
* And that desc count is shared across inflight entries.
*/
- n_inflight_req =
- (OCT_CPT_LF_MAX_NB_DESC / tm->n_vlib_mains) / VNET_CRYPTO_FRAME_SIZE;
+ n_inflight_req = (OCT_CPT_LF_MAX_NB_DESC / tm->n_vlib_mains);
for (i = 0; i < tm->n_vlib_mains; ++i)
{
@@ -1749,35 +1753,26 @@ oct_conf_sw_queue (vlib_main_t *vm, vnet_dev_t *dev)
goto free;
}
- for (j = 0; j <= ocm->pend_q[i].n_desc; ++j)
+ ocm->pend_q[i].sg_data = oct_plt_init_param.oct_plt_zmalloc (
+ OCT_SCATTER_GATHER_BUFFER_SIZE * ocm->pend_q[i].n_desc,
+ CLIB_CACHE_LINE_BYTES);
+ if (ocm->pend_q[i].sg_data == NULL)
{
- infl_req_queue = &ocm->pend_q[i].req_queue[j];
-
- infl_req_queue->sg_data = oct_plt_init_param.oct_plt_zmalloc (
- OCT_SCATTER_GATHER_BUFFER_SIZE * VNET_CRYPTO_FRAME_SIZE,
- CLIB_CACHE_LINE_BYTES);
- if (infl_req_queue->sg_data == NULL)
- {
- log_err (dev, "Failed to allocate crypto scatter gather memory");
- goto free;
- }
+ log_err (dev, "Failed to allocate crypto scatter gather memory");
+ goto free;
}
}
+
return 0;
+
free:
for (; i >= 0; i--)
{
if (ocm->pend_q[i].req_queue == NULL)
continue;
- for (; j >= 0; j--)
- {
- infl_req_queue = &ocm->pend_q[i].req_queue[j];
- if (infl_req_queue->sg_data == NULL)
- continue;
+ oct_plt_init_param.oct_plt_free (ocm->pend_q[i].sg_data);
- oct_plt_init_param.oct_plt_free (infl_req_queue->sg_data);
- }
oct_plt_init_param.oct_plt_free (ocm->pend_q[i].req_queue);
}
oct_plt_init_param.oct_plt_free (ocm->pend_q);
diff --git a/src/plugins/dev_octeon/crypto.h b/src/plugins/dev_octeon/crypto.h
index bee2db8f9ed..d7a501eb931 100644
--- a/src/plugins/dev_octeon/crypto.h
+++ b/src/plugins/dev_octeon/crypto.h
@@ -114,17 +114,17 @@ typedef struct oct_crypto_scatter_gather
typedef struct
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
- /** Result data of all entries in the frame */
- volatile union cpt_res_s res[VNET_CRYPTO_FRAME_SIZE];
- /** Scatter gather data */
- void *sg_data;
+ /** Result data */
+ volatile union cpt_res_s res;
/** Frame pointer */
vnet_crypto_async_frame_t *frame;
- /** Number of async elements in frame */
- u16 elts;
- /** Next read entry in frame, when dequeue */
- u16 deq_elts;
-} oct_crypto_inflight_req_t;
+ /** Async frame element */
+ vnet_crypto_async_frame_elt_t *fe;
+ /** Set if this is last element in frame */
+ bool last_elts;
+ /** Index of element in frame */
+ int index;
+} __plt_cache_aligned oct_crypto_inflight_req_t;
typedef struct
{
@@ -132,12 +132,16 @@ typedef struct
oct_crypto_inflight_req_t *req_queue;
/** Number of inflight operations in queue */
u32 n_crypto_inflight;
+ /** Number of frames in queue */
+ u32 n_crypto_frame;
/** Tail of queue to be used for enqueue */
u16 enq_tail;
/** Head of queue to be used for dequeue */
u16 deq_head;
/** Number of descriptors */
u16 n_desc;
+ /** Scatter gather data */
+ void *sg_data;
} oct_crypto_pending_queue_t;
typedef struct