From: Arek Kusztal <arkadiuszx.kusztal@intel.com>
To: dev@dpdk.org
Cc: akhil.goyal@nxp.com, fiona.trahe@intel.com,
Arek Kusztal <arkadiuszx.kusztal@intel.com>
Subject: [dpdk-dev] [PATCH v3 2/5] app/mp_crypto: add device configuration functions
Date: Wed, 15 Jul 2020 17:50:40 +0200 [thread overview]
Message-ID: <20200715155043.12476-3-arkadiuszx.kusztal@intel.com> (raw)
In-Reply-To: <20200715155043.12476-1-arkadiuszx.kusztal@intel.com>
Add functions to allow device configuration, command line
used to configure device is described in mp_crypto.rst file.
Signed-off-by: Arek Kusztal <arkadiuszx.kusztal@intel.com>
---
app/test-mp-crypto/main.c | 229 ++++++++++++++++++++++++++++++++++++++++-
app/test-mp-crypto/mp_crypto.h | 6 ++
2 files changed, 232 insertions(+), 3 deletions(-)
diff --git a/app/test-mp-crypto/main.c b/app/test-mp-crypto/main.c
index ce150b5..680faf0 100644
--- a/app/test-mp-crypto/main.c
+++ b/app/test-mp-crypto/main.c
@@ -29,8 +29,7 @@ static int
mp_app_init(int argc, char *argv[])
{
/* init EAL */
- int ret = rte_eal_init(argc, argv)
-;
+ int ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_exit(-1, "Invalid EAL arguments!\n");
@@ -69,7 +68,8 @@ mp_app_init(int argc, char *argv[])
return -1;
}
/* Setup memzone for shared data */
- mp_app_process_mz = rte_memzone_reserve(MP_APP_PROC_SHARED_NAME,
+ mp_app_process_mz = rte_memzone_reserve(
+ MP_APP_PROC_SHARED_NAME,
sizeof(struct mp_app_process_data), 0, 0);
if (mp_app_process_mz == NULL) {
RTE_LOG(ERR, USER1,
@@ -153,6 +153,219 @@ void mp_crypto_exit_app(void)
}
}
+int
+mp_crypto_init_devs(void)
+{
+ uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
+ struct rte_cryptodev_config conf;
+ struct rte_cryptodev_info info;
+ int nb_devs = 0;
+ int i;
+
+ for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++)
+ mp_app_devs[i].id = -1;
+
+ if (mp_app_driver_id == -1) {
+ MP_APP_LOG(ERR, COL_RED, "No driver of type %s registered",
+ mp_app_params->devtype_name);
+ return -1;
+ }
+
+ nb_devs = rte_cryptodev_devices_get(mp_app_params->devtype_name,
+ valid_devs, RTE_CRYPTO_MAX_DEVS);
+
+ if (nb_devs < 1) {
+ MP_APP_LOG(ERR, COL_RED, "No %s devices found",
+ mp_app_params->devtype_name);
+ return -1;
+ }
+
+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+ mp_shared_data->devices_number = nb_devs;
+ } else {
+ if (mp_shared_data->devices_number != nb_devs) {
+ MP_APP_LOG(INFO, COL_RED,
+ "- Number of devices probed by primary process differs with current process config, number of devices = %d, number on primary = %d",
+ nb_devs,
+ mp_shared_data->devices_number);
+ return -1;
+ }
+ }
+
+ for (i = 0; i < nb_devs ; i++) {
+ rte_cryptodev_info_get(valid_devs[i], &info);
+ if (info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) {
+ mp_app_devs[mp_app_devs_cnt].id = valid_devs[i];
+ mp_app_devs[mp_app_devs_cnt].probed = 1;
+ mp_app_devs[mp_app_devs_cnt++].max_queue_pairs =
+ info.max_nb_queue_pairs;
+
+ /* Last one is as good as first one */
+ mp_app_max_queues = info.max_nb_queue_pairs;
+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+ strncpy(mp_shared_data->prim_dev_name[i].name,
+ info.device->name,
+ MP_APP_DEV_NAME_LEN);
+ } else {
+ if (strncmp(
+ mp_shared_data->prim_dev_name[i].name,
+ info.device->name,
+ MP_APP_DEV_NAME_LEN)) {
+ MP_APP_LOG(INFO, COL_RED,
+ "Wrong device: %s, are BDF passed to primary process the same?",
+ info.device->name);
+ return -1;
+ }
+ }
+ }
+ }
+ /* Pick one device to be used for session creation,
+ * only valid when all devices of the same type.
+ */
+ mp_app_device_id = mp_app_devs[0].id;
+ MP_APP_LOG(INFO, COL_GREEN,
+ "Configure devices according to mask: 0x%"PRIu64,
+ mp_app_params->dev_to_configure_mask);
+
+ uint64_t dev_mask_id;
+ int dev_id;
+
+ for (dev_mask_id = 1, dev_id = 0; dev_id <= MP_APP_MAX_DEVS;
+ dev_mask_id <<= 1, dev_id++) {
+ if (dev_mask_id & mp_app_params->dev_to_configure_mask) {
+ if (!mp_app_devs[dev_id].probed)
+ continue;
+
+ /* TODO check if already configured */
+
+ conf.nb_queue_pairs = info.max_nb_queue_pairs;
+ conf.socket_id = SOCKET_ID_ANY;
+ conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
+
+ if (rte_cryptodev_configure(mp_app_devs[dev_id].id,
+ &conf) != 0) {
+ RTE_LOG(ERR, USER1,
+ "Error when configuring device number %d",
+ dev_id);
+ return -1;
+ }
+
+ mp_app_devs[dev_id].configured = 1;
+ MP_APP_LOG(INFO, COL_BLUE, "- Configure Device id %d",
+ mp_app_devs[dev_id].id);
+ }
+ }
+ return 0;
+}
+
+static int
+steup_qps_main_loop(int dev_id, int qp_id)
+{
+ while (1) {
+ /* This could be is_dev_configured */
+ int ret = rte_cryptodev_get_qp_status(
+ mp_app_devs[dev_id].id, qp_id);
+ if (ret == 1) {
+ mp_app_devs[dev_id].queue_pair_flag[
+ qp_id] = 0;
+ MP_APP_LOG_2(WARNING, COL_YEL,
+ "Queue was already configured by other process, skipping");
+ return 1;
+ } else if (ret < 0) {
+ char c;
+
+ mp_app_devs[dev_id].queue_pair_flag[
+ qp_id] = 0;
+ MP_APP_LOG_2(ERR, COL_RED,
+ "Error setting queues, was this device configured?");
+ printf(
+ "\n - Press 'w' to wait until other process will configure it");
+ printf("\n - Press 'x' to exit");
+ int __rte_unused r = scanf("%s", &c);
+
+ if (c == 'w') {
+ int timeout = 3;
+ int counter = 1;
+
+ while (timeout <= counter) {
+ rte_delay_ms(1000);
+ MP_APP_LOG(INFO,
+ COL_NORM,
+ "Waiting for %d out of %d seconds",
+ counter++, 3);
+ }
+ } else if (c == 'x')
+ return -1;
+ } else if (ret == 0)
+ return 0;
+ }
+
+}
+
+int
+mp_crypto_setup_qps(void)
+{
+ int dev_id;
+ int qp_id;
+ int queue_count = 0;
+ int last_qp_on_device = mp_app_max_queues;
+
+ MP_APP_LOG_2(INFO, COL_NORM, "- Configuring queues:");
+ for (dev_id = 0; dev_id < MP_APP_MAX_DEVS; dev_id++) {
+ if (!mp_app_devs[dev_id].probed)
+ continue;
+ for (qp_id = 0; qp_id < mp_app_max_queues; qp_id++) {
+ if (mp_app_devs[dev_id].queue_pair_flag[qp_id]
+ != QP_TO_CONFIGURE)
+ continue;
+ struct rte_cryptodev_qp_conf qp_conf;
+ int cont = steup_qps_main_loop(dev_id, qp_id);
+
+ /* Queue was already set, continue */
+ if (cont == 1)
+ continue;
+ else if (cont == -1)
+ return -1;
+ qp_conf.nb_descriptors = MP_CRYPTO_QP_DESC_NUM;
+ qp_conf.mp_session = NULL;
+ qp_conf.mp_session_private = NULL;
+ if (rte_cryptodev_queue_pair_setup(
+ mp_app_devs[dev_id].id,
+ qp_id, &qp_conf,
+ rte_cryptodev_socket_id(
+ mp_app_devs[dev_id].id))) {
+ RTE_LOG(ERR, USER1,
+ "Error when setting up queue pair %d on dev %d",
+ qp_id, dev_id);
+ return -1;
+ }
+ MP_APP_LOG(INFO, COL_BLUE, "Created qp %d on dev %d",
+ qp_id, mp_app_devs[dev_id].id);
+ mp_app_devs[dev_id].queue_pair_flag[qp_id] = 1;
+ queue_count++;
+ }
+ }
+
+ for (dev_id = 0; dev_id < MP_APP_MAX_DEVS; dev_id++) {
+ if (!mp_app_devs[dev_id].probed)
+ continue;
+ for (qp_id = last_qp_on_device; qp_id < MP_APP_QUEUE_PAIRS_NUM;
+ qp_id++) {
+ if (mp_app_devs[dev_id].queue_pair_flag[qp_id]
+ == QP_TO_CONFIGURE) {
+ MP_APP_LOG(WARNING, COL_YEL,
+ "Cannot create qp %d on dev %d, maximum allowed by this device = %d (%d queue pairs)",
+ qp_id, mp_app_devs[dev_id].id,
+ mp_app_max_queues - 1,
+ mp_app_max_queues);
+ }
+ }
+ }
+
+ MP_APP_LOG(INFO, COL_GREEN, "- Configured %d queues.", queue_count);
+ return 0;
+}
+
int main(int argc, char *argv[])
{
if (mp_app_init(argc, argv) < 0) {
@@ -160,6 +373,16 @@ int main(int argc, char *argv[])
goto err;
};
+ if (mp_crypto_init_devs() < 0) {
+ MP_APP_LOG_2(ERR, COL_RED, "Devices cannot be initialized");
+ goto err;
+ };
+
+ if (mp_crypto_setup_qps() < 0) {
+ MP_APP_LOG_2(ERR, COL_RED, "Setup qps returned an error");
+ goto err;
+ };
+
mp_crypto_exit_app();
return 0;
err:
diff --git a/app/test-mp-crypto/mp_crypto.h b/app/test-mp-crypto/mp_crypto.h
index da89501..fa6dc44 100644
--- a/app/test-mp-crypto/mp_crypto.h
+++ b/app/test-mp-crypto/mp_crypto.h
@@ -168,6 +168,12 @@ int
mp_crypto_secondary_handler(const struct rte_mp_msg *mp_msg,
const void *peer);
+int mp_crypto_setup_qps(void);
+/* Function to setup queues according to input string */
+
+int mp_crypto_init_devs(void);
+/* Function to setup devices according to mask */
+
#define IV_OFFSET (sizeof(struct rte_crypto_op) + \
sizeof(struct rte_crypto_sym_op) + DEFAULT_NUM_XFORMS * \
sizeof(struct rte_crypto_sym_xform))
--
2.1.0
next prev parent reply other threads:[~2020-07-15 15:51 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-15 15:50 [dpdk-dev] [PATCH v3 0/5] app: add multi process crypto application Arek Kusztal
2020-07-15 15:50 ` [dpdk-dev] [PATCH v3 1/5] app: add muli " Arek Kusztal
2020-07-15 15:50 ` Arek Kusztal [this message]
2020-07-15 15:50 ` [dpdk-dev] [PATCH v3 3/5] app/mp_crypto: add function to allocatie mempools Arek Kusztal
2020-07-15 15:50 ` [dpdk-dev] [PATCH v3 4/5] app/mp_crypto: add enqueue-dequeue functions Arek Kusztal
2020-07-15 15:50 ` [dpdk-dev] [PATCH v3 5/5] doc: add documentation for multi process crypto app Arek Kusztal
2020-07-15 18:22 ` Akhil Goyal
2020-07-22 14:20 ` Kusztal, ArkadiuszX
2020-07-23 8:45 ` Akhil Goyal
2020-07-15 18:26 ` [dpdk-dev] [PATCH v3 0/5] app: add multi process crypto application Akhil Goyal
2020-07-15 19:11 ` Thomas Monjalon
2020-07-15 19:25 ` Akhil Goyal
2020-07-15 20:06 ` Thomas Monjalon
2020-07-15 20:15 ` Akhil Goyal
2020-07-15 20:20 ` Thomas Monjalon
2020-08-31 11:50 ` Kusztal, ArkadiuszX
2020-10-08 13:16 ` Kusztal, ArkadiuszX
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200715155043.12476-3-arkadiuszx.kusztal@intel.com \
--to=arkadiuszx.kusztal@intel.com \
--cc=akhil.goyal@nxp.com \
--cc=dev@dpdk.org \
--cc=fiona.trahe@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).