+int
+perf_cryptodev_setup(struct evt_test *test, struct evt_options *opt)
+{
+ uint8_t cdev_count, cdev_id, nb_plcores, nb_qps;
+ struct test_perf *t = evt_test_priv(test);
+ unsigned int max_session_size;
+ uint32_t nb_sessions;
+ int ret;
+
+ if (opt->prod_type != EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)
+ return 0;
+
+ cdev_count = rte_cryptodev_count();
+ if (cdev_count == 0) {
+ evt_err("No crypto devices available\n");
+ return -ENODEV;
+ }
+
+ t->ca_op_pool = rte_crypto_op_pool_create(
+ "crypto_op_pool", RTE_CRYPTO_OP_TYPE_SYMMETRIC, opt->pool_sz,
+ 128, 0, rte_socket_id());
+ if (t->ca_op_pool == NULL) {
+ evt_err("Failed to create crypto op pool");
+ return -ENOMEM;
+ }
+
+ nb_sessions = evt_nr_active_lcores(opt->plcores) * t->nb_flows;
+ t->ca_sess_pool = rte_cryptodev_sym_session_pool_create(
+ "ca_sess_pool", nb_sessions, 0, 0,
+ sizeof(union rte_event_crypto_metadata), SOCKET_ID_ANY);
+ if (t->ca_sess_pool == NULL) {
+ evt_err("Failed to create sym session pool");
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ max_session_size = 0;
+ for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
+ unsigned int session_size;
+
+ session_size =
+ rte_cryptodev_sym_get_private_session_size(cdev_id);
+ if (session_size > max_session_size)
+ max_session_size = session_size;
+ }
+
+ max_session_size += sizeof(union rte_event_crypto_metadata);
+ t->ca_sess_priv_pool = rte_mempool_create(
+ "ca_sess_priv_pool", nb_sessions, max_session_size, 0, 0, NULL,
+ NULL, NULL, NULL, SOCKET_ID_ANY, 0);
+ if (t->ca_sess_priv_pool == NULL) {
+ evt_err("failed to create sym session private pool");
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ /*
+ * Calculate number of needed queue pairs, based on the amount of
+ * available number of logical cores and crypto devices. For instance,
+ * if there are 4 cores and 2 crypto devices, 2 queue pairs will be set
+ * up per device.
+ */
+ nb_plcores = evt_nr_active_lcores(opt->plcores);
+ nb_qps = (nb_plcores % cdev_count) ? (nb_plcores / cdev_count) + 1 :
+ nb_plcores / cdev_count;
+ for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
+ struct rte_cryptodev_qp_conf qp_conf;
+ struct rte_cryptodev_config conf;
+ struct rte_cryptodev_info info;
+ int qp_id;
+
+ rte_cryptodev_info_get(cdev_id, &info);
+ if (nb_qps > info.max_nb_queue_pairs) {
+ evt_err("Not enough queue pairs per cryptodev (%u)",
+ nb_qps);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ conf.nb_queue_pairs = nb_qps;
+ conf.socket_id = SOCKET_ID_ANY;
+ conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
+
+ ret = rte_cryptodev_configure(cdev_id, &conf);
+ if (ret) {
+ evt_err("Failed to configure cryptodev (%u)", cdev_id);
+ goto err;
+ }
+
+ qp_conf.nb_descriptors = NB_CRYPTODEV_DESCRIPTORS;
+ qp_conf.mp_session = t->ca_sess_pool;
+ qp_conf.mp_session_private = t->ca_sess_priv_pool;
+
+ for (qp_id = 0; qp_id < conf.nb_queue_pairs; qp_id++) {
+ ret = rte_cryptodev_queue_pair_setup(
+ cdev_id, qp_id, &qp_conf,
+ rte_cryptodev_socket_id(cdev_id));
+ if (ret) {
+ evt_err("Failed to setup queue pairs on cryptodev %u\n",
+ cdev_id);
+ goto err;
+ }
+ }
+ }
+
+ return 0;
+err:
+ for (cdev_id = 0; cdev_id < cdev_count; cdev_id++)
+ rte_cryptodev_close(cdev_id);
+
+ rte_mempool_free(t->ca_op_pool);
+ rte_mempool_free(t->ca_sess_pool);
+ rte_mempool_free(t->ca_sess_priv_pool);
+
+ return ret;
+}
+
+void
+perf_cryptodev_destroy(struct evt_test *test, struct evt_options *opt)
+{
+ uint8_t cdev_id, cdev_count = rte_cryptodev_count();
+ struct test_perf *t = evt_test_priv(test);
+ uint16_t port;
+
+ if (opt->prod_type != EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR)
+ return;
+
+ for (port = t->nb_workers; port < perf_nb_event_ports(opt); port++) {
+ struct rte_cryptodev_sym_session *sess;
+ struct prod_data *p = &t->prod[port];
+ uint32_t flow_id;
+ uint8_t cdev_id;
+
+ for (flow_id = 0; flow_id < t->nb_flows; flow_id++) {
+ sess = p->ca.crypto_sess[flow_id];
+ cdev_id = p->ca.cdev_id;
+ rte_cryptodev_sym_session_clear(cdev_id, sess);
+ rte_cryptodev_sym_session_free(sess);
+ }
+
+ rte_event_crypto_adapter_queue_pair_del(
+ TEST_PERF_CA_ID, p->ca.cdev_id, p->ca.cdev_qp_id);
+ }
+
+ rte_event_crypto_adapter_free(TEST_PERF_CA_ID);
+
+ for (cdev_id = 0; cdev_id < cdev_count; cdev_id++) {
+ rte_cryptodev_stop(cdev_id);
+ rte_cryptodev_close(cdev_id);
+ }
+
+ rte_mempool_free(t->ca_op_pool);
+ rte_mempool_free(t->ca_sess_pool);
+ rte_mempool_free(t->ca_sess_priv_pool);
+}
+