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 4B4C4A00C5; Thu, 11 Jun 2020 15:56:17 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 87F0E100C; Thu, 11 Jun 2020 15:56:16 +0200 (CEST) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id 7CA41F04 for ; Thu, 11 Jun 2020 15:56:14 +0200 (CEST) IronPort-SDR: JlsjfMPWKv8jdMR3qlWOLcL/1eb7tpF7HVNmfqVNG10BnEH+wHxVcx9jlSfUxD++ReXP4ksrHD axuS9yGSOopA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jun 2020 06:56:13 -0700 IronPort-SDR: m4uGSWnn7Y6Ax3srrgYVDCMehIQWy9mKCL8u9lh591hs2MOSMcBKPfa1TNlhVpNXEdscc+2URh cBonhuCiNGFw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,499,1583222400"; d="scan'208";a="314819839" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by FMSMGA003.fm.intel.com with ESMTP; 11 Jun 2020 06:56:13 -0700 Received: from fmsmsx111.amr.corp.intel.com (10.18.116.5) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 11 Jun 2020 06:56:13 -0700 Received: from FMSEDG001.ED.cps.intel.com (10.1.192.133) by fmsmsx111.amr.corp.intel.com (10.18.116.5) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 11 Jun 2020 06:56:12 -0700 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.170) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 11 Jun 2020 06:56:11 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JJZ9KkNzzYeEYOGa8SABXJ756/SxrHFopCnrfHTU4VgR3xcQGBhKLnhNtSpGRN17TZY/alMyfP8jxzHqgfRkZdjfQMdPGZ2JG2eBx96QItXkeB2/U1YahvkmidOThH5zNQqcoa012ahcIPvhMKQiBC2A6AM1cv7ogRZLTU7tG4GyYKlJVz2g0uwArl1wf89v0bMsp6i6SJ4dDeHuwkhSlyVBcFI71V9BYYJQaZgVvE3g1Bw6cD5WHyaU1YxhpsTuu+8PtFfBzj8skyT1Pc3cFvEmOIX5BDrruoAEEqNmf0+3uYRlTGLkAUrlz3Z6uYnK+O7id3ZaJoVrBPi5DuvMQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=13BQ3SBOf1gGVB5voKNAEnJhwZmErG5YX0QQDrJrVKk=; b=i2WcjjwBwEf7T/Md/CLh3rxcYmho0wpmupaRy243G27iprARCVlvQCJr5wnS5VK3iP071sU4pdhojjiENbiXctHz50wayW/WhixFi0RJ0oTXFJn46zHLHUaay2FaZOaHd6zxBi521aq+RPLfKGX6MWPfgPcyFfGq6vxO1vFjtxGwNE2yJgNh7pNAwzl0CeEcpR5awtsmNsteSFEI1fTZBnRtvYxlcngR3R2kFC1kj1tmbfPyV3Nlty/RM6xTXyC3QdPGOdVIAkIhmWx10blHPgmOfCbUViYHw86jf60KUynBiRr1IcncxkNeXG87999hYuxFN+kCA9gSZpxGbtAcew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=13BQ3SBOf1gGVB5voKNAEnJhwZmErG5YX0QQDrJrVKk=; b=dDyZLAGQLg7kwi4nA/mMDSL/EBMzeJI6NkY4WnUg2fKPZc8OMhYxzU2w28uG7odTLf13XrrG4g2XK3Bxgtf0YrtuIQ7BqX2Y0f9Z8Udll5bcrnUu7hFfRZqHfjPxH6aaiRsylGn1qeU/YSCKIBddnlfRRb2LduxrdBY7KASkBT0= Received: from SN6PR11MB2880.namprd11.prod.outlook.com (2603:10b6:805:58::15) by SN6PR11MB2783.namprd11.prod.outlook.com (2603:10b6:805:5a::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.18; Thu, 11 Jun 2020 13:56:08 +0000 Received: from SN6PR11MB2880.namprd11.prod.outlook.com ([fe80::c4ff:6258:78f7:ff90]) by SN6PR11MB2880.namprd11.prod.outlook.com ([fe80::c4ff:6258:78f7:ff90%5]) with mapi id 15.20.3088.022; Thu, 11 Jun 2020 13:56:08 +0000 From: "Trahe, Fiona" To: "Kusztal, ArkadiuszX" , "dev@dpdk.org" CC: "akhil.goyal@nxp.com" , "Trahe, Fiona" Thread-Topic: [PATCH] crypto/qat: add handling of multi process Thread-Index: AQHWP1pLHL6JpkiJJkuoSN2PJ2YlBKjTcBWQ Date: Thu, 11 Jun 2020 13:56:07 +0000 Message-ID: References: <20200610190625.18780-1-arkadiuszx.kusztal@intel.com> In-Reply-To: <20200610190625.18780-1-arkadiuszx.kusztal@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.2.0.6 authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.151.168] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: efeb38d1-540d-4fb3-0910-08d80e0f30f9 x-ms-traffictypediagnostic: SN6PR11MB2783: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1824; x-forefront-prvs: 0431F981D8 x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: rhyzRru1Izkj6+BBgVgUemrI5/2J5LL436gWx20qfYaO6FY/2lSWhIyoqbs/i6UJOkq6ngH5EUTIhzrGlgCsT8fZWfimXw8kromgesdo/vdof5vpseTaFOTMRswWOGlsaiUbBnJR/AFejYoNgCCh2mgzLd4kR7PeVw3CuyjzLxzyWGEkR2A9dlxgL2xs1wHXtW3DITAy2RSrXmZXqROQheJiFe6fDM52xDD5q/c7KZeSeb39JdGKtE5OSWBHfajVzET661gRjPYRNPW6W0+9qb6KIqMxQaipBexiMsIzu9jJbRgP1FZ6PC8OSge5DwmTOiKuvX9LBSI4IWnnt5L+VC6T0fDIrF/CS2iDnyY5o+UtnaJRPNfeIFOkm7k9dSNs x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN6PR11MB2880.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(39860400002)(136003)(396003)(376002)(346002)(366004)(55016002)(8936002)(7696005)(478600001)(86362001)(71200400001)(110136005)(107886003)(54906003)(4326008)(316002)(9686003)(8676002)(5660300002)(66556008)(53546011)(66476007)(76116006)(66446008)(26005)(64756008)(66946007)(30864003)(2906002)(52536014)(33656002)(6506007)(83380400001)(186003)(21314003)(579004)(559001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: UuDGGlNBXWjhpA1zW2IkURoDKwv2cOKQJvc0kXniXNR3O+jrQnz4YWlSyWxrwNeit2ksiPj2WZ7TzAJRDLOgTenLpKCsePoW2bgd54Q2r+v1wntJU5n1+JUWMYEv9t821bZEe9TFIJlNAYLBpDUOEONw9q7LOW9UbppwPI6fXSoQ4icCNAlZN9zzh0HtS5YESR1W2pXiLv+hcPrpcnBk8G/STj6XpNQgseX7FRyo/m8el08WLj/F9XMiVeTTl1d8XdFePox77HfJSMGBU6LxrO45Iyku1lsfR0KDkSNWr/lxD88swljXSM9JW5CUbvf/uALAVBRA5792VIG1pZCItnXbeblIBxhdqNMvNstujks5krqlNG70nOk/IKq49WetFYKYVhpEWripmW+6kV6k3PLkyVzw8KBBo8CdHynXut604gE+lYBJXeYbjnR55+9cr8v0u00BrWQdP2HyPFF4Ny/ouGkOSZt19n7o4br0pQ+WR5OELCrp/J1kwCB2/6tS Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: efeb38d1-540d-4fb3-0910-08d80e0f30f9 X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Jun 2020 13:56:07.9781 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: mBWuLbSXQlTMc6Bt275pftBs4m2RmqNDcnpsrkZSNPtUI0IV0i/pUuvTAB/OALRdyxy2jfUsRuToy1AB3B3dnA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR11MB2783 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH] crypto/qat: add handling of multi process 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" Hi Arek, > -----Original Message----- > From: Kusztal, ArkadiuszX > Sent: Wednesday, June 10, 2020 8:06 PM > To: dev@dpdk.org > Cc: akhil.goyal@nxp.com; Trahe, Fiona ; Kusztal, A= rkadiuszX > > Subject: [PATCH] crypto/qat: add handling of multi process >=20 > This patch improves handling of multi process applications > using Intel QuickAssist Technology PMD. >=20 > Signed-off-by: Arek Kusztal > --- > drivers/common/qat/qat_device.c | 103 ++++++++++++++++++++++++------= ------ > drivers/common/qat/qat_device.h | 69 +++++++++++++----------- > drivers/common/qat/qat_qp.c | 10 ++-- > drivers/compress/qat/qat_comp_pmd.c | 43 +++++++++++---- > drivers/compress/qat/qat_comp_pmd.h | 2 + > drivers/crypto/qat/qat_asym.c | 4 +- > drivers/crypto/qat/qat_asym_pmd.c | 62 +++++++++++++++++----- > drivers/crypto/qat/qat_asym_pmd.h | 4 +- > drivers/crypto/qat/qat_sym.c | 2 +- > drivers/crypto/qat/qat_sym.h | 2 +- > drivers/crypto/qat/qat_sym_pmd.c | 87 +++++++++++++++++++++++------- > drivers/crypto/qat/qat_sym_pmd.h | 4 +- > 12 files changed, 277 insertions(+), 115 deletions(-) >=20 > diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_dev= ice.c > index 2b41d9a..fc25b02 100644 > --- a/drivers/common/qat/qat_device.c > +++ b/drivers/common/qat/qat_device.c > @@ -32,8 +32,8 @@ struct qat_gen_hw_data qat_gen_config[] =3D { > }, > }; >=20 > - > -static struct qat_pci_device qat_pci_devices[RTE_PMD_QAT_MAX_PCI_DEVICES= ]; > +/* per-process array of device data */ > +struct qat_device_info qat_pci_devs[RTE_PMD_QAT_MAX_PCI_DEVICES]; > static int qat_nb_pci_devices; >=20 > /* > @@ -60,26 +60,20 @@ static const struct rte_pci_id pci_id_qat_map[] =3D { > }; >=20 > static struct qat_pci_device * > -qat_pci_get_dev(uint8_t dev_id) > -{ > - return &qat_pci_devices[dev_id]; > -} > - > -static struct qat_pci_device * > qat_pci_get_named_dev(const char *name) > { > - struct qat_pci_device *dev; > unsigned int i; >=20 > if (name =3D=3D NULL) > return NULL; >=20 > for (i =3D 0; i < RTE_PMD_QAT_MAX_PCI_DEVICES; i++) { > - dev =3D &qat_pci_devices[i]; > - > - if ((dev->attached =3D=3D QAT_ATTACHED) && > - (strcmp(dev->name, name) =3D=3D 0)) > - return dev; > + if (qat_pci_devs[i].mz && > + (strcmp(((struct qat_pci_device *) > + qat_pci_devs[i].mz->addr)->name, name) > + =3D=3D 0)) > + return (struct qat_pci_device *) > + qat_pci_devs[i].mz->addr; > } >=20 > return NULL; > @@ -88,13 +82,13 @@ qat_pci_get_named_dev(const char *name) > static uint8_t > qat_pci_find_free_device_index(void) > { > - uint8_t dev_id; > + uint8_t dev_id; >=20 > - for (dev_id =3D 0; dev_id < RTE_PMD_QAT_MAX_PCI_DEVICES; dev_id++) { > - if (qat_pci_devices[dev_id].attached =3D=3D QAT_DETACHED) > - break; > - } > - return dev_id; > + for (dev_id =3D 0; dev_id < RTE_PMD_QAT_MAX_PCI_DEVICES; dev_id++) { > + if (qat_pci_devs[dev_id].mz =3D=3D NULL) > + break; > + } > + return dev_id; > } >=20 > struct qat_pci_device * > @@ -169,12 +163,29 @@ qat_pci_device_allocate(struct rte_pci_device *pci_= dev, > struct qat_dev_cmd_param *qat_dev_cmd_param) > { > struct qat_pci_device *qat_dev; > - uint8_t qat_dev_id; > + uint8_t qat_dev_id =3D 0; > char name[QAT_DEV_NAME_MAX_LEN]; > struct rte_devargs *devargs =3D pci_dev->device.devargs; >=20 > rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); > snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat"); > + > + if (rte_eal_process_type() =3D=3D RTE_PROC_SECONDARY) { > + const struct rte_memzone *mz =3D rte_memzone_lookup(name); > + > + if (mz =3D=3D NULL) { > + QAT_LOG(ERR, "Error when searching allocated %s", name); > + return NULL; > + } > + qat_dev =3D mz->addr; > + qat_pci_devs[qat_dev->qat_dev_id].mz =3D mz; > + qat_pci_devs[qat_dev->qat_dev_id].pci_dev =3D pci_dev; > + qat_nb_pci_devices++; > + QAT_LOG(DEBUG, "QAT device %d found, name %s, total QATs %d", > + qat_dev->qat_dev_id, qat_dev->name, qat_nb_pci_devices); > + return qat_dev; > + } > + > if (qat_pci_get_named_dev(name) !=3D NULL) { > QAT_LOG(ERR, "QAT device with name %s already allocated!", > name); > @@ -187,12 +198,22 @@ qat_pci_device_allocate(struct rte_pci_device *pci_= dev, > return NULL; > } >=20 > - qat_dev =3D qat_pci_get_dev(qat_dev_id); > + qat_pci_devs[qat_dev_id].mz =3D rte_memzone_reserve(name, > + sizeof(struct qat_pci_device), > + rte_socket_id(), 0); > + > + if (qat_pci_devs[qat_dev_id].mz =3D=3D NULL) { > + QAT_LOG(ERR, "Error when allocating memzone for QAT_%d", > + qat_dev_id); > + return NULL; > + } > + > + qat_dev =3D qat_pci_devs[qat_dev_id].mz->addr; > memset(qat_dev, 0, sizeof(*qat_dev)); > strlcpy(qat_dev->name, name, QAT_DEV_NAME_MAX_LEN); > qat_dev->qat_dev_id =3D qat_dev_id; > - qat_dev->pci_dev =3D pci_dev; > - switch (qat_dev->pci_dev->id.device_id) { > + qat_pci_devs[qat_dev_id].pci_dev =3D pci_dev; > + switch (pci_dev->id.device_id) { > case 0x0443: > qat_dev->qat_dev_gen =3D QAT_GEN1; > break; > @@ -206,6 +227,7 @@ qat_pci_device_allocate(struct rte_pci_device *pci_de= v, > break; > default: > QAT_LOG(ERR, "Invalid dev_id, can't determine generation"); > + rte_memzone_free(qat_pci_devs[qat_dev->qat_dev_id].mz); > return NULL; > } >=20 > @@ -213,22 +235,20 @@ qat_pci_device_allocate(struct rte_pci_device *pci_= dev, > qat_dev_parse_cmd(devargs->drv_str, qat_dev_cmd_param); >=20 > rte_spinlock_init(&qat_dev->arb_csr_lock); > - > - qat_dev->attached =3D QAT_ATTACHED; > - > qat_nb_pci_devices++; >=20 > - QAT_LOG(DEBUG, "QAT device %d allocated, name %s, total QATs %d", > + QAT_LOG(DEBUG, "QAT device %d found, name %s, total QATs %d", > qat_dev->qat_dev_id, qat_dev->name, qat_nb_pci_devices); >=20 > return qat_dev; > } >=20 > -int > +static int > qat_pci_device_release(struct rte_pci_device *pci_dev) > { > struct qat_pci_device *qat_dev; > char name[QAT_DEV_NAME_MAX_LEN]; > + int busy =3D 0; >=20 > if (pci_dev =3D=3D NULL) > return -EINVAL; > @@ -238,15 +258,32 @@ qat_pci_device_release(struct rte_pci_device *pci_d= ev) > qat_dev =3D qat_pci_get_named_dev(name); > if (qat_dev !=3D NULL) { >=20 > + struct qat_device_info *inst =3D > + &qat_pci_devs[qat_dev->qat_dev_id]; > /* Check that there are no service devs still on pci device */ > - if (qat_dev->sym_dev !=3D NULL) > + if (qat_dev->sym_dev !=3D NULL) { > + QAT_LOG(DEBUG, "QAT sym device %s is busy", name); > + busy =3D 1; > + } > + if (qat_dev->asym_dev !=3D NULL) { > + QAT_LOG(DEBUG, "QAT asym device %s is busy", name); > + busy =3D 1; > + } > + if (qat_dev->comp_dev !=3D NULL) { > + QAT_LOG(DEBUG, "QAT comp device %s is busy", name); > + busy =3D 1; > + } > + if (busy) > return -EBUSY; [Fiona] Should the busy check be done on the secondary? I think it'll alwa= ys be busy if primary is still there? The secondary should only clean up all the related secondary structures, bu= t not cleanup the shared structures. See also related comment on destroy below >=20 > - qat_dev->attached =3D QAT_DETACHED; > + memset(inst, 0, sizeof(struct qat_device_info)); > + > + if (rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) > + rte_memzone_free(inst->mz); > qat_nb_pci_devices--; > + QAT_LOG(DEBUG, "QAT device %s released, total QATs %d", > + name, qat_nb_pci_devices); > } > - QAT_LOG(DEBUG, "QAT device %s released, total QATs %d", > - name, qat_nb_pci_devices); > return 0; > } >=20 > diff --git a/drivers/common/qat/qat_device.h b/drivers/common/qat/qat_dev= ice.h > index 09a4c55..70ec587 100644 > --- a/drivers/common/qat/qat_device.h > +++ b/drivers/common/qat/qat_device.h > @@ -32,6 +32,37 @@ enum qat_comp_num_im_buffers { > QAT_NUM_INTERM_BUFS_GEN3 =3D 20 > }; >=20 > +struct qat_device_info { > + /**< mz to store the qat_pci_device so it can be > + * shared across processes > + */ > + const struct rte_memzone *mz; > + struct rte_pci_device *pci_dev; > + struct rte_device sym_rte_dev; > + /**< This represents the crypto sym subset of this pci device. > + * Register with this rather than with the one in > + * pci_dev so that its driver can have a crypto-specific name > + */ > + > + struct rte_device asym_rte_dev; > + /**< This represents the crypto asym subset of this pci device. > + * Register with this rather than with the one in > + * pci_dev so that its driver can have a crypto-specific name > + */ > + > + struct rte_device comp_rte_dev; > + /**< This represents the compression subset of this pci device. > + * Register with this rather than with the one in > + * pci_dev so that its driver can have a compression-specific name > + */ > +}; > + > +extern struct qat_device_info qat_pci_devs[]; > + > +struct qat_sym_dev_private; > +struct qat_asym_dev_private; > +struct qat_comp_dev_private; > + > /* > * This struct holds all the data about a QAT pci device > * including data about all services it supports. > @@ -39,27 +70,20 @@ enum qat_comp_num_im_buffers { > * - hw_data > * - config data > * - runtime data > + * Note: as this data can be shared in a multi-process scenario, > + * any pointers in it must also point to shared memory. > */ > -struct qat_sym_dev_private; > -struct qat_asym_dev_private; > -struct qat_comp_dev_private; > - > struct qat_pci_device { >=20 > /* Data used by all services */ > char name[QAT_DEV_NAME_MAX_LEN]; > /**< Name of qat pci device */ > uint8_t qat_dev_id; > - /**< Device instance for this qat pci device */ > - struct rte_pci_device *pci_dev; > - /**< PCI information. */ > + /**< Id of device instance for this qat pci device */ > enum qat_device_gen qat_dev_gen; > /**< QAT device generation */ > rte_spinlock_t arb_csr_lock; > /**< lock to protect accesses to the arbiter CSR */ > - __extension__ > - uint8_t attached : 1; > - /**< Flag indicating the device is attached */ >=20 > struct qat_qp *qps_in_use[QAT_MAX_SERVICES][ADF_MAX_QPS_ON_ANY_SERVICE]= ; > /**< links to qps set up for each service, index same as on API */ > @@ -67,32 +91,18 @@ struct qat_pci_device { > /* Data relating to symmetric crypto service */ > struct qat_sym_dev_private *sym_dev; > /**< link back to cryptodev private data */ > - struct rte_device sym_rte_dev; > - /**< This represents the crypto sym subset of this pci device. > - * Register with this rather than with the one in > - * pci_dev so that its driver can have a crypto-specific name > - */ > + int qat_sym_driver_id; > + /**< Symmetric driver id used by this device */ >=20 > /* Data relating to asymmetric crypto service */ > struct qat_asym_dev_private *asym_dev; > /**< link back to cryptodev private data */ > - struct rte_device asym_rte_dev; > - /**< This represents the crypto asym subset of this pci device. > - * Register with this rather than with the one in > - * pci_dev so that its driver can have a crypto-specific name > - */ > + int qat_asym_driver_id; > + /**< Symmetric driver id used by this device */ >=20 > /* Data relating to compression service */ > struct qat_comp_dev_private *comp_dev; > /**< link back to compressdev private data */ > - struct rte_device comp_rte_dev; > - /**< This represents the compression subset of this pci device. > - * Register with this rather than with the one in > - * pci_dev so that its driver can have a compression-specific name > - */ > - > - /* Data relating to asymmetric crypto service */ > - > }; >=20 > struct qat_gen_hw_data { > @@ -107,9 +117,6 @@ struct qat_pci_device * > qat_pci_device_allocate(struct rte_pci_device *pci_dev, > struct qat_dev_cmd_param *qat_dev_cmd_param); >=20 > -int > -qat_pci_device_release(struct rte_pci_device *pci_dev); > - > struct qat_pci_device * > qat_get_qat_dev_from_pci_dev(struct rte_pci_device *pci_dev); >=20 > diff --git a/drivers/common/qat/qat_qp.c b/drivers/common/qat/qat_qp.c > index 8e6dd04..66eb778 100644 > --- a/drivers/common/qat/qat_qp.c > +++ b/drivers/common/qat/qat_qp.c > @@ -193,7 +193,8 @@ int qat_qp_setup(struct qat_pci_device *qat_dev, >=20 > { > struct qat_qp *qp; > - struct rte_pci_device *pci_dev =3D qat_dev->pci_dev; > + struct rte_pci_device *pci_dev =3D > + qat_pci_devs[qat_dev->qat_dev_id].pci_dev; > char op_cookie_pool_name[RTE_RING_NAMESIZE]; > uint32_t i; >=20 > @@ -274,7 +275,7 @@ int qat_qp_setup(struct qat_pci_device *qat_dev, > qp->nb_descriptors, > qat_qp_conf->cookie_size, 64, 0, > NULL, NULL, NULL, NULL, > - qat_dev->pci_dev->device.numa_node, > + pci_dev->device.numa_node, > 0); > if (!qp->op_cookie_pool) { > QAT_LOG(ERR, "QAT PMD Cannot create" > @@ -379,7 +380,8 @@ qat_queue_create(struct qat_pci_device *qat_dev, stru= ct qat_queue *queue, > uint64_t queue_base; > void *io_addr; > const struct rte_memzone *qp_mz; > - struct rte_pci_device *pci_dev =3D qat_dev->pci_dev; > + struct rte_pci_device *pci_dev =3D > + qat_pci_devs[qat_dev->qat_dev_id].pci_dev; > int ret =3D 0; > uint16_t desc_size =3D (dir =3D=3D ADF_RING_DIR_TX ? > qp_conf->hw->tx_msg_size : qp_conf->hw->rx_msg_size); > @@ -403,7 +405,7 @@ qat_queue_create(struct qat_pci_device *qat_dev, stru= ct qat_queue *queue, > qp_conf->service_str, "qp_mem", > queue->hw_bundle_number, queue->hw_queue_number); > qp_mz =3D queue_dma_zone_reserve(queue->memz_name, queue_size_bytes, > - qat_dev->pci_dev->device.numa_node); > + pci_dev->device.numa_node); > if (qp_mz =3D=3D NULL) { > QAT_LOG(ERR, "Failed to allocate ring memzone"); > return -ENOMEM; > diff --git a/drivers/compress/qat/qat_comp_pmd.c b/drivers/compress/qat/q= at_comp_pmd.c > index fe62de5..c08c9a3 100644 > --- a/drivers/compress/qat/qat_comp_pmd.c > +++ b/drivers/compress/qat/qat_comp_pmd.c > @@ -655,6 +655,8 @@ qat_comp_dev_create(struct qat_pci_device *qat_pci_de= v, > struct qat_dev_cmd_param *qat_dev_cmd_param) > { > int i =3D 0; > + struct qat_device_info *qat_dev_instance =3D > + &qat_pci_devs[qat_pci_dev->qat_dev_id]; > if (qat_pci_dev->qat_dev_gen =3D=3D QAT_GEN3) { > QAT_LOG(ERR, "Compression PMD not supported on QAT P5xxx"); > return 0; > @@ -662,24 +664,27 @@ qat_comp_dev_create(struct qat_pci_device *qat_pci_= dev, >=20 > struct rte_compressdev_pmd_init_params init_params =3D { > .name =3D "", > - .socket_id =3D qat_pci_dev->pci_dev->device.numa_node, > + .socket_id =3D qat_dev_instance->pci_dev->device.numa_node, > }; > char name[RTE_COMPRESSDEV_NAME_MAX_LEN]; > + char memz_name[RTE_COMPRESSDEV_NAME_MAX_LEN]; > struct rte_compressdev *compressdev; > struct qat_comp_dev_private *comp_dev; > + const struct rte_compressdev_capabilities *capabilities; > + uint64_t capa_size; >=20 > snprintf(name, RTE_COMPRESSDEV_NAME_MAX_LEN, "%s_%s", > qat_pci_dev->name, "comp"); > QAT_LOG(DEBUG, "Creating QAT COMP device %s", name); >=20 > /* Populate subset device to use in compressdev device creation */ > - qat_pci_dev->comp_rte_dev.driver =3D &compdev_qat_driver; > - qat_pci_dev->comp_rte_dev.numa_node =3D > - qat_pci_dev->pci_dev->device.numa_node; > - qat_pci_dev->comp_rte_dev.devargs =3D NULL; > + qat_dev_instance->comp_rte_dev.driver =3D &compdev_qat_driver; > + qat_dev_instance->comp_rte_dev.numa_node =3D > + qat_dev_instance->pci_dev->device.numa_node; > + qat_dev_instance->comp_rte_dev.devargs =3D NULL; >=20 > compressdev =3D rte_compressdev_pmd_create(name, > - &(qat_pci_dev->comp_rte_dev), > + &(qat_dev_instance->comp_rte_dev), > sizeof(struct qat_comp_dev_private), > &init_params); >=20 > @@ -694,25 +699,44 @@ qat_comp_dev_create(struct qat_pci_device *qat_pci_= dev, >=20 > compressdev->feature_flags =3D RTE_COMPDEV_FF_HW_ACCELERATED; >=20 > + if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > + return 0; > + > + snprintf(memz_name, RTE_COMPRESSDEV_NAME_MAX_LEN, "%s_%s_MEMZONE", > + qat_pci_dev->name, "comp"); > comp_dev =3D compressdev->data->dev_private; > comp_dev->qat_dev =3D qat_pci_dev; > comp_dev->compressdev =3D compressdev; > - qat_pci_dev->comp_dev =3D comp_dev; >=20 > switch (qat_pci_dev->qat_dev_gen) { > case QAT_GEN1: > case QAT_GEN2: > case QAT_GEN3: > - comp_dev->qat_dev_capabilities =3D qat_comp_gen_capabilities; > + capabilities =3D qat_comp_gen_capabilities; > + capa_size =3D sizeof(qat_comp_gen_capabilities); > break; > default: > - comp_dev->qat_dev_capabilities =3D qat_comp_gen_capabilities; > + capabilities =3D qat_comp_gen_capabilities; > + capa_size =3D sizeof(qat_comp_gen_capabilities); > QAT_LOG(DEBUG, > "QAT gen %d capabilities unknown, default to GEN1", > qat_pci_dev->qat_dev_gen); > break; > } >=20 > + comp_dev->mz =3D rte_memzone_reserve(memz_name, > + capa_size, > + rte_socket_id(), 0); > + if (comp_dev->mz =3D=3D NULL) { > + QAT_LOG(DEBUG, "Error allocating memzone, destroying PMD" > + " for %s", name); > + rte_compressdev_pmd_destroy(compressdev); > + return -EFAULT; > + } > + > + memcpy(comp_dev->mz->addr, capabilities, capa_size); > + comp_dev->qat_dev_capabilities =3D comp_dev->mz->addr; > + > while (1) { > if (qat_dev_cmd_param[i].name =3D=3D NULL) > break; > @@ -721,6 +745,7 @@ qat_comp_dev_create(struct qat_pci_device *qat_pci_de= v, > qat_dev_cmd_param[i].val; > i++; > } > + qat_pci_dev->comp_dev =3D comp_dev; >=20 > QAT_LOG(DEBUG, > "Created QAT COMP device %s as compressdev instance %d", > diff --git a/drivers/compress/qat/qat_comp_pmd.h b/drivers/compress/qat/q= at_comp_pmd.h > index 5c7fa9f..24ad572 100644 > --- a/drivers/compress/qat/qat_comp_pmd.h > +++ b/drivers/compress/qat/qat_comp_pmd.h > @@ -32,6 +32,8 @@ struct qat_comp_dev_private { > /**< The device's pool for qat_comp_xforms */ > struct rte_mempool *streampool; > /**< The device's pool for qat_comp_streams */ > + const struct rte_memzone *mz; > + /* Shared memzone for storing capabilities */ > uint16_t min_enq_burst_threshold; > }; >=20 > 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 =3D=3D RTE_CRYPTO_OP_WITH_SESSION) { > ctx =3D (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 =3D=3D 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, >=20 > if (rx_op->sess_type =3D=3D RTE_CRYPTO_OP_WITH_SESSION) { > ctx =3D (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 =3D=3D 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_a= sym_pmd.c > index af3cc25..b747a5a 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" >=20 > -uint8_t cryptodev_qat_asym_driver_id; > +uint8_t qat_asym_driver_id; >=20 > static const struct rte_cryptodev_capabilities qat_gen1_asym_capabilitie= s[] =3D { > 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 =3D dev->feature_flags; > info->capabilities =3D internals->qat_dev_capabilities; > - info->driver_id =3D cryptodev_qat_asym_driver_id; > + info->driver_id =3D qat_asym_driver_id; > /* No limit of number of sessions */ > info->sym.max_nb_sessions =3D 0; > } > @@ -239,33 +239,49 @@ qat_asym_dev_create(struct qat_pci_device *qat_pci_= dev, > struct qat_dev_cmd_param *qat_dev_cmd_param) > { > int i =3D 0; > + struct qat_device_info *qat_dev_instance =3D > + &qat_pci_devs[qat_pci_dev->qat_dev_id]; > struct rte_cryptodev_pmd_init_params init_params =3D { > .name =3D "", > - .socket_id =3D qat_pci_dev->pci_dev->device.numa_node, > + .socket_id =3D qat_dev_instance->pci_dev->device.numa_node, > .private_data_size =3D sizeof(struct qat_asym_dev_private) > }; > char name[RTE_CRYPTODEV_NAME_MAX_LEN]; > + char memz_name[RTE_CRYPTODEV_NAME_MAX_LEN]; > struct rte_cryptodev *cryptodev; > struct qat_asym_dev_private *internals; >=20 > + if (rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > + qat_pci_dev->qat_asym_driver_id =3D > + qat_asym_driver_id; > + } else if (rte_eal_process_type() =3D=3D RTE_PROC_SECONDARY) { > + if (qat_pci_dev->qat_asym_driver_id !=3D > + 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); >=20 > /* Populate subset device to use in cryptodev device creation */ > - qat_pci_dev->asym_rte_dev.driver =3D &cryptodev_qat_asym_driver; > - qat_pci_dev->asym_rte_dev.numa_node =3D > - qat_pci_dev->pci_dev->device.numa_node; > - qat_pci_dev->asym_rte_dev.devargs =3D NULL; > + qat_dev_instance->asym_rte_dev.driver =3D &cryptodev_qat_asym_driver; > + qat_dev_instance->asym_rte_dev.numa_node =3D > + qat_dev_instance->pci_dev->device.numa_node; > + qat_dev_instance->asym_rte_dev.devargs =3D NULL; >=20 > cryptodev =3D rte_cryptodev_pmd_create(name, > - &(qat_pci_dev->asym_rte_dev), &init_params); > + &(qat_dev_instance->asym_rte_dev), &init_params); >=20 > if (cryptodev =3D=3D NULL) > return -ENODEV; >=20 > - qat_pci_dev->asym_rte_dev.name =3D cryptodev->data->name; > - cryptodev->driver_id =3D cryptodev_qat_asym_driver_id; > + qat_dev_instance->asym_rte_dev.name =3D cryptodev->data->name; > + cryptodev->driver_id =3D qat_asym_driver_id; > cryptodev->dev_ops =3D &crypto_qat_ops; >=20 > cryptodev->enqueue_burst =3D qat_asym_pmd_enqueue_op_burst; > @@ -276,12 +292,30 @@ qat_asym_dev_create(struct qat_pci_device *qat_pci_= dev, > RTE_CRYPTODEV_FF_ASYM_SESSIONLESS | > RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP | > RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT; > + > + if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > + return 0; > + > + snprintf(memz_name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s_MEMZONE", > + qat_pci_dev->name, "asym"); > internals =3D cryptodev->data->dev_private; > internals->qat_dev =3D qat_pci_dev; > - qat_pci_dev->asym_dev =3D internals; >=20 > internals->asym_dev_id =3D cryptodev->data->dev_id; > internals->qat_dev_capabilities =3D qat_gen1_asym_capabilities; > + internals->mz =3D rte_memzone_reserve(memz_name, > + sizeof(qat_gen1_asym_capabilities), > + rte_socket_id(), 0); > + if (internals->mz =3D=3D NULL) { > + QAT_LOG(DEBUG, "Error allocating memzone, destroying PMD" > + " for %s", name); > + rte_cryptodev_pmd_destroy(cryptodev); > + return -EFAULT; > + } > + > + memcpy(internals->mz->addr, qat_gen1_asym_capabilities, > + sizeof(qat_gen1_asym_capabilities)); > + internals->qat_dev_capabilities =3D internals->mz->addr; >=20 > while (1) { > if (qat_dev_cmd_param[i].name =3D=3D NULL) > @@ -292,6 +326,7 @@ qat_asym_dev_create(struct qat_pci_device *qat_pci_de= v, > i++; > } >=20 > + qat_pci_dev->asym_dev =3D internals; > QAT_LOG(DEBUG, "Created QAT ASYM device %s as cryptodev instance %d", > cryptodev->data->name, internals->asym_dev_id); > return 0; > @@ -307,11 +342,12 @@ qat_asym_dev_destroy(struct qat_pci_device *qat_pci= _dev) > if (qat_pci_dev->asym_dev =3D=3D NULL) > return 0; >=20 > + rte_memzone_free(qat_pci_dev->asym_dev->mz); > /* free crypto device */ > cryptodev =3D rte_cryptodev_pmd_get_dev( > qat_pci_dev->asym_dev->asym_dev_id); > rte_cryptodev_pmd_destroy(cryptodev); > - qat_pci_dev->asym_rte_dev.name =3D NULL; > + qat_pci_devs[qat_pci_dev->qat_dev_id].asym_rte_dev.name =3D NULL; > qat_pci_dev->asym_dev =3D NULL; >=20 > return 0; > @@ -320,4 +356,4 @@ qat_asym_dev_destroy(struct qat_pci_device *qat_pci_d= ev) > 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_a= sym_pmd.h > index 0535bc6..25ba4c7 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 >=20 >=20 > -extern uint8_t cryptodev_qat_asym_driver_id; > +extern uint8_t qat_asym_driver_id; >=20 > /** private data structure for a QAT device. > * This QAT device is a device offering only asymmetric crypto service, > @@ -26,6 +26,8 @@ struct qat_asym_dev_private { > /**< Device instance for this rte_cryptodev */ > const struct rte_cryptodev_capabilities *qat_dev_capabilities; > /* QAT device asymmetric crypto capabilities */ > + const struct rte_memzone *mz; > + /* Shared memzone for storing capabilities */ > uint16_t min_enq_burst_threshold; > }; >=20 > diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c > index 25b6dd5..2e4cfec 100644 > --- a/drivers/crypto/qat/qat_sym.c > +++ b/drivers/crypto/qat/qat_sym.c > @@ -180,7 +180,7 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg, > } >=20 > ctx =3D (struct qat_sym_session *)get_sym_session_private_data( > - op->sym->session, cryptodev_qat_driver_id); > + op->sym->session, qat_sym_driver_id); >=20 > if (unlikely(ctx =3D=3D 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 =3D (struct qat_sym_session *) > get_sym_session_private_data( > rx_op->sym->session, > - cryptodev_qat_driver_id); > + qat_sym_driver_id); >=20 >=20 > if (sess->bpi_ctx) > diff --git a/drivers/crypto/qat/qat_sym_pmd.c b/drivers/crypto/qat/qat_sy= m_pmd.c > index e887c88..221f0f6 100644 > --- a/drivers/crypto/qat/qat_sym_pmd.c > +++ b/drivers/crypto/qat/qat_sym_pmd.c > @@ -16,7 +16,7 @@ >=20 > #define MIXED_CRYPTO_MIN_FW_VER 0x04090000 >=20 > -uint8_t cryptodev_qat_driver_id; > +uint8_t qat_sym_driver_id; >=20 > static const struct rte_cryptodev_capabilities qat_gen1_sym_capabilities= [] =3D { > QAT_BASE_GEN1_SYM_CAPABILITIES, > @@ -29,6 +29,12 @@ static const struct rte_cryptodev_capabilities qat_gen= 2_sym_capabilities[] =3D { > RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() > }; >=20 > +static const struct rte_cryptodev_capabilities qat_gen3_sym_capabilities= [] =3D { > + QAT_BASE_GEN1_SYM_CAPABILITIES, > + QAT_EXTRA_GEN2_SYM_CAPABILITIES, > + RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() > +}; > + > static int qat_sym_qp_release(struct rte_cryptodev *dev, > uint16_t queue_pair_id); >=20 > @@ -74,7 +80,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 =3D dev->feature_flags; > info->capabilities =3D internals->qat_dev_capabilities; > - info->driver_id =3D cryptodev_qat_driver_id; > + info->driver_id =3D qat_sym_driver_id; > /* No limit of number of sessions */ > info->sym.max_nb_sessions =3D 0; > } > @@ -268,33 +274,51 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_d= ev, > struct qat_dev_cmd_param *qat_dev_cmd_param __rte_unused) > { > int i =3D 0; > + struct qat_device_info *qat_dev_instance =3D > + &qat_pci_devs[qat_pci_dev->qat_dev_id]; > struct rte_cryptodev_pmd_init_params init_params =3D { > .name =3D "", > - .socket_id =3D qat_pci_dev->pci_dev->device.numa_node, > + .socket_id =3D qat_dev_instance->pci_dev->device.numa_node, > .private_data_size =3D sizeof(struct qat_sym_dev_private) > }; > char name[RTE_CRYPTODEV_NAME_MAX_LEN]; > + char memz_name[RTE_CRYPTODEV_NAME_MAX_LEN]; > struct rte_cryptodev *cryptodev; > struct qat_sym_dev_private *internals; > + const struct rte_cryptodev_capabilities *capabilities; > + uint64_t capa_size; > + > + if (rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > + qat_pci_dev->qat_sym_driver_id =3D > + qat_sym_driver_id; > + } else if (rte_eal_process_type() =3D=3D RTE_PROC_SECONDARY) { > + if (qat_pci_dev->qat_sym_driver_id !=3D > + qat_sym_driver_id) { > + QAT_LOG(ERR, "Device %s have different driver id than " > + "corresponding device in primary process" > + , name); > + return -(EFAULT); > + } > + } >=20 > snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", > qat_pci_dev->name, "sym"); > QAT_LOG(DEBUG, "Creating QAT SYM device %s", name); >=20 > /* Populate subset device to use in cryptodev device creation */ > - qat_pci_dev->sym_rte_dev.driver =3D &cryptodev_qat_sym_driver; > - qat_pci_dev->sym_rte_dev.numa_node =3D > - qat_pci_dev->pci_dev->device.numa_node; > - qat_pci_dev->sym_rte_dev.devargs =3D NULL; > + qat_dev_instance->sym_rte_dev.driver =3D &cryptodev_qat_sym_driver; > + qat_dev_instance->sym_rte_dev.numa_node =3D > + qat_dev_instance->pci_dev->device.numa_node; > + qat_dev_instance->sym_rte_dev.devargs =3D NULL; >=20 > cryptodev =3D rte_cryptodev_pmd_create(name, > - &(qat_pci_dev->sym_rte_dev), &init_params); > + &(qat_dev_instance->sym_rte_dev), &init_params); >=20 > if (cryptodev =3D=3D NULL) > return -ENODEV; >=20 > - qat_pci_dev->sym_rte_dev.name =3D cryptodev->data->name; > - cryptodev->driver_id =3D cryptodev_qat_driver_id; > + qat_dev_instance->sym_rte_dev.name =3D cryptodev->data->name; > + cryptodev->driver_id =3D qat_sym_driver_id; > cryptodev->dev_ops =3D &crypto_qat_ops; >=20 > cryptodev->enqueue_burst =3D qat_sym_pmd_enqueue_op_burst; > @@ -310,27 +334,49 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_d= ev, > RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT | > RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED; >=20 > + > + if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) > + return 0; > + > + snprintf(memz_name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s_MEMZONE", > + qat_pci_dev->name, "sym"); > + > internals =3D cryptodev->data->dev_private; > internals->qat_dev =3D qat_pci_dev; > - qat_pci_dev->sym_dev =3D internals; > - > internals->sym_dev_id =3D cryptodev->data->dev_id; > + > switch (qat_pci_dev->qat_dev_gen) { > case QAT_GEN1: > - internals->qat_dev_capabilities =3D qat_gen1_sym_capabilities; > + capabilities =3D qat_gen1_sym_capabilities; > + capa_size =3D sizeof(qat_gen1_sym_capabilities); > break; > case QAT_GEN2: > + capabilities =3D qat_gen2_sym_capabilities; > + capa_size =3D sizeof(qat_gen2_sym_capabilities); > + break; > case QAT_GEN3: > - internals->qat_dev_capabilities =3D qat_gen2_sym_capabilities; > + capabilities =3D qat_gen3_sym_capabilities; > + capa_size =3D sizeof(qat_gen3_sym_capabilities); > break; > default: > - internals->qat_dev_capabilities =3D qat_gen2_sym_capabilities; > QAT_LOG(DEBUG, > - "QAT gen %d capabilities unknown, default to GEN2", > + "QAT gen %d capabilities unknown ", > qat_pci_dev->qat_dev_gen); > - break; > + return -(EINVAL); > + } > + > + internals->mz =3D rte_memzone_reserve(memz_name, > + capa_size, > + rte_socket_id(), 0); > + if (internals->mz =3D=3D NULL) { > + QAT_LOG(DEBUG, "Error allocating memzone, destroying PMD" > + " for %s", name); > + rte_cryptodev_pmd_destroy(cryptodev); > + return -EFAULT; > } >=20 > + memcpy(internals->mz->addr, capabilities, capa_size); > + internals->qat_dev_capabilities =3D internals->mz->addr; > while (1) { > if (qat_dev_cmd_param[i].name =3D=3D NULL) > break; > @@ -340,8 +386,10 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_de= v, > i++; > } >=20 > + qat_pci_dev->sym_dev =3D internals; > QAT_LOG(DEBUG, "Created QAT SYM device %s as cryptodev instance %d", > cryptodev->data->name, internals->sym_dev_id); > + > return 0; > } >=20 > @@ -355,10 +403,11 @@ qat_sym_dev_destroy(struct qat_pci_device *qat_pci_= dev) > if (qat_pci_dev->sym_dev =3D=3D NULL) > return 0; >=20 > + rte_memzone_free(qat_pci_dev->sym_dev->mz); [Fiona] sym_destroy should do the opposite of sym_create. Only the primary creates the capa memzone, so only the primary should free = it. Same for asym and comp devices. > /* free crypto device */ > cryptodev =3D rte_cryptodev_pmd_get_dev(qat_pci_dev->sym_dev->sym_dev_i= d); > rte_cryptodev_pmd_destroy(cryptodev); > - qat_pci_dev->sym_rte_dev.name =3D NULL; > + qat_pci_devs[qat_pci_dev->qat_dev_id].sym_rte_dev.name =3D NULL; > qat_pci_dev->sym_dev =3D NULL; >=20 > return 0; > @@ -367,4 +416,4 @@ qat_sym_dev_destroy(struct qat_pci_device *qat_pci_de= v) > 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_sy= m_pmd.h > index a5a31e5..2c8204c 100644 > --- a/drivers/crypto/qat/qat_sym_pmd.h > +++ b/drivers/crypto/qat/qat_sym_pmd.h > @@ -19,7 +19,7 @@ > #define QAT_SYM_CAP_MIXED_CRYPTO (1 << 0) > #define QAT_SYM_CAP_VALID (1 << 31) >=20 > -extern uint8_t cryptodev_qat_driver_id; > +extern uint8_t qat_sym_driver_id; >=20 > /** private data structure for a QAT device. > * This QAT device is a device offering only symmetric crypto service, > @@ -32,6 +32,8 @@ struct qat_sym_dev_private { > /**< Device instance for this rte_cryptodev */ > const struct rte_cryptodev_capabilities *qat_dev_capabilities; > /* QAT device symmetric crypto capabilities */ > + const struct rte_memzone *mz; > + /* Shared memzone for storing capabilities */ > uint16_t min_enq_burst_threshold; > uint32_t internal_capabilities; /* see flags QAT_SYM_CAP_xxx */ > }; > -- > 2.1.0