crypto/dpaa_sec: change per device pool to per qp

In cases where single cryptodev is used by multiple cores
using multiple queues, there will be contention for mempool
resources and may eventually get exhausted.
Basically, mempool should be defined per core.
Now since qp is used per core, mempools are defined in qp setup.

Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
This commit is contained in:
Akhil Goyal 2019-09-30 20:11:03 +05:30
parent f7a5752e70
commit 2ffb940e14
2 changed files with 24 additions and 37 deletions

View File

@ -72,7 +72,9 @@ dpaa_sec_alloc_ctx(dpaa_sec_session *ses, int sg_count)
struct dpaa_sec_op_ctx *ctx;
int i, retval;
retval = rte_mempool_get(ses->ctx_pool, (void **)(&ctx));
retval = rte_mempool_get(
ses->qp[rte_lcore_id() % MAX_DPAA_CORES]->ctx_pool,
(void **)(&ctx));
if (!ctx || retval) {
DPAA_SEC_DP_WARN("Alloc sec descriptor failed!");
return NULL;
@ -86,7 +88,7 @@ dpaa_sec_alloc_ctx(dpaa_sec_session *ses, int sg_count)
for (i = 0; i < sg_count && i < MAX_JOB_SG_ENTRIES; i += 4)
dcbz_64(&ctx->job.sg[i]);
ctx->ctx_pool = ses->ctx_pool;
ctx->ctx_pool = ses->qp[rte_lcore_id() % MAX_DPAA_CORES]->ctx_pool;
ctx->vtop_offset = (size_t) ctx - rte_mempool_virt2iova(ctx);
return ctx;
@ -1929,6 +1931,7 @@ dpaa_sec_queue_pair_release(struct rte_cryptodev *dev,
}
qp = &internals->qps[qp_id];
rte_mempool_free(qp->ctx_pool);
qp->internals = NULL;
dev->data->queue_pairs[qp_id] = NULL;
@ -1943,6 +1946,7 @@ dpaa_sec_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id,
{
struct dpaa_sec_dev_private *internals;
struct dpaa_sec_qp *qp = NULL;
char str[20];
DPAA_SEC_DEBUG("dev =%p, queue =%d, conf =%p", dev, qp_id, qp_conf);
@ -1955,6 +1959,22 @@ dpaa_sec_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id,
qp = &internals->qps[qp_id];
qp->internals = internals;
snprintf(str, sizeof(str), "ctx_pool_d%d_qp%d",
dev->data->dev_id, qp_id);
if (!qp->ctx_pool) {
qp->ctx_pool = rte_mempool_create((const char *)str,
CTX_POOL_NUM_BUFS,
CTX_POOL_BUF_SIZE,
CTX_POOL_CACHE_SIZE, 0,
NULL, NULL, NULL, NULL,
SOCKET_ID_ANY, 0);
if (!qp->ctx_pool) {
DPAA_SEC_ERR("%s create failed\n", str);
return -ENOMEM;
}
} else
DPAA_SEC_INFO("mempool already created for dev_id : %d, qp: %d",
dev->data->dev_id, qp_id);
dev->data->queue_pairs[qp_id] = qp;
return 0;
@ -2171,7 +2191,6 @@ dpaa_sec_set_session_parameters(struct rte_cryptodev *dev,
DPAA_SEC_ERR("Invalid crypto type");
return -EINVAL;
}
session->ctx_pool = internals->ctx_pool;
rte_spinlock_lock(&internals->lock);
for (i = 0; i < MAX_DPAA_CORES; i++) {
session->inq[i] = dpaa_sec_attach_rxq(internals);
@ -2426,7 +2445,6 @@ dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
session->dir = DIR_DEC;
} else
goto out;
session->ctx_pool = internals->ctx_pool;
rte_spinlock_lock(&internals->lock);
for (i = 0; i < MAX_DPAA_CORES; i++) {
session->inq[i] = dpaa_sec_attach_rxq(internals);
@ -2537,7 +2555,6 @@ dpaa_sec_set_pdcp_session(struct rte_cryptodev *dev,
session->pdcp.hfn_ovd = pdcp_xform->hfn_ovrd;
session->pdcp.hfn_ovd_offset = cipher_xform->iv.offset;
session->ctx_pool = dev_priv->ctx_pool;
rte_spinlock_lock(&dev_priv->lock);
for (i = 0; i < MAX_DPAA_CORES; i++) {
session->inq[i] = dpaa_sec_attach_rxq(dev_priv);
@ -2614,32 +2631,11 @@ dpaa_sec_security_session_destroy(void *dev __rte_unused,
}
static int
dpaa_sec_dev_configure(struct rte_cryptodev *dev,
dpaa_sec_dev_configure(struct rte_cryptodev *dev __rte_unused,
struct rte_cryptodev_config *config __rte_unused)
{
char str[20];
struct dpaa_sec_dev_private *internals;
PMD_INIT_FUNC_TRACE();
internals = dev->data->dev_private;
snprintf(str, sizeof(str), "ctx_pool_%d", dev->data->dev_id);
if (!internals->ctx_pool) {
internals->ctx_pool = rte_mempool_create((const char *)str,
CTX_POOL_NUM_BUFS,
CTX_POOL_BUF_SIZE,
CTX_POOL_CACHE_SIZE, 0,
NULL, NULL, NULL, NULL,
SOCKET_ID_ANY, 0);
if (!internals->ctx_pool) {
DPAA_SEC_ERR("%s create failed\n", str);
return -ENOMEM;
}
} else
DPAA_SEC_INFO("mempool already created for dev_id : %d",
dev->data->dev_id);
return 0;
}
@ -2659,17 +2655,11 @@ dpaa_sec_dev_stop(struct rte_cryptodev *dev __rte_unused)
static int
dpaa_sec_dev_close(struct rte_cryptodev *dev)
{
struct dpaa_sec_dev_private *internals;
PMD_INIT_FUNC_TRACE();
if (dev == NULL)
return -ENOMEM;
internals = dev->data->dev_private;
rte_mempool_free(internals->ctx_pool);
internals->ctx_pool = NULL;
return 0;
}
@ -2729,8 +2719,6 @@ dpaa_sec_uninit(struct rte_cryptodev *dev)
internals = dev->data->dev_private;
rte_free(dev->security_ctx);
/* In case close has been called, internals->ctx_pool would be NULL */
rte_mempool_free(internals->ctx_pool);
rte_free(internals);
DPAA_SEC_INFO("Closing DPAA_SEC device %s on numa socket %u",

View File

@ -154,11 +154,11 @@ typedef struct dpaa_sec_session_entry {
struct dpaa_sec_qp *qp[MAX_DPAA_CORES];
struct qman_fq *inq[MAX_DPAA_CORES];
struct sec_cdb cdb; /**< cmd block associated with qp */
struct rte_mempool *ctx_pool; /* session mempool for dpaa_sec_op_ctx */
} dpaa_sec_session;
struct dpaa_sec_qp {
struct dpaa_sec_dev_private *internals;
struct rte_mempool *ctx_pool; /* mempool for dpaa_sec_op_ctx */
struct qman_fq outq;
int rx_pkts;
int rx_errs;
@ -173,7 +173,6 @@ struct dpaa_sec_qp {
/* internal sec queue interface */
struct dpaa_sec_dev_private {
void *sec_hw;
struct rte_mempool *ctx_pool; /* per dev mempool for dpaa_sec_op_ctx */
struct dpaa_sec_qp qps[RTE_DPAA_MAX_NB_SEC_QPS]; /* i/o queue for sec */
struct qman_fq inq[RTE_DPAA_MAX_RX_QUEUE];
unsigned char inq_attach[RTE_DPAA_MAX_RX_QUEUE];