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 168D4A053A for ; Tue, 4 Aug 2020 07:19:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 077F137B4; Tue, 4 Aug 2020 07:19:45 +0200 (CEST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 158A9F04 for ; Tue, 4 Aug 2020 07:19:42 +0200 (CEST) IronPort-SDR: fJaF3nP6ENyBC6CJw407CjWsutrce3jeb7ko6wlkzMljHKnH+rKye1cgGSXiP81wyFlzAaia07 U2d84ogOGmsA== X-IronPort-AV: E=McAfee;i="6000,8403,9702"; a="153422041" X-IronPort-AV: E=Sophos;i="5.75,432,1589266800"; d="scan'208";a="153422041" 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; 03 Aug 2020 22:19:42 -0700 IronPort-SDR: 5ghFy/eTTnpA3t00qVo1lIbb0U5goreVx34iApVK2dXGi9+vTgkdvhxeGcCYFbhwZEo13/4+1W NkaCqWmQfZUA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,432,1589266800"; d="scan'208";a="306217359" Received: from kaminskx-mobl1.ger.corp.intel.com (HELO akusztax-MOBL.ger.corp.intel.com) ([10.104.125.117]) by orsmga002.jf.intel.com with ESMTP; 03 Aug 2020 22:19:40 -0700 From: Arek Kusztal To: fiona.trahe@intel.com Cc: Arek Kusztal , stable@dpdk.org Date: Tue, 4 Aug 2020 07:17:04 +0200 Message-Id: <20200804051705.13964-2-arkadiuszx.kusztal@intel.com> X-Mailer: git-send-email 2.19.1.windows.1 In-Reply-To: <20200804051705.13964-1-arkadiuszx.kusztal@intel.com> References: <20200804051705.13964-1-arkadiuszx.kusztal@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [19.11 v2 2/3] drivers/qat: add multi process handling of driver id X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" [ upstream commit 21792c4432056711bfac7f08500eb50100c9122c ] As cryptodev driver_id is allocated per-process, a corner case exists where binaries for primary and secondary processes could have different driver_ids if built differently. Add checking in qat PMD to catch and handle the case where driver_ids are inconsistent. Cc: stable@dpdk.org Signed-off-by: Arek Kusztal --- v2: - added checks for memzone in comp capability drivers/common/qat/qat_device.h | 6 ++++++ drivers/crypto/qat/qat_asym.c | 4 ++-- drivers/crypto/qat/qat_asym_pmd.c | 21 +++++++++++++++++---- drivers/crypto/qat/qat_asym_pmd.h | 2 +- drivers/crypto/qat/qat_sym.c | 2 +- drivers/crypto/qat/qat_sym.h | 2 +- drivers/crypto/qat/qat_sym_pmd.c | 27 +++++++++++++++++++++++---- drivers/crypto/qat/qat_sym_pmd.h | 2 +- 8 files changed, 52 insertions(+), 14 deletions(-) diff --git a/drivers/common/qat/qat_device.h b/drivers/common/qat/qat_device.h index 6531047..a23975f 100644 --- a/drivers/common/qat/qat_device.h +++ b/drivers/common/qat/qat_device.h @@ -82,10 +82,16 @@ struct qat_pci_device { struct qat_sym_dev_private *sym_dev; /**< link back to cryptodev private data */ + int qat_sym_driver_id; + /**< Symmetric driver id used by this device */ + /* Data relating to asymmetric crypto service */ struct qat_asym_dev_private *asym_dev; /**< link back to cryptodev private data */ + int qat_asym_driver_id; + /**< Symmetric driver id used by this device */ + /* Data relating to compression service */ struct qat_comp_dev_private *comp_dev; /**< link back to compressdev private data */ diff --git a/drivers/crypto/qat/qat_asym.c b/drivers/crypto/qat/qat_asym.c index ae0dd79..8597381 100644 --- a/drivers/crypto/qat/qat_asym.c +++ b/drivers/crypto/qat/qat_asym.c @@ -475,7 +475,7 @@ qat_asym_build_request(void *in_op, if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { ctx = (struct qat_asym_session *) get_asym_session_private_data( - op->asym->session, cryptodev_qat_asym_driver_id); + op->asym->session, qat_asym_driver_id); if (unlikely(ctx == NULL)) { QAT_LOG(ERR, "Session has not been created for this device"); goto error; @@ -693,7 +693,7 @@ qat_asym_process_response(void **op, uint8_t *resp, if (rx_op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { ctx = (struct qat_asym_session *)get_asym_session_private_data( - rx_op->asym->session, cryptodev_qat_asym_driver_id); + rx_op->asym->session, qat_asym_driver_id); qat_asym_collect_response(rx_op, cookie, ctx->xform); } else if (rx_op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) { qat_asym_collect_response(rx_op, cookie, rx_op->asym->xform); diff --git a/drivers/crypto/qat/qat_asym_pmd.c b/drivers/crypto/qat/qat_asym_pmd.c index e8443d9..9645104 100644 --- a/drivers/crypto/qat/qat_asym_pmd.c +++ b/drivers/crypto/qat/qat_asym_pmd.c @@ -11,7 +11,7 @@ #include "qat_sym_capabilities.h" #include "qat_asym_capabilities.h" -uint8_t cryptodev_qat_asym_driver_id; +uint8_t qat_asym_driver_id; static const struct rte_cryptodev_capabilities qat_gen1_asym_capabilities[] = { QAT_BASE_GEN1_ASYM_CAPABILITIES, @@ -63,7 +63,7 @@ static void qat_asym_dev_info_get(struct rte_cryptodev *dev, QAT_SERVICE_ASYMMETRIC); info->feature_flags = dev->feature_flags; info->capabilities = internals->qat_dev_capabilities; - info->driver_id = cryptodev_qat_asym_driver_id; + info->driver_id = qat_asym_driver_id; /* No limit of number of sessions */ info->sym.max_nb_sessions = 0; } @@ -250,6 +250,19 @@ qat_asym_dev_create(struct qat_pci_device *qat_pci_dev) struct rte_cryptodev *cryptodev; struct qat_asym_dev_private *internals; + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + qat_pci_dev->qat_asym_driver_id = + qat_asym_driver_id; + } else if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + if (qat_pci_dev->qat_asym_driver_id != + qat_asym_driver_id) { + QAT_LOG(ERR, + "Device %s have different driver id than corresponding device in primary process", + name); + return -(EFAULT); + } + } + snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", qat_pci_dev->name, "asym"); QAT_LOG(DEBUG, "Creating QAT ASYM device %s\n", name); @@ -267,7 +280,7 @@ qat_asym_dev_create(struct qat_pci_device *qat_pci_dev) return -ENODEV; qat_dev_instance->asym_rte_dev.name = cryptodev->data->name; - cryptodev->driver_id = cryptodev_qat_asym_driver_id; + cryptodev->driver_id = qat_asym_driver_id; cryptodev->dev_ops = &crypto_qat_ops; cryptodev->enqueue_burst = qat_asym_pmd_enqueue_op_burst; @@ -316,4 +329,4 @@ qat_asym_dev_destroy(struct qat_pci_device *qat_pci_dev) static struct cryptodev_driver qat_crypto_drv; RTE_PMD_REGISTER_CRYPTO_DRIVER(qat_crypto_drv, cryptodev_qat_asym_driver, - cryptodev_qat_asym_driver_id); + qat_asym_driver_id); diff --git a/drivers/crypto/qat/qat_asym_pmd.h b/drivers/crypto/qat/qat_asym_pmd.h index 895d0f6..024a02d 100644 --- a/drivers/crypto/qat/qat_asym_pmd.h +++ b/drivers/crypto/qat/qat_asym_pmd.h @@ -13,7 +13,7 @@ #define CRYPTODEV_NAME_QAT_ASYM_PMD crypto_qat_asym -extern uint8_t cryptodev_qat_asym_driver_id; +extern uint8_t qat_asym_driver_id; /** private data structure for a QAT device. * This QAT device is a device offering only asymmetric crypto service, diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c index 5c9904c..fda20ad 100644 --- a/drivers/crypto/qat/qat_sym.c +++ b/drivers/crypto/qat/qat_sym.c @@ -179,7 +179,7 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg, } ctx = (struct qat_sym_session *)get_sym_session_private_data( - op->sym->session, cryptodev_qat_driver_id); + op->sym->session, qat_sym_driver_id); if (unlikely(ctx == NULL)) { QAT_DP_LOG(ERR, "Session was not created for this device"); diff --git a/drivers/crypto/qat/qat_sym.h b/drivers/crypto/qat/qat_sym.h index bc6426c..758b06d 100644 --- a/drivers/crypto/qat/qat_sym.h +++ b/drivers/crypto/qat/qat_sym.h @@ -155,7 +155,7 @@ qat_sym_process_response(void **op, uint8_t *resp) struct qat_sym_session *sess = (struct qat_sym_session *) get_sym_session_private_data( rx_op->sym->session, - cryptodev_qat_driver_id); + qat_sym_driver_id); if (sess->bpi_ctx) diff --git a/drivers/crypto/qat/qat_sym_pmd.c b/drivers/crypto/qat/qat_sym_pmd.c index cb5b4fe..e5267f3 100644 --- a/drivers/crypto/qat/qat_sym_pmd.c +++ b/drivers/crypto/qat/qat_sym_pmd.c @@ -14,7 +14,7 @@ #include "qat_sym_session.h" #include "qat_sym_pmd.h" -uint8_t cryptodev_qat_driver_id; +uint8_t qat_sym_driver_id; static const struct rte_cryptodev_capabilities qat_gen1_sym_capabilities[] = { QAT_BASE_GEN1_SYM_CAPABILITIES, @@ -72,7 +72,7 @@ static void qat_sym_dev_info_get(struct rte_cryptodev *dev, qat_qps_per_service(sym_hw_qps, QAT_SERVICE_SYMMETRIC); info->feature_flags = dev->feature_flags; info->capabilities = internals->qat_dev_capabilities; - info->driver_id = cryptodev_qat_driver_id; + info->driver_id = qat_sym_driver_id; /* No limit of number of sessions */ info->sym.max_nb_sessions = 0; } @@ -252,6 +252,25 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev) struct rte_cryptodev *cryptodev; struct qat_sym_dev_private *internals; + /* + * All processes must use same driver id so they can share sessions. + * Store driver_id so we can validate that all processes have the same + * value, typically they have, but could differ if binaries built + * separately. + */ + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + qat_pci_dev->qat_sym_driver_id = + qat_sym_driver_id; + } else if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + if (qat_pci_dev->qat_sym_driver_id != + qat_sym_driver_id) { + QAT_LOG(ERR, + "Device %s have different driver id than corresponding device in primary process", + name); + return -(EFAULT); + } + } + snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", qat_pci_dev->name, "sym"); QAT_LOG(DEBUG, "Creating QAT SYM device %s", name); @@ -269,7 +288,7 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev) return -ENODEV; qat_dev_instance->sym_rte_dev.name = cryptodev->data->name; - cryptodev->driver_id = cryptodev_qat_driver_id; + cryptodev->driver_id = qat_sym_driver_id; cryptodev->dev_ops = &crypto_qat_ops; cryptodev->enqueue_burst = qat_sym_pmd_enqueue_op_burst; @@ -334,4 +353,4 @@ qat_sym_dev_destroy(struct qat_pci_device *qat_pci_dev) static struct cryptodev_driver qat_crypto_drv; RTE_PMD_REGISTER_CRYPTO_DRIVER(qat_crypto_drv, cryptodev_qat_sym_driver, - cryptodev_qat_driver_id); + qat_sym_driver_id); diff --git a/drivers/crypto/qat/qat_sym_pmd.h b/drivers/crypto/qat/qat_sym_pmd.h index 7ddaf45..0c05453 100644 --- a/drivers/crypto/qat/qat_sym_pmd.h +++ b/drivers/crypto/qat/qat_sym_pmd.h @@ -15,7 +15,7 @@ /** Intel(R) QAT Symmetric Crypto PMD driver name */ #define CRYPTODEV_NAME_QAT_SYM_PMD crypto_qat -extern uint8_t cryptodev_qat_driver_id; +extern uint8_t qat_sym_driver_id; /** private data structure for a QAT device. * This QAT device is a device offering only symmetric crypto service, -- 2.1.0