DPDK patches and discussions
 help / color / mirror / Atom feed
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


  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).