From patchwork Wed Mar 18 20:41:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arkadiusz Kusztal X-Patchwork-Id: 66888 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 604EBA057D; Wed, 18 Mar 2020 21:44:59 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2F9B625D9; Wed, 18 Mar 2020 21:44:58 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 7BA7FCF3 for ; Wed, 18 Mar 2020 21:44:56 +0100 (CET) IronPort-SDR: 0kzdNElFxVs34SX3gIlSso6mYpl9070f6o8jquxTEZOF1RaidPsDa/tqugWRy1c72F7tENNJ8M xy4l/DkOqjhA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Mar 2020 13:44:52 -0700 IronPort-SDR: XH+UilSL/H0VGe81OrZJMz/O6+E6WgZFiZIqyjwtcNkKykX6twjJrmuVLwXwKfxmMoI/JnCbLw 0JyJLxEpJ9mQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,568,1574150400"; d="scan'208";a="263510197" Received: from akusztax-mobl.ger.corp.intel.com ([10.104.121.77]) by orsmga002.jf.intel.com with ESMTP; 18 Mar 2020 13:44:49 -0700 From: Arek Kusztal To: dev@dpdk.org Cc: akhil.goyal@nxp.com, fiona.trahe@intel.com, thomas@monjalon.net, Arek Kusztal Date: Wed, 18 Mar 2020 21:41:36 +0100 Message-Id: <20200318204136.10508-1-arkadiuszx.kusztal@intel.com> X-Mailer: git-send-email 2.19.1.windows.1 MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH] cryptodev: version rte_cryptodev_info_get function 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" This patch adds versioned function rte_cryptodev_info_get. Node 20.05 function works the same way it was working before. Node 20.0 function strips capability added in 20.05 release to prevent some issues with ABI policy. To do that new capability array is allocated per device and returned to user instead of the original array passed by PMD. Signed-off-by: Arek Kusztal --- lib/librte_cryptodev/rte_cryptodev.c | 97 +++++++++++++++++++++++++- lib/librte_cryptodev/rte_cryptodev.h | 12 +++- lib/librte_cryptodev/rte_cryptodev_version.map | 7 ++ 3 files changed, 113 insertions(+), 3 deletions(-) diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c index 6d1d0e9..2d030ba 100644 --- a/lib/librte_cryptodev/rte_cryptodev.c +++ b/lib/librte_cryptodev/rte_cryptodev.c @@ -41,6 +41,9 @@ #include "rte_cryptodev.h" #include "rte_cryptodev_pmd.h" +#include +#include + static uint8_t nb_drivers; static struct rte_cryptodev rte_crypto_devices[RTE_CRYPTO_MAX_DEVS]; @@ -56,6 +59,13 @@ static struct rte_cryptodev_global cryptodev_globals = { /* spinlock for crypto device callbacks */ static rte_spinlock_t rte_cryptodev_cb_lock = RTE_SPINLOCK_INITIALIZER; +static const struct rte_cryptodev_capabilities + cryptodev_undefined_capabilities[] = { + RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() +}; + +struct rte_cryptodev_capabilities *capability_copies[RTE_CRYPTO_MAX_DEVS]; +uint8_t is_capability_checked[RTE_CRYPTO_MAX_DEVS]; /** * The user application callback description. @@ -999,6 +1009,13 @@ rte_cryptodev_close(uint8_t dev_id) RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP); retval = (*dev->dev_ops->dev_close)(dev); + + if (capability_copies[dev_id]) { + free(capability_copies[dev_id]); + capability_copies[dev_id] = NULL; + } + is_capability_checked[dev_id] = 0; + if (retval < 0) return retval; @@ -1111,11 +1128,12 @@ rte_cryptodev_stats_reset(uint8_t dev_id) (*dev->dev_ops->stats_reset)(dev); } - void -rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info) +rte_cryptodev_info_get_v20(uint8_t dev_id, struct rte_cryptodev_info *dev_info) { struct rte_cryptodev *dev; + const struct rte_cryptodev_capabilities *capability; + uint8_t counter = 0; if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) { CDEV_LOG_ERR("Invalid dev_id=%d", dev_id); @@ -1129,10 +1147,85 @@ rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info) RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get); (*dev->dev_ops->dev_infos_get)(dev, dev_info); + if (capability_copies[dev_id] == NULL) { + if (!is_capability_checked[dev_id]) { + uint8_t found_invalid_capa = 0; + + for (capability = dev_info->capabilities; + capability->op != RTE_CRYPTO_OP_TYPE_UNDEFINED; + ++capability, ++counter) { + if (capability->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && + capability->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AEAD + && capability->sym.aead.algo >= + RTE_CRYPTO_AEAD_CHACHA20_POLY1305) { + found_invalid_capa = 1; + counter--; + } + } + is_capability_checked[dev_id] = 1; + if (found_invalid_capa) { + capability_copies[dev_id] = malloc(counter * + sizeof(struct rte_cryptodev_capabilities)); + if (capability_copies[dev_id] == NULL) { + /* + * error case - no memory to store the trimmed list, + * so have to return an empty list + */ + dev_info->capabilities = + cryptodev_undefined_capabilities; + is_capability_checked[dev_id] = 0; + } else { + counter = 0; + for (capability = dev_info->capabilities; + capability->op != + RTE_CRYPTO_OP_TYPE_UNDEFINED; + capability++) { + if (!(capability->op == + RTE_CRYPTO_OP_TYPE_SYMMETRIC + && capability->sym.xform_type == + RTE_CRYPTO_SYM_XFORM_AEAD + && capability->sym.aead.algo >= + RTE_CRYPTO_AEAD_CHACHA20_POLY1305)) { + capability_copies[dev_id][counter++] = + *capability; + } + } + dev_info->capabilities = + capability_copies[dev_id]; + } + } + } + } else + dev_info->capabilities = capability_copies[dev_id]; + dev_info->driver_name = dev->device->driver->name; dev_info->device = dev->device; } +VERSION_SYMBOL(rte_cryptodev_info_get, _v20, 20.0); + +void +rte_cryptodev_info_get_v2005(uint8_t dev_id, struct rte_cryptodev_info *dev_info) +{ + struct rte_cryptodev *dev; + if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) { + CDEV_LOG_ERR("Invalid dev_id=%d", dev_id); + return; + } + + dev = &rte_crypto_devices[dev_id]; + + memset(dev_info, 0, sizeof(struct rte_cryptodev_info)); + + RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get); + (*dev->dev_ops->dev_infos_get)(dev, dev_info); + + dev_info->driver_name = dev->device->driver->name; + dev_info->device = dev->device; +} +MAP_STATIC_SYMBOL(void rte_cryptodev_info_get(uint8_t dev_id, + struct rte_cryptodev_info *dev_info), rte_cryptodev_info_get_v2005); int rte_cryptodev_callback_register(uint8_t dev_id, diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h index 437b8a9..06ce2f2 100644 --- a/lib/librte_cryptodev/rte_cryptodev.h +++ b/lib/librte_cryptodev/rte_cryptodev.h @@ -24,6 +24,9 @@ extern "C" { #include #include +#include +#include + extern const char **rte_cyptodev_names; /* Logging Macros */ @@ -758,7 +761,14 @@ rte_cryptodev_stats_reset(uint8_t dev_id); * the last valid element has it's op field set to * RTE_CRYPTO_OP_TYPE_UNDEFINED. */ -extern void +void +rte_cryptodev_info_get_v20(uint8_t dev_id, struct rte_cryptodev_info *dev_info); + +void +rte_cryptodev_info_get_v2005(uint8_t dev_id, struct rte_cryptodev_info *dev_info); +BIND_DEFAULT_SYMBOL(rte_cryptodev_info_get, _v2005, 20.05); + +void rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info); diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map index 6e41b4b..d6c945a 100644 --- a/lib/librte_cryptodev/rte_cryptodev_version.map +++ b/lib/librte_cryptodev/rte_cryptodev_version.map @@ -58,6 +58,13 @@ DPDK_20.0 { local: *; }; + +DPDK_20.05 { + global: + rte_cryptodev_info_get; +} DPDK_20.0; + + EXPERIMENTAL { global: