X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-crypto-perf%2Fcperf_test_latency.c;h=58b21abd9a42986fad05e5e6bc2718340663156a;hb=f6fadc3e6310;hp=e61ac97282d76a81d1387a4c0ec87f8e294c6f75;hpb=1e1d4fb791097c9cca687c3ee3f56284e2be2c25;p=dpdk.git diff --git a/app/test-crypto-perf/cperf_test_latency.c b/app/test-crypto-perf/cperf_test_latency.c index e61ac97282..58b21abd9a 100644 --- a/app/test-crypto-perf/cperf_test_latency.c +++ b/app/test-crypto-perf/cperf_test_latency.c @@ -66,6 +66,10 @@ struct cperf_latency_ctx { struct cperf_op_result *res; }; +struct priv_op_data { + struct cperf_op_result *result; +}; + #define max(a, b) (a > b ? (uint64_t)a : (uint64_t)b) #define min(a, b) (a < b ? (uint64_t)a : (uint64_t)b) @@ -75,8 +79,10 @@ cperf_latency_test_free(struct cperf_latency_ctx *ctx, uint32_t mbuf_nb) uint32_t i; if (ctx) { - if (ctx->sess) - rte_cryptodev_sym_session_free(ctx->dev_id, ctx->sess); + if (ctx->sess) { + rte_cryptodev_sym_session_clear(ctx->dev_id, ctx->sess); + rte_cryptodev_sym_session_free(ctx->sess); + } if (ctx->mbufs_in) { for (i = 0; i < mbuf_nb; i++) @@ -163,14 +169,14 @@ cperf_mbuf_create(struct rte_mempool *mempool, if (options->op_type != CPERF_CIPHER_ONLY) { mbuf_data = (uint8_t *)rte_pktmbuf_append(mbuf, - options->auth_digest_sz); + options->digest_sz); if (mbuf_data == NULL) goto error; } if (options->op_type == CPERF_AEAD) { uint8_t *aead = (uint8_t *)rte_pktmbuf_prepend(mbuf, - RTE_ALIGN_CEIL(options->auth_aad_sz, 16)); + RTE_ALIGN_CEIL(options->aead_aad_sz, 16)); if (aead == NULL) goto error; @@ -187,7 +193,8 @@ error: } void * -cperf_latency_test_constructor(uint8_t dev_id, uint16_t qp_id, +cperf_latency_test_constructor(struct rte_mempool *sess_mp, + uint8_t dev_id, uint16_t qp_id, const struct cperf_options *options, const struct cperf_test_vector *test_vector, const struct cperf_op_fns *op_fns) @@ -207,7 +214,13 @@ cperf_latency_test_constructor(uint8_t dev_id, uint16_t qp_id, ctx->options = options; ctx->test_vector = test_vector; - ctx->sess = op_fns->sess_create(dev_id, options, test_vector); + /* IV goes at the end of the crypto operation */ + uint16_t iv_offset = sizeof(struct rte_crypto_op) + + sizeof(struct rte_crypto_sym_op) + + sizeof(struct cperf_op_result *); + + ctx->sess = op_fns->sess_create(sess_mp, dev_id, options, test_vector, + iv_offset); if (ctx->sess == NULL) goto err; @@ -220,7 +233,7 @@ cperf_latency_test_constructor(uint8_t dev_id, uint16_t qp_id, RTE_CACHE_LINE_ROUNDUP( (options->max_buffer_size / options->segments_nb) + (options->max_buffer_size % options->segments_nb) + - options->auth_digest_sz), + options->digest_sz), rte_socket_id()); if (ctx->pkt_mbuf_pool_in == NULL) @@ -250,7 +263,7 @@ cperf_latency_test_constructor(uint8_t dev_id, uint16_t qp_id, RTE_PKTMBUF_HEADROOM + RTE_CACHE_LINE_ROUNDUP( options->max_buffer_size + - options->auth_digest_sz), + options->digest_sz), rte_socket_id()); if (ctx->pkt_mbuf_pool_out == NULL) @@ -276,9 +289,14 @@ cperf_latency_test_constructor(uint8_t dev_id, uint16_t qp_id, snprintf(pool_name, sizeof(pool_name), "cperf_op_pool_cdev_%d", dev_id); + uint16_t priv_size = sizeof(struct priv_op_data) + + test_vector->cipher_iv.length + + test_vector->auth_iv.length + + test_vector->aead_iv.length; ctx->crypto_op_pool = rte_crypto_op_pool_create(pool_name, - RTE_CRYPTO_OP_TYPE_SYMMETRIC, options->pool_sz, 0, 0, - rte_socket_id()); + RTE_CRYPTO_OP_TYPE_SYMMETRIC, options->pool_sz, + 512, priv_size, rte_socket_id()); + if (ctx->crypto_op_pool == NULL) goto err; @@ -295,11 +313,20 @@ err: return NULL; } +static inline void +store_timestamp(struct rte_crypto_op *op, uint64_t timestamp) +{ + struct priv_op_data *priv_data; + + priv_data = (struct priv_op_data *) (op->sym + 1); + priv_data->result->status = op->status; + priv_data->result->tsc_end = timestamp; +} + int cperf_latency_test_runner(void *arg) { struct cperf_latency_ctx *ctx = arg; - struct cperf_op_result *pres; uint16_t test_burst_size; uint8_t burst_size_idx = 0; @@ -311,6 +338,7 @@ cperf_latency_test_runner(void *arg) struct rte_crypto_op *ops[ctx->options->max_burst_size]; struct rte_crypto_op *ops_processed[ctx->options->max_burst_size]; uint64_t i; + struct priv_op_data *priv_data; uint32_t lcore = rte_lcore_id(); @@ -339,6 +367,10 @@ cperf_latency_test_runner(void *arg) else test_burst_size = ctx->options->burst_size_list[0]; + uint16_t iv_offset = sizeof(struct rte_crypto_op) + + sizeof(struct rte_crypto_sym_op) + + sizeof(struct cperf_op_result *); + while (test_burst_size <= ctx->options->max_burst_size) { uint64_t ops_enqd = 0, ops_deqd = 0; uint64_t m_idx = 0, b_idx = 0; @@ -360,14 +392,20 @@ cperf_latency_test_runner(void *arg) if (burst_size != rte_crypto_op_bulk_alloc( ctx->crypto_op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC, - ops, burst_size)) + ops, burst_size)) { + RTE_LOG(ERR, USER1, + "Failed to allocate more crypto operations " + "from the the crypto operation pool.\n" + "Consider increasing the pool size " + "with --pool-sz\n"); return -1; + } /* Setup crypto op, attach mbuf etc */ (ctx->populate_ops)(ops, &ctx->mbufs_in[m_idx], &ctx->mbufs_out[m_idx], burst_size, ctx->sess, ctx->options, - ctx->test_vector); + ctx->test_vector, iv_offset); tsc_start = rte_rdtsc_precise(); @@ -393,12 +431,19 @@ cperf_latency_test_runner(void *arg) tsc_end = rte_rdtsc_precise(); /* Free memory for not enqueued operations */ - for (i = ops_enqd; i < burst_size; i++) - rte_crypto_op_free(ops[i]); + if (ops_enqd != burst_size) + rte_mempool_put_bulk(ctx->crypto_op_pool, + (void **)&ops[ops_enqd], + burst_size - ops_enqd); for (i = 0; i < ops_enqd; i++) { ctx->res[tsc_idx].tsc_start = tsc_start; - ops[i]->opaque_data = (void *)&ctx->res[tsc_idx]; + /* + * Private data structure starts after the end of the + * rte_crypto_sym_op structure. + */ + priv_data = (struct priv_op_data *) (ops[i]->sym + 1); + priv_data->result = (void *)&ctx->res[tsc_idx]; tsc_idx++; } @@ -409,14 +454,11 @@ cperf_latency_test_runner(void *arg) * the crypto operation will change the data and cause * failures. */ - for (i = 0; i < ops_deqd; i++) { - pres = (struct cperf_op_result *) - (ops_processed[i]->opaque_data); - pres->status = ops_processed[i]->status; - pres->tsc_end = tsc_end; + for (i = 0; i < ops_deqd; i++) + store_timestamp(ops_processed[i], tsc_end); - rte_crypto_op_free(ops_processed[i]); - } + rte_mempool_put_bulk(ctx->crypto_op_pool, + (void **)ops_processed, ops_deqd); deqd_tot += ops_deqd; deqd_max = max(ops_deqd, deqd_max); @@ -445,14 +487,11 @@ cperf_latency_test_runner(void *arg) tsc_end = rte_rdtsc_precise(); if (ops_deqd != 0) { - for (i = 0; i < ops_deqd; i++) { - pres = (struct cperf_op_result *) - (ops_processed[i]->opaque_data); - pres->status = ops_processed[i]->status; - pres->tsc_end = tsc_end; + for (i = 0; i < ops_deqd; i++) + store_timestamp(ops_processed[i], tsc_end); - rte_crypto_op_free(ops_processed[i]); - } + rte_mempool_put_bulk(ctx->crypto_op_pool, + (void **)ops_processed, ops_deqd); deqd_tot += ops_deqd; deqd_max = max(ops_deqd, deqd_max); @@ -547,6 +586,7 @@ cperf_latency_test_destructor(void *arg) if (ctx == NULL) return; - cperf_latency_test_free(ctx, ctx->options->pool_sz); + rte_cryptodev_stop(ctx->dev_id); + cperf_latency_test_free(ctx, ctx->options->pool_sz); }