> -----Original Message----- > From: Burakov, Anatoly > Sent: Thursday, August 24, 2017 11:48 AM > To: dev@dpdk.org > Cc: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com>; Doherty, > Declan <declan.dohe...@intel.com>; Burakov, Anatoly > <anatoly.bura...@intel.com> > Subject: [PATCH 3/4] test-crypto-perf: add new PMD benchmarking mode > > This patch adds a new benchmarking mode, which is intended for > microbenchmarking individual parts of the cryptodev framework, > specifically crypto ops alloc-build-free, cryptodev PMD enqueue and > cryptodev PMD dequeue. > > It works by first benchmarking crypto operation alloc-build-free loop (no > enqueues/dequeues happening), and then benchmarking enqueue and > dequeue separately, by first completely filling up the TX queue, and then > completely draining the RX queue. > > Results are shown as cycle counts per alloc/build/free, PMD enqueue and > PMD dequeue. > > One new test mode is added: "pmd-cyclecount" > (called with --ptest=pmd-cyclecount) > > New command-line argument is also added: > --pmd-cyclecount-delay-ms: this is a pmd-cyclecount-specific parameter > that controls the delay between enqueue and dequeue. This is > useful for benchmarking hardware acceleration, as hardware may > not be able to keep up with enqueued packets. This parameter > can be increased if there are large amounts of dequeue > retries. > > Signed-off-by: Burakov, Anatoly <anatoly.bura...@intel.com>
Git-check-log is complaining about this tag. Actually, the author is "Anatoly Burakov", but here is "Burakov, Anatoly". Looks like this is something to fix. > --- ... > > diff --git a/app/test-crypto-perf/cperf_test_pmd_cyclecount.c b/app/test- > crypto-perf/cperf_test_pmd_cyclecount.c > new file mode 100644 > index 0000000..ef7fa83 ... > +void * > +cperf_pmd_cyclecount_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) > +{ > + struct cperf_pmd_cyclecount_ctx *ctx = NULL; > + unsigned int mbuf_idx = 0; > + char pool_name[32] = ""; > + > + /* preallocate buffers for crypto ops as they can get quite big */ > + size_t alloc_sz = sizeof(struct rte_crypto_op *) * > + options->nb_descriptors; > + > + ctx = rte_malloc(NULL, sizeof(struct cperf_pmd_cyclecount_ctx), 0); > + if (ctx == NULL) > + goto err; > + > + ctx->dev_id = dev_id; > + ctx->qp_id = qp_id; > + > + ctx->populate_ops = op_fns->populate_ops; > + ctx->options = options; > + ctx->test_vector = test_vector; > + > + /* IV goes at the end of the cryptop operation */ Typo here: "crypto" > + uint16_t iv_offset = sizeof(struct rte_crypto_op) + > + sizeof(struct rte_crypto_sym_op); > + ... > + > + snprintf(pool_name, sizeof(pool_name), "cperf_op_pool_cdev_%d", > + dev_id); > + > + uint16_t priv_size = test_vector->cipher_iv.length + > + test_vector->auth_iv.length; Missing "+ test_vector->aead_iv.length", added in a patch at the end of the previous release. > + ... > +/* benchmark alloc-build-free of ops */ static inline int > +pmd_cyclecount_bench_ops(struct pmd_cyclecount_state *state, > uint32_t cur_op, > + uint16_t test_burst_size) Use two tabs for the next line, instead of aligning with the parenthesis above. Look at other functions that have the same issue. > +{ > + uint32_t iter_ops_left = state->opts->total_ops - cur_op; > + uint32_t iter_ops_needed = RTE_MIN(state->opts->nb_descriptors, > + iter_ops_left); > + uint32_t cur_iter_op; > + > + for (cur_iter_op = 0; cur_iter_op < iter_ops_needed; > + cur_iter_op += test_burst_size) { Same comment as above, about the alignment. > + uint32_t burst_size = RTE_MIN(state->opts->total_ops - > cur_op, > + test_burst_size); > + struct rte_crypto_op **ops = &state->ctx- > >ops[cur_iter_op]; > + > + if (burst_size != rte_crypto_op_bulk_alloc( > + state->ctx->crypto_op_pool, > + RTE_CRYPTO_OP_TYPE_SYMMETRIC, > + ops, burst_size)) Same as above, add an extra tab. > + return -1; > + > + /* Setup crypto op, attach mbuf etc */ > + (state->ctx->populate_ops)(ops, > + &state->ctx->mbufs_in[cur_iter_op], > + &state->ctx->mbufs_out[cur_iter_op], > + burst_size, state->ctx->sess, > + state->opts, > + state->ctx->test_vector, iv_offset); > + > +#ifdef CPERF_LINEARIZATION_ENABLE > + /* Check if source mbufs require coalescing */ > + if (state->linearize) { > + uint8_t i; > + for (i = 0; i < burst_size; i++) { > + struct rte_mbuf *src = > + ops[i]->sym->m_src; > + rte_pktmbuf_linearize(src); > + } > + } > +#endif /* CPERF_LINEARIZATION_ENABLE */ > + rte_mempool_put_bulk(state->ctx->crypto_op_pool, > + (void **)ops, burst_size); > + } > + > + return 0; > +} > + ... > + > +/* benchmark enqueue, returns number of ops enqueued */ static > uint32_t > +pmd_cyclecount_bench_enq(struct pmd_cyclecount_state *state, > + uint32_t iter_ops_needed, uint16_t > test_burst_size) { > + /* Enqueue full descriptor ring of ops on crypto device */ > + uint32_t cur_iter_op = 0; > + while (cur_iter_op < iter_ops_needed) { > + uint32_t burst_size = > + RTE_MIN(iter_ops_needed - cur_iter_op, > + test_burst_size); > + struct rte_crypto_op **ops = > + &state->ctx->ops[cur_iter_op]; > + uint32_t burst_enqd; > + > + burst_enqd = No need to place the function in a separate line, I think. > + rte_cryptodev_enqueue_burst( > + state->ctx->dev_id, > + state->ctx->qp_id, > + ops, burst_size); > + > + /* if we couldn't enqueue anything, the queue is full */ > + if (!burst_enqd) { > + /* don't try to dequeue anything we didn't enqueue > */ > + return cur_iter_op; > + } > + > + if (burst_enqd < burst_size) > + state->ops_enq_retries++; > + state->ops_enqd += burst_enqd; > + cur_iter_op += burst_enqd; > + } > + return iter_ops_needed; > +} > +