crypto/cnxk: use set ctx operation for session destroy

Usage of flush and invalidate would involve delays to account
for flush delay. Use set_ctx operation instead. When set_ctx fails,
fall back to flush + invalidate scheme.

Signed-off-by: Anoob Joseph <anoobj@marvell.com>
Acked-by: Akhil Goyal <gakhil@marvell.com>
This commit is contained in:
Anoob Joseph 2022-04-25 11:08:25 +05:30 committed by Akhil Goyal
parent ed96337581
commit c662a1f97c

View File

@ -333,6 +333,8 @@ cn10k_sec_session_destroy(void *dev, struct rte_security_session *sec_sess)
struct cn10k_ipsec_sa *sa;
struct cnxk_cpt_qp *qp;
struct roc_cpt_lf *lf;
void *sa_dptr = NULL;
int ret;
sess = get_sec_session_private_data(sec_sess);
if (sess == NULL)
@ -349,16 +351,44 @@ cn10k_sec_session_destroy(void *dev, struct rte_security_session *sec_sess)
/* Trigger CTX flush to write dirty data back to DRAM */
roc_cpt_lf_ctx_flush(lf, &sa->in_sa, false);
/* Wait for 1 ms so that flush is complete */
rte_delay_ms(1);
ret = -1;
w2 = (union roc_ot_ipsec_sa_word2 *)&sa->in_sa.w2;
w2->s.valid = 0;
if (sa->is_outbound) {
sa_dptr = plt_zmalloc(sizeof(struct roc_ot_ipsec_outb_sa), 8);
if (sa_dptr != NULL) {
roc_ot_ipsec_outb_sa_init(sa_dptr);
plt_atomic_thread_fence(__ATOMIC_SEQ_CST);
ret = roc_cpt_ctx_write(
lf, sa_dptr, &sa->out_sa,
sizeof(struct roc_ot_ipsec_outb_sa));
}
} else {
sa_dptr = plt_zmalloc(sizeof(struct roc_ot_ipsec_inb_sa), 8);
if (sa_dptr != NULL) {
roc_ot_ipsec_inb_sa_init(sa_dptr, false);
/* Trigger CTX reload to fetch new data from DRAM */
roc_cpt_lf_ctx_reload(lf, &sa->in_sa);
ret = roc_cpt_ctx_write(
lf, sa_dptr, &sa->in_sa,
sizeof(struct roc_ot_ipsec_inb_sa));
}
}
plt_free(sa_dptr);
if (ret) {
/* MC write_ctx failed. Attempt reload of CTX */
/* Wait for 1 ms so that flush is complete */
rte_delay_ms(1);
w2 = (union roc_ot_ipsec_sa_word2 *)&sa->in_sa.w2;
w2->s.valid = 0;
plt_atomic_thread_fence(__ATOMIC_SEQ_CST);
/* Trigger CTX reload to fetch new data from DRAM */
roc_cpt_lf_ctx_reload(lf, &sa->in_sa);
}
sess_mp = rte_mempool_from_obj(sess);