From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C232CA0547; Wed, 15 Jul 2020 17:51:06 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DD0D41B952; Wed, 15 Jul 2020 17:50:54 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 344A6199BC for ; Wed, 15 Jul 2020 17:50:53 +0200 (CEST) IronPort-SDR: w9TgnLyc5P/pKC4/bUS9R+FlPi4WI5o3s1jvmlLKR7dIdXUrCfEwlwAzTgHRXYfqqxtSp/OakA ejtw1ozvlb+A== X-IronPort-AV: E=McAfee;i="6000,8403,9683"; a="167303523" X-IronPort-AV: E=Sophos;i="5.75,355,1589266800"; d="scan'208";a="167303523" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jul 2020 08:50:52 -0700 IronPort-SDR: cwE9bi8Rthy8NToRzi/XI3JWosGwLw55cNbJbyECqq9XJimQKF9jsQI+oS/iAGFTdehmTymMjo YA4DhYlatSmg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,355,1589266800"; d="scan'208";a="318102537" Received: from akusztax-mobl.ger.corp.intel.com ([10.104.121.32]) by fmsmga002.fm.intel.com with ESMTP; 15 Jul 2020 08:50:51 -0700 From: Arek Kusztal To: dev@dpdk.org Cc: akhil.goyal@nxp.com, fiona.trahe@intel.com, Arek Kusztal Date: Wed, 15 Jul 2020 17:50:40 +0200 Message-Id: <20200715155043.12476-3-arkadiuszx.kusztal@intel.com> X-Mailer: git-send-email 2.19.1.windows.1 In-Reply-To: <20200715155043.12476-1-arkadiuszx.kusztal@intel.com> References: <20200715155043.12476-1-arkadiuszx.kusztal@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v3 2/5] app/mp_crypto: add device configuration functions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add functions to allow device configuration, command line used to configure device is described in mp_crypto.rst file. Signed-off-by: Arek Kusztal --- 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