dpdk-cryptodev: enq/deq scheme rework

This rework tries to address issues found on SPR QAT, for traffic
reaching max possible throughoutput for single QAT PF packet drops were
observed.
Fix changes enq/deq scheme by utilizing software ring in enq call from
VNET but enq and deq to QAT happens only in deq callback function what
should enable better utlization of hardware resources.

Type: improvement
Signed-off-by: Dastin Wilski <dastin.wilski@gmail.com>
Signed-off-by: Piotr Bronowski <piotrx.bronowski@intel.com>
Change-Id: I2e8c473d20a269fd5e93f0c8d1f8c8aa193712bd
This commit is contained in:
Piotr Bronowski
2023-06-09 15:08:54 +00:00
committed by Fan Zhang
parent 30ecfa8ceb
commit f0c67adfb2
4 changed files with 226 additions and 239 deletions

View File

@ -579,14 +579,14 @@ cryptodev_assign_resource (cryptodev_engine_thread_t * cet,
return -EBUSY;
vec_foreach_index (idx, cmt->cryptodev_inst)
{
cinst = cmt->cryptodev_inst + idx;
if (cinst->dev_id == cet->cryptodev_id &&
cinst->q_id == cet->cryptodev_q)
break;
}
{
cinst = cmt->cryptodev_inst + idx;
if (cinst->dev_id == cet->cryptodev_id &&
cinst->q_id == cet->cryptodev_q)
break;
}
/* invalid existing worker resource assignment */
if (idx == vec_len (cmt->cryptodev_inst))
if (idx >= vec_len (cmt->cryptodev_inst))
return -EINVAL;
clib_spinlock_lock (&cmt->tlock);
clib_bitmap_set_no_check (cmt->active_cdev_inst_mask, idx, 0);
@ -1269,7 +1269,7 @@ dpdk_cryptodev_init (vlib_main_t * vm)
vec_free (unique_drivers);
#endif
clib_bitmap_vec_validate (cmt->active_cdev_inst_mask, tm->n_vlib_mains);
clib_bitmap_vec_validate (cmt->active_cdev_inst_mask, n_workers);
clib_spinlock_init (&cmt->tlock);
vec_validate_aligned(cmt->per_thread_data, tm->n_vlib_mains - 1,

View File

@ -28,7 +28,6 @@
#define CRYPTODEV_AAD_MASK (CRYPTODEV_NB_CRYPTO_OPS - 1)
#define CRYPTODE_ENQ_MAX 64
#define CRYPTODE_DEQ_MAX 64
#define CRYPTODEV_DEQ_CACHE_SZ 32
#define CRYPTODEV_NB_SESSION 4096
#define CRYPTODEV_MAX_IV_SIZE 16
#define CRYPTODEV_MAX_AAD_SIZE 16
@ -193,7 +192,6 @@ typedef struct
struct
{
struct rte_crypto_raw_dp_ctx *ctx;
struct rte_ring *cached_frame;
u16 aad_index;
u8 *aad_buf;
u64 aad_phy_addr;
@ -233,13 +231,14 @@ extern cryptodev_main_t cryptodev_main;
static_always_inline void
cryptodev_mark_frame_err_status (vnet_crypto_async_frame_t *f,
vnet_crypto_op_status_t s)
vnet_crypto_op_status_t s,
vnet_crypto_async_frame_state_t fs)
{
u32 n_elts = f->n_elts, i;
for (i = 0; i < n_elts; i++)
f->elts[i].status = s;
f->state = VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED;
f->state = fs;
}
int cryptodev_session_create (vlib_main_t *vm, vnet_crypto_key_index_t idx,

View File

@ -140,7 +140,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
if (PREDICT_FALSE (CRYPTODEV_NB_CRYPTO_OPS - cet->inflight < n_elts))
{
cryptodev_mark_frame_err_status (frame,
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
@ -148,7 +149,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
rte_mempool_get_bulk (cet->cop_pool, (void **) cet->cops, n_elts) < 0))
{
cryptodev_mark_frame_err_status (frame,
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
@ -184,7 +186,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
cryptodev_session_create (vm, last_key_index, 0) < 0))
{
cryptodev_mark_frame_err_status (
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
}
@ -259,7 +262,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
if (PREDICT_FALSE (CRYPTODEV_MAX_INFLIGHT - cet->inflight < n_elts))
{
cryptodev_mark_frame_err_status (frame,
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
@ -267,7 +271,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
rte_mempool_get_bulk (cet->cop_pool, (void **) cet->cops, n_elts) < 0))
{
cryptodev_mark_frame_err_status (frame,
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
@ -301,7 +306,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
aad_len) < 0))
{
cryptodev_mark_frame_err_status (
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
}
@ -320,7 +326,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
aad_len) < 0))
{
cryptodev_mark_frame_err_status (
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
return -1;
}
}

File diff suppressed because it is too large Load Diff