From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id F3EAE16E for ; Wed, 30 Aug 2017 00:47:36 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Aug 2017 15:47:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,446,1498546800"; d="scan'208";a="895327417" Received: from tanjianf-mobl.ccr.corp.intel.com (HELO [10.233.81.8]) ([10.233.81.8]) by FMSMGA003.fm.intel.com with ESMTP; 29 Aug 2017 15:47:35 -0700 To: =?UTF-8?Q?Ga=c3=abtan_Rivet?= References: <1503654052-84730-1-git-send-email-jianfeng.tan@intel.com> <1503654052-84730-5-git-send-email-jianfeng.tan@intel.com> <20170829130430.GO8124@bidouze.vm.6wind.com> Cc: dev@dpdk.org, bruce.richardson@intel.com, konstantin.ananyev@intel.com, pablo.de.lara.guarch@intel.com, thomas@monjalon.net, yliu@fridaylinux.org, maxime.coquelin@redhat.com, mtetsuyah@gmail.com, ferruh.yigit@intel.com From: "Tan, Jianfeng" Message-ID: <8d8e053d-28c3-7cf5-f906-8fa1159187ca@intel.com> Date: Tue, 29 Aug 2017 15:47:35 -0700 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170829130430.GO8124@bidouze.vm.6wind.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [dpdk-dev] [PATCH 04/12] vdev: move to drivers/bus 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: , X-List-Received-Date: Tue, 29 Aug 2017 22:47:38 -0000 Hi Gaetan, On 8/29/2017 6:04 AM, Gaëtan Rivet wrote: > On Fri, Aug 25, 2017 at 09:40:44AM +0000, Jianfeng Tan wrote: >> Move the vdev bus from lib/librte_eal to drivers/bus. >> >> As the crypto vdev helper function refers to data structure >> in rte_vdev.h, so we move those helper function into drivers/bus >> too. >> >> Signed-off-by: Jianfeng Tan >> --- >> config/common_base | 5 + >> drivers/bus/Makefile | 2 + >> drivers/bus/vdev/Makefile | 57 +++++ >> drivers/bus/vdev/rte_bus_vdev_version.map | 10 + >> drivers/bus/vdev/rte_cryptodev_vdev.c | 154 ++++++++++++++ >> drivers/bus/vdev/rte_cryptodev_vdev.h | 100 +++++++++ >> drivers/bus/vdev/rte_vdev.h | 153 +++++++++++++ >> drivers/bus/vdev/vdev.c | 342 ++++++++++++++++++++++++++++++ >> lib/librte_cryptodev/Makefile | 2 - >> lib/librte_cryptodev/rte_cryptodev_vdev.c | 154 -------------- >> lib/librte_cryptodev/rte_cryptodev_vdev.h | 100 --------- >> lib/librte_eal/bsdapp/eal/Makefile | 1 - >> lib/librte_eal/common/Makefile | 2 +- >> lib/librte_eal/common/eal_common_vdev.c | 342 ------------------------------ >> lib/librte_eal/common/include/rte_dev.h | 24 +-- >> lib/librte_eal/common/include/rte_vdev.h | 131 ------------ >> lib/librte_eal/linuxapp/eal/Makefile | 1 - >> mk/rte.app.mk | 1 + >> 18 files changed, 826 insertions(+), 755 deletions(-) >> create mode 100644 drivers/bus/vdev/Makefile >> create mode 100644 drivers/bus/vdev/rte_bus_vdev_version.map >> create mode 100644 drivers/bus/vdev/rte_cryptodev_vdev.c >> create mode 100644 drivers/bus/vdev/rte_cryptodev_vdev.h >> create mode 100644 drivers/bus/vdev/rte_vdev.h >> create mode 100644 drivers/bus/vdev/vdev.c >> delete mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.c >> delete mode 100644 lib/librte_cryptodev/rte_cryptodev_vdev.h >> delete mode 100644 lib/librte_eal/common/eal_common_vdev.c >> delete mode 100644 lib/librte_eal/common/include/rte_vdev.h >> >> diff --git a/config/common_base b/config/common_base >> index 5e97a08..aca0994 100644 >> --- a/config/common_base >> +++ b/config/common_base >> @@ -750,3 +750,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y >> # Compile the eventdev application >> # >> CONFIG_RTE_APP_EVENTDEV=y >> + >> +# >> +# Compile the vdev bus >> +# >> +CONFIG_RTE_LIBRTE_VDEV=y > Why not CONFIG_RTE_LIBRTE_VDEV_BUS? > It would seem more consistent. Was trying to be consistent with the directory name, drivers/bus/vdev. Do you think that directory should also be renamed? > >> diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile >> index 0224214..9b6d45e 100644 >> --- a/drivers/bus/Makefile >> +++ b/drivers/bus/Makefile >> @@ -35,4 +35,6 @@ core-libs := librte_eal librte_mbuf librte_mempool librte_ring librte_ether >> DIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc >> DEPDIRS-fslmc = $(core-libs) >> >> +DIRS-$(CONFIG_RTE_LIBRTE_VDEV) += vdev >> + >> include $(RTE_SDK)/mk/rte.subdir.mk >> diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile >> new file mode 100644 >> index 0000000..30c4813 >> --- /dev/null >> +++ b/drivers/bus/vdev/Makefile >> @@ -0,0 +1,57 @@ >> +# BSD LICENSE >> +# >> +# Copyright(c) 2017 Intel Corporation. All rights reserved. >> +# All rights reserved. >> +# >> +# Redistribution and use in source and binary forms, with or without >> +# modification, are permitted provided that the following conditions >> +# are met: >> +# >> +# * Redistributions of source code must retain the above copyright >> +# notice, this list of conditions and the following disclaimer. >> +# * Redistributions in binary form must reproduce the above copyright >> +# notice, this list of conditions and the following disclaimer in >> +# the documentation and/or other materials provided with the >> +# distribution. >> +# * Neither the name of Intel Corporation nor the names of its >> +# contributors may be used to endorse or promote products derived >> +# from this software without specific prior written permission. >> +# >> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + >> +include $(RTE_SDK)/mk/rte.vars.mk >> + >> +# >> +# library name >> +# >> +LIB = librte_bus_vdev.a >> + >> +CFLAGS += -O3 >> +CFLAGS += $(WERROR_FLAGS) >> + >> +# versioning export map >> +EXPORT_MAP := rte_bus_vdev_version.map >> + >> +# library version >> +LIBABIVER := 1 >> + >> +SRCS-y += vdev.c >> +SRCS-y += rte_cryptodev_vdev.c >> + >> +# >> +# Export include files >> +# >> +SYMLINK-y-include += rte_vdev.h >> +SYMLINK-y-include += rte_cryptodev_vdev.h >> + > Let's say the cryptodev lib must be updated. > I understand the need to move rte_cryptodev_vdev.h outside > librte_cryptodev, but I guess this exposes the vdev bus to ABI / API > instability due to a third-party subsystem? Thank you for bringing up this question. I really don't want to move these crypto-specific files into bus/vdev/. It's just some helper functions to be called by crypto vdev drivers. And what's more, the only dependence on vdev is that the API rte_cryptodev_vdev_pmd_init() has a parameter of struct rte_vdev_device, which is totally not necessary, as it only needs a struct rte_device parameter. In all, I'd prefer to change this specific API and move those crypto-specific files back to lib/librte_crypto (just like ether dev and eventdev); but it needs API change announcement. Any thoughts? > > I did something somewhat similar for PCI: > http://dpdk.org/ml/archives/dev/2017-August/073525.html I prefer your way to move those things to specific dev folder. > > I don't know which solution is best, but something certainly needs to be > done. > > --- > > Beside the `why`, about the `how`: shouldn't this file compilation and > symlink be conditioned to CONFIG_RTE_LIBRTE_CRYPTODEV=y? > > i.e.: SYMLINK-$(CONFIG_RTE_LIBRTE_CRYPTODEV)-include += rte_cryptodev_vdev.h Yes, make sense. Thanks, Jianfeng > >> +include $(RTE_SDK)/mk/rte.lib.mk >> diff --git a/drivers/bus/vdev/rte_bus_vdev_version.map b/drivers/bus/vdev/rte_bus_vdev_version.map >> new file mode 100644 >> index 0000000..69740c3 >> --- /dev/null >> +++ b/drivers/bus/vdev/rte_bus_vdev_version.map >> @@ -0,0 +1,10 @@ >> +DPDK_17.11 { >> + global: >> + >> + rte_vdev_init; >> + rte_vdev_register; >> + rte_vdev_uninit; >> + rte_vdev_unregister; >> + rte_cryptodev_vdev_pmd_init >> + rte_cryptodev_vdev_parse_init_params >> +}; >> diff --git a/drivers/bus/vdev/rte_cryptodev_vdev.c b/drivers/bus/vdev/rte_cryptodev_vdev.c >> new file mode 100644 >> index 0000000..fd308b4 >> --- /dev/null >> +++ b/drivers/bus/vdev/rte_cryptodev_vdev.c >> @@ -0,0 +1,154 @@ >> +/*- >> + * BSD LICENSE >> + * >> + * Copyright(c) 2017 Intel Corporation. All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * >> + * * Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * * Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in >> + * the documentation and/or other materials provided with the >> + * distribution. >> + * * Neither the name of the copyright holder nor the names of its >> + * contributors may be used to endorse or promote products derived >> + * from this software without specific prior written permission. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + */ >> + >> +#include "rte_cryptodev_vdev.h" >> +#include "rte_cryptodev_pci.h" >> +#include "rte_cryptodev_pmd.h" >> + >> +/** >> + * Parse name from argument >> + */ >> +static int >> +rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused, >> + const char *value, void *extra_args) >> +{ >> + struct rte_crypto_vdev_init_params *params = extra_args; >> + >> + if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) { >> + CDEV_LOG_ERR("Invalid name %s, should be less than " >> + "%u bytes", value, >> + RTE_CRYPTODEV_NAME_MAX_LEN - 1); >> + return -1; >> + } >> + >> + strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); >> + >> + return 0; >> +} >> + >> +/** >> + * Parse integer from argument >> + */ >> +static int >> +rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused, >> + const char *value, void *extra_args) >> +{ >> + int *i = extra_args; >> + >> + *i = atoi(value); >> + if (*i < 0) { >> + CDEV_LOG_ERR("Argument has to be positive."); >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +struct rte_cryptodev * >> +rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size, >> + int socket_id, struct rte_vdev_device *vdev) >> +{ >> + struct rte_cryptodev *cryptodev; >> + >> + /* allocate device structure */ >> + cryptodev = rte_cryptodev_pmd_allocate(name, socket_id); >> + if (cryptodev == NULL) >> + return NULL; >> + >> + /* allocate private device structure */ >> + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { >> + cryptodev->data->dev_private = >> + rte_zmalloc_socket("cryptodev device private", >> + dev_private_size, >> + RTE_CACHE_LINE_SIZE, >> + socket_id); >> + >> + if (cryptodev->data->dev_private == NULL) >> + rte_panic("Cannot allocate memzone for private device" >> + " data"); >> + } >> + >> + cryptodev->device = &vdev->device; >> + >> + /* initialise user call-back tail queue */ >> + TAILQ_INIT(&(cryptodev->link_intr_cbs)); >> + >> + return cryptodev; >> +} >> + >> +int >> +rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, >> + const char *input_args) >> +{ >> + struct rte_kvargs *kvlist = NULL; >> + int ret = 0; >> + >> + if (params == NULL) >> + return -EINVAL; >> + >> + if (input_args) { >> + kvlist = rte_kvargs_parse(input_args, >> + cryptodev_vdev_valid_params); >> + if (kvlist == NULL) >> + return -1; >> + >> + ret = rte_kvargs_process(kvlist, >> + RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, >> + &rte_cryptodev_vdev_parse_integer_arg, >> + ¶ms->max_nb_queue_pairs); >> + if (ret < 0) >> + goto free_kvlist; >> + >> + ret = rte_kvargs_process(kvlist, >> + RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, >> + &rte_cryptodev_vdev_parse_integer_arg, >> + ¶ms->max_nb_sessions); >> + if (ret < 0) >> + goto free_kvlist; >> + >> + ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID, >> + &rte_cryptodev_vdev_parse_integer_arg, >> + ¶ms->socket_id); >> + if (ret < 0) >> + goto free_kvlist; >> + >> + ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME, >> + &rte_cryptodev_vdev_parse_name_arg, >> + params); >> + if (ret < 0) >> + goto free_kvlist; >> + } >> + >> +free_kvlist: >> + rte_kvargs_free(kvlist); >> + return ret; >> +} >> diff --git a/drivers/bus/vdev/rte_cryptodev_vdev.h b/drivers/bus/vdev/rte_cryptodev_vdev.h >> new file mode 100644 >> index 0000000..94ab9d3 >> --- /dev/null >> +++ b/drivers/bus/vdev/rte_cryptodev_vdev.h >> @@ -0,0 +1,100 @@ >> +/*- >> + * BSD LICENSE >> + * >> + * Copyright(c) 2017 Intel Corporation. All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * >> + * * Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * * Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in >> + * the documentation and/or other materials provided with the >> + * distribution. >> + * * Neither the name of the copyright holder nor the names of its >> + * contributors may be used to endorse or promote products derived >> + * from this software without specific prior written permission. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + */ >> + >> +#ifndef _RTE_CRYPTODEV_VDEV_H_ >> +#define _RTE_CRYPTODEV_VDEV_H_ >> + >> +#include >> +#include >> + >> +#include "rte_cryptodev.h" >> + >> +#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS 8 >> +#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS 2048 >> + >> +#define RTE_CRYPTODEV_VDEV_NAME ("name") >> +#define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG ("max_nb_queue_pairs") >> +#define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG ("max_nb_sessions") >> +#define RTE_CRYPTODEV_VDEV_SOCKET_ID ("socket_id") >> + >> +static const char * const cryptodev_vdev_valid_params[] = { >> + RTE_CRYPTODEV_VDEV_NAME, >> + RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, >> + RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, >> + RTE_CRYPTODEV_VDEV_SOCKET_ID >> +}; >> + >> +/** >> + * @internal >> + * Initialisation parameters for virtual crypto devices >> + */ >> +struct rte_crypto_vdev_init_params { >> + unsigned int max_nb_queue_pairs; >> + unsigned int max_nb_sessions; >> + uint8_t socket_id; >> + char name[RTE_CRYPTODEV_NAME_MAX_LEN]; >> +}; >> + >> +/** >> + * @internal >> + * Creates a new virtual crypto device and returns the pointer >> + * to that device. >> + * >> + * @param name PMD type name >> + * @param dev_private_size Size of crypto PMDs private data >> + * @param socket_id Socket to allocate resources on. >> + * @param vdev Pointer to virtual device structure. >> + * >> + * @return >> + * - Cryptodev pointer if device is successfully created. >> + * - NULL if device cannot be created. >> + */ >> +struct rte_cryptodev * >> +rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size, >> + int socket_id, struct rte_vdev_device *vdev); >> + >> +/** >> + * @internal >> + * Parse virtual device initialisation parameters input arguments >> + * >> + * @params params Initialisation parameters with defaults set. >> + * @params input_args Command line arguments >> + * >> + * @return >> + * 0 on successful parse >> + * <0 on failure to parse >> + */ >> +int >> +rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, >> + const char *input_args); >> + >> +#endif /* _RTE_CRYPTODEV_VDEV_H_ */ >> diff --git a/drivers/bus/vdev/rte_vdev.h b/drivers/bus/vdev/rte_vdev.h >> new file mode 100644 >> index 0000000..41762b8 >> --- /dev/null >> +++ b/drivers/bus/vdev/rte_vdev.h >> @@ -0,0 +1,153 @@ >> +/*- >> + * BSD LICENSE >> + * >> + * Copyright(c) 2016 RehiveTech. All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * >> + * * Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * * Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in >> + * the documentation and/or other materials provided with the >> + * distribution. >> + * * Neither the name of RehiveTech nor the names of its >> + * contributors may be used to endorse or promote products derived >> + * from this software without specific prior written permission. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + */ >> + >> +#ifndef RTE_VDEV_H >> +#define RTE_VDEV_H >> + >> +#ifdef __cplusplus >> +extern "C" { >> +#endif >> + >> +#include >> +#include >> +#include >> + >> +struct rte_vdev_device { >> + TAILQ_ENTRY(rte_vdev_device) next; /**< Next attached vdev */ >> + struct rte_device device; /**< Inherit core device */ >> +}; >> + >> +/** >> + * @internal >> + * Helper macro for drivers that need to convert to struct rte_vdev_device. >> + */ >> +#define RTE_DEV_TO_VDEV(ptr) \ >> + container_of(ptr, struct rte_vdev_device, device) >> + >> +static inline const char * >> +rte_vdev_device_name(const struct rte_vdev_device *dev) >> +{ >> + if (dev && dev->device.name) >> + return dev->device.name; >> + return NULL; >> +} >> + >> +static inline const char * >> +rte_vdev_device_args(const struct rte_vdev_device *dev) >> +{ >> + if (dev && dev->device.devargs) >> + return dev->device.devargs->args; >> + return ""; >> +} >> + >> +/** Double linked list of virtual device drivers. */ >> +TAILQ_HEAD(vdev_driver_list, rte_vdev_driver); >> + >> +/** >> + * Probe function called for each virtual device driver once. >> + */ >> +typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev); >> + >> +/** >> + * Remove function called for each virtual device driver once. >> + */ >> +typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev); >> + >> +/** >> + * A virtual device driver abstraction. >> + */ >> +struct rte_vdev_driver { >> + TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */ >> + struct rte_driver driver; /**< Inherited general driver. */ >> + rte_vdev_probe_t *probe; /**< Virtual device probe function. */ >> + rte_vdev_remove_t *remove; /**< Virtual device remove function. */ >> +}; >> + >> +/** >> + * Register a virtual device driver. >> + * >> + * @param driver >> + * A pointer to a rte_vdev_driver structure describing the driver >> + * to be registered. >> + */ >> +void rte_vdev_register(struct rte_vdev_driver *driver); >> + >> +/** >> + * Unregister a virtual device driver. >> + * >> + * @param driver >> + * A pointer to a rte_vdev_driver structure describing the driver >> + * to be unregistered. >> + */ >> +void rte_vdev_unregister(struct rte_vdev_driver *driver); >> + >> +#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\ >> +RTE_INIT(vdrvinitfn_ ##vdrv);\ >> +static const char *vdrvinit_ ## nm ## _alias;\ >> +static void vdrvinitfn_ ##vdrv(void)\ >> +{\ >> + (vdrv).driver.name = RTE_STR(nm);\ >> + (vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\ >> + rte_vdev_register(&vdrv);\ >> +} \ >> +RTE_PMD_EXPORT_NAME(nm, __COUNTER__) >> + >> +#define RTE_PMD_REGISTER_ALIAS(nm, alias)\ >> +static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias) >> + >> +/** >> + * Initialize a driver specified by name. >> + * >> + * @param name >> + * The pointer to a driver name to be initialized. >> + * @param args >> + * The pointer to arguments used by driver initialization. >> + * @return >> + * 0 on success, negative on error >> + */ >> +int rte_vdev_init(const char *name, const char *args); >> + >> +/** >> + * Uninitalize a driver specified by name. >> + * >> + * @param name >> + * The pointer to a driver name to be initialized. >> + * @return >> + * 0 on success, negative on error >> + */ >> +int rte_vdev_uninit(const char *name); >> + >> +#ifdef __cplusplus >> +} >> +#endif >> + >> +#endif >> diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c >> new file mode 100644 >> index 0000000..f7e547a >> --- /dev/null >> +++ b/drivers/bus/vdev/vdev.c >> @@ -0,0 +1,342 @@ >> +/*- >> + * BSD LICENSE >> + * >> + * Copyright(c) 2016 RehiveTech. All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * >> + * * Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * * Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in >> + * the documentation and/or other materials provided with the >> + * distribution. >> + * * Neither the name of RehiveTech nor the names of its >> + * contributors may be used to endorse or promote products derived >> + * from this software without specific prior written permission. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* Forward declare to access virtual bus name */ >> +static struct rte_bus rte_vdev_bus; >> + >> +/** Double linked list of virtual device drivers. */ >> +TAILQ_HEAD(vdev_device_list, rte_vdev_device); >> + >> +static struct vdev_device_list vdev_device_list = >> + TAILQ_HEAD_INITIALIZER(vdev_device_list); >> +struct vdev_driver_list vdev_driver_list = >> + TAILQ_HEAD_INITIALIZER(vdev_driver_list); >> + >> +/* register a driver */ >> +void >> +rte_vdev_register(struct rte_vdev_driver *driver) >> +{ >> + TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next); >> +} >> + >> +/* unregister a driver */ >> +void >> +rte_vdev_unregister(struct rte_vdev_driver *driver) >> +{ >> + TAILQ_REMOVE(&vdev_driver_list, driver, next); >> +} >> + >> +static int >> +vdev_parse(const char *name, void *addr) >> +{ >> + struct rte_vdev_driver **out = addr; >> + struct rte_vdev_driver *driver = NULL; >> + >> + TAILQ_FOREACH(driver, &vdev_driver_list, next) { >> + if (strncmp(driver->driver.name, name, >> + strlen(driver->driver.name)) == 0) >> + break; >> + if (driver->driver.alias && >> + strncmp(driver->driver.alias, name, >> + strlen(driver->driver.alias)) == 0) >> + break; >> + } >> + if (driver != NULL && >> + addr != NULL) >> + *out = driver; >> + return driver == NULL; >> +} >> + >> +static int >> +vdev_probe_all_drivers(struct rte_vdev_device *dev) >> +{ >> + const char *name; >> + struct rte_vdev_driver *driver; >> + int ret; >> + >> + name = rte_vdev_device_name(dev); >> + >> + RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name, >> + rte_vdev_device_name(dev)); >> + >> + if (vdev_parse(name, &driver)) >> + return -1; >> + dev->device.driver = &driver->driver; >> + ret = driver->probe(dev); >> + if (ret) >> + dev->device.driver = NULL; >> + return ret; >> +} >> + >> +static struct rte_vdev_device * >> +find_vdev(const char *name) >> +{ >> + struct rte_vdev_device *dev; >> + >> + if (!name) >> + return NULL; >> + >> + TAILQ_FOREACH(dev, &vdev_device_list, next) { >> + const char *devname = rte_vdev_device_name(dev); >> + if (!strncmp(devname, name, strlen(name))) >> + return dev; >> + } >> + >> + return NULL; >> +} >> + >> +static struct rte_devargs * >> +alloc_devargs(const char *name, const char *args) >> +{ >> + struct rte_devargs *devargs; >> + int ret; >> + >> + devargs = calloc(1, sizeof(*devargs)); >> + if (!devargs) >> + return NULL; >> + >> + devargs->bus = &rte_vdev_bus; >> + if (args) >> + devargs->args = strdup(args); >> + else >> + devargs->args = strdup(""); >> + >> + ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name); >> + if (ret < 0 || ret >= (int)sizeof(devargs->name)) { >> + free(devargs->args); >> + free(devargs); >> + return NULL; >> + } >> + >> + return devargs; >> +} >> + >> +int >> +rte_vdev_init(const char *name, const char *args) >> +{ >> + struct rte_vdev_device *dev; >> + struct rte_devargs *devargs; >> + int ret; >> + >> + if (name == NULL) >> + return -EINVAL; >> + >> + dev = find_vdev(name); >> + if (dev) >> + return -EEXIST; >> + >> + devargs = alloc_devargs(name, args); >> + if (!devargs) >> + return -ENOMEM; >> + >> + dev = calloc(1, sizeof(*dev)); >> + if (!dev) { >> + ret = -ENOMEM; >> + goto fail; >> + } >> + >> + dev->device.devargs = devargs; >> + dev->device.numa_node = SOCKET_ID_ANY; >> + dev->device.name = devargs->name; >> + >> + ret = vdev_probe_all_drivers(dev); >> + if (ret) { >> + if (ret > 0) >> + RTE_LOG(ERR, EAL, "no driver found for %s\n", name); >> + goto fail; >> + } >> + >> + TAILQ_INSERT_TAIL(&devargs_list, devargs, next); >> + >> + TAILQ_INSERT_TAIL(&vdev_device_list, dev, next); >> + return 0; >> + >> +fail: >> + free(devargs->args); >> + free(devargs); >> + free(dev); >> + return ret; >> +} >> + >> +static int >> +vdev_remove_driver(struct rte_vdev_device *dev) >> +{ >> + const char *name = rte_vdev_device_name(dev); >> + const struct rte_vdev_driver *driver; >> + >> + if (!dev->device.driver) { >> + RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name); >> + return 1; >> + } >> + >> + driver = container_of(dev->device.driver, const struct rte_vdev_driver, >> + driver); >> + return driver->remove(dev); >> +} >> + >> +int >> +rte_vdev_uninit(const char *name) >> +{ >> + struct rte_vdev_device *dev; >> + struct rte_devargs *devargs; >> + int ret; >> + >> + if (name == NULL) >> + return -EINVAL; >> + >> + dev = find_vdev(name); >> + if (!dev) >> + return -ENOENT; >> + >> + devargs = dev->device.devargs; >> + >> + ret = vdev_remove_driver(dev); >> + if (ret) >> + return ret; >> + >> + TAILQ_REMOVE(&vdev_device_list, dev, next); >> + >> + TAILQ_REMOVE(&devargs_list, devargs, next); >> + >> + free(devargs->args); >> + free(devargs); >> + free(dev); >> + return 0; >> +} >> + >> +static int >> +vdev_scan(void) >> +{ >> + struct rte_vdev_device *dev; >> + struct rte_devargs *devargs; >> + >> + /* for virtual devices we scan the devargs_list populated via cmdline */ >> + TAILQ_FOREACH(devargs, &devargs_list, next) { >> + >> + if (devargs->bus != &rte_vdev_bus) >> + continue; >> + >> + dev = find_vdev(devargs->name); >> + if (dev) >> + continue; >> + >> + dev = calloc(1, sizeof(*dev)); >> + if (!dev) >> + return -1; >> + >> + dev->device.devargs = devargs; >> + dev->device.numa_node = SOCKET_ID_ANY; >> + dev->device.name = devargs->name; >> + >> + TAILQ_INSERT_TAIL(&vdev_device_list, dev, next); >> + } >> + >> + return 0; >> +} >> + >> +static int >> +vdev_probe(void) >> +{ >> + struct rte_vdev_device *dev; >> + >> + /* call the init function for each virtual device */ >> + TAILQ_FOREACH(dev, &vdev_device_list, next) { >> + >> + if (dev->device.driver) >> + continue; >> + >> + if (vdev_probe_all_drivers(dev)) { >> + RTE_LOG(ERR, EAL, "failed to initialize %s device\n", >> + rte_vdev_device_name(dev)); >> + return -1; >> + } >> + } >> + >> + return 0; >> +} >> + >> +static struct rte_device * >> +vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, >> + const void *data) >> +{ >> + struct rte_vdev_device *dev; >> + >> + TAILQ_FOREACH(dev, &vdev_device_list, next) { >> + if (start && &dev->device == start) { >> + start = NULL; >> + continue; >> + } >> + if (cmp(&dev->device, data) == 0) >> + return &dev->device; >> + } >> + return NULL; >> +} >> + >> +static int >> +vdev_plug(struct rte_device *dev) >> +{ >> + return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev)); >> +} >> + >> +static int >> +vdev_unplug(struct rte_device *dev) >> +{ >> + return rte_vdev_uninit(dev->name); >> +} >> + >> +static struct rte_bus rte_vdev_bus = { >> + .scan = vdev_scan, >> + .probe = vdev_probe, >> + .find_device = vdev_find_device, >> + .plug = vdev_plug, >> + .unplug = vdev_unplug, >> + .parse = vdev_parse, >> +}; >> + >> +RTE_REGISTER_BUS(vdev, rte_vdev_bus); >> diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile >> index 301c78d..4f70719 100644 >> --- a/lib/librte_cryptodev/Makefile >> +++ b/lib/librte_cryptodev/Makefile >> @@ -42,14 +42,12 @@ CFLAGS += $(WERROR_FLAGS) >> >> # library source files >> SRCS-y += rte_cryptodev.c rte_cryptodev_pmd.c >> -SRCS-y += rte_cryptodev_vdev.c >> >> # export include files >> SYMLINK-y-include += rte_crypto.h >> SYMLINK-y-include += rte_crypto_sym.h >> SYMLINK-y-include += rte_cryptodev.h >> SYMLINK-y-include += rte_cryptodev_pmd.h >> -SYMLINK-y-include += rte_cryptodev_vdev.h >> SYMLINK-y-include += rte_cryptodev_pci.h >> >> # versioning export map >> diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.c b/lib/librte_cryptodev/rte_cryptodev_vdev.c >> deleted file mode 100644 >> index fd308b4..0000000 >> --- a/lib/librte_cryptodev/rte_cryptodev_vdev.c >> +++ /dev/null >> @@ -1,154 +0,0 @@ >> -/*- >> - * BSD LICENSE >> - * >> - * Copyright(c) 2017 Intel Corporation. All rights reserved. >> - * >> - * Redistribution and use in source and binary forms, with or without >> - * modification, are permitted provided that the following conditions >> - * are met: >> - * >> - * * Redistributions of source code must retain the above copyright >> - * notice, this list of conditions and the following disclaimer. >> - * * Redistributions in binary form must reproduce the above copyright >> - * notice, this list of conditions and the following disclaimer in >> - * the documentation and/or other materials provided with the >> - * distribution. >> - * * Neither the name of the copyright holder nor the names of its >> - * contributors may be used to endorse or promote products derived >> - * from this software without specific prior written permission. >> - * >> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> - */ >> - >> -#include "rte_cryptodev_vdev.h" >> -#include "rte_cryptodev_pci.h" >> -#include "rte_cryptodev_pmd.h" >> - >> -/** >> - * Parse name from argument >> - */ >> -static int >> -rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused, >> - const char *value, void *extra_args) >> -{ >> - struct rte_crypto_vdev_init_params *params = extra_args; >> - >> - if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) { >> - CDEV_LOG_ERR("Invalid name %s, should be less than " >> - "%u bytes", value, >> - RTE_CRYPTODEV_NAME_MAX_LEN - 1); >> - return -1; >> - } >> - >> - strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); >> - >> - return 0; >> -} >> - >> -/** >> - * Parse integer from argument >> - */ >> -static int >> -rte_cryptodev_vdev_parse_integer_arg(const char *key __rte_unused, >> - const char *value, void *extra_args) >> -{ >> - int *i = extra_args; >> - >> - *i = atoi(value); >> - if (*i < 0) { >> - CDEV_LOG_ERR("Argument has to be positive."); >> - return -1; >> - } >> - >> - return 0; >> -} >> - >> -struct rte_cryptodev * >> -rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size, >> - int socket_id, struct rte_vdev_device *vdev) >> -{ >> - struct rte_cryptodev *cryptodev; >> - >> - /* allocate device structure */ >> - cryptodev = rte_cryptodev_pmd_allocate(name, socket_id); >> - if (cryptodev == NULL) >> - return NULL; >> - >> - /* allocate private device structure */ >> - if (rte_eal_process_type() == RTE_PROC_PRIMARY) { >> - cryptodev->data->dev_private = >> - rte_zmalloc_socket("cryptodev device private", >> - dev_private_size, >> - RTE_CACHE_LINE_SIZE, >> - socket_id); >> - >> - if (cryptodev->data->dev_private == NULL) >> - rte_panic("Cannot allocate memzone for private device" >> - " data"); >> - } >> - >> - cryptodev->device = &vdev->device; >> - >> - /* initialise user call-back tail queue */ >> - TAILQ_INIT(&(cryptodev->link_intr_cbs)); >> - >> - return cryptodev; >> -} >> - >> -int >> -rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, >> - const char *input_args) >> -{ >> - struct rte_kvargs *kvlist = NULL; >> - int ret = 0; >> - >> - if (params == NULL) >> - return -EINVAL; >> - >> - if (input_args) { >> - kvlist = rte_kvargs_parse(input_args, >> - cryptodev_vdev_valid_params); >> - if (kvlist == NULL) >> - return -1; >> - >> - ret = rte_kvargs_process(kvlist, >> - RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, >> - &rte_cryptodev_vdev_parse_integer_arg, >> - ¶ms->max_nb_queue_pairs); >> - if (ret < 0) >> - goto free_kvlist; >> - >> - ret = rte_kvargs_process(kvlist, >> - RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, >> - &rte_cryptodev_vdev_parse_integer_arg, >> - ¶ms->max_nb_sessions); >> - if (ret < 0) >> - goto free_kvlist; >> - >> - ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_SOCKET_ID, >> - &rte_cryptodev_vdev_parse_integer_arg, >> - ¶ms->socket_id); >> - if (ret < 0) >> - goto free_kvlist; >> - >> - ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME, >> - &rte_cryptodev_vdev_parse_name_arg, >> - params); >> - if (ret < 0) >> - goto free_kvlist; >> - } >> - >> -free_kvlist: >> - rte_kvargs_free(kvlist); >> - return ret; >> -} >> diff --git a/lib/librte_cryptodev/rte_cryptodev_vdev.h b/lib/librte_cryptodev/rte_cryptodev_vdev.h >> deleted file mode 100644 >> index 94ab9d3..0000000 >> --- a/lib/librte_cryptodev/rte_cryptodev_vdev.h >> +++ /dev/null >> @@ -1,100 +0,0 @@ >> -/*- >> - * BSD LICENSE >> - * >> - * Copyright(c) 2017 Intel Corporation. All rights reserved. >> - * >> - * Redistribution and use in source and binary forms, with or without >> - * modification, are permitted provided that the following conditions >> - * are met: >> - * >> - * * Redistributions of source code must retain the above copyright >> - * notice, this list of conditions and the following disclaimer. >> - * * Redistributions in binary form must reproduce the above copyright >> - * notice, this list of conditions and the following disclaimer in >> - * the documentation and/or other materials provided with the >> - * distribution. >> - * * Neither the name of the copyright holder nor the names of its >> - * contributors may be used to endorse or promote products derived >> - * from this software without specific prior written permission. >> - * >> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> - */ >> - >> -#ifndef _RTE_CRYPTODEV_VDEV_H_ >> -#define _RTE_CRYPTODEV_VDEV_H_ >> - >> -#include >> -#include >> - >> -#include "rte_cryptodev.h" >> - >> -#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS 8 >> -#define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS 2048 >> - >> -#define RTE_CRYPTODEV_VDEV_NAME ("name") >> -#define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG ("max_nb_queue_pairs") >> -#define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG ("max_nb_sessions") >> -#define RTE_CRYPTODEV_VDEV_SOCKET_ID ("socket_id") >> - >> -static const char * const cryptodev_vdev_valid_params[] = { >> - RTE_CRYPTODEV_VDEV_NAME, >> - RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG, >> - RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG, >> - RTE_CRYPTODEV_VDEV_SOCKET_ID >> -}; >> - >> -/** >> - * @internal >> - * Initialisation parameters for virtual crypto devices >> - */ >> -struct rte_crypto_vdev_init_params { >> - unsigned int max_nb_queue_pairs; >> - unsigned int max_nb_sessions; >> - uint8_t socket_id; >> - char name[RTE_CRYPTODEV_NAME_MAX_LEN]; >> -}; >> - >> -/** >> - * @internal >> - * Creates a new virtual crypto device and returns the pointer >> - * to that device. >> - * >> - * @param name PMD type name >> - * @param dev_private_size Size of crypto PMDs private data >> - * @param socket_id Socket to allocate resources on. >> - * @param vdev Pointer to virtual device structure. >> - * >> - * @return >> - * - Cryptodev pointer if device is successfully created. >> - * - NULL if device cannot be created. >> - */ >> -struct rte_cryptodev * >> -rte_cryptodev_vdev_pmd_init(const char *name, size_t dev_private_size, >> - int socket_id, struct rte_vdev_device *vdev); >> - >> -/** >> - * @internal >> - * Parse virtual device initialisation parameters input arguments >> - * >> - * @params params Initialisation parameters with defaults set. >> - * @params input_args Command line arguments >> - * >> - * @return >> - * 0 on successful parse >> - * <0 on failure to parse >> - */ >> -int >> -rte_cryptodev_vdev_parse_init_params(struct rte_crypto_vdev_init_params *params, >> - const char *input_args); >> - >> -#endif /* _RTE_CRYPTODEV_VDEV_H_ */ >> diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile >> index 005019e..6fee587 100644 >> --- a/lib/librte_eal/bsdapp/eal/Makefile >> +++ b/lib/librte_eal/bsdapp/eal/Makefile >> @@ -68,7 +68,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_log.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_launch.c >> -SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_vdev.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_pci_uio.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memory.c >> diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile >> index e8fd67a..7eeb06a 100644 >> --- a/lib/librte_eal/common/Makefile >> +++ b/lib/librte_eal/common/Makefile >> @@ -38,7 +38,7 @@ INC += rte_per_lcore.h rte_random.h >> INC += rte_tailq.h rte_interrupts.h rte_alarm.h >> INC += rte_string_fns.h rte_version.h >> INC += rte_eal_memconfig.h rte_malloc_heap.h >> -INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h >> +INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h >> INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h >> INC += rte_malloc.h rte_keepalive.h rte_time.h >> INC += rte_service.h rte_service_component.h >> diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c >> deleted file mode 100644 >> index f7e547a..0000000 >> --- a/lib/librte_eal/common/eal_common_vdev.c >> +++ /dev/null >> @@ -1,342 +0,0 @@ >> -/*- >> - * BSD LICENSE >> - * >> - * Copyright(c) 2016 RehiveTech. All rights reserved. >> - * >> - * Redistribution and use in source and binary forms, with or without >> - * modification, are permitted provided that the following conditions >> - * are met: >> - * >> - * * Redistributions of source code must retain the above copyright >> - * notice, this list of conditions and the following disclaimer. >> - * * Redistributions in binary form must reproduce the above copyright >> - * notice, this list of conditions and the following disclaimer in >> - * the documentation and/or other materials provided with the >> - * distribution. >> - * * Neither the name of RehiveTech nor the names of its >> - * contributors may be used to endorse or promote products derived >> - * from this software without specific prior written permission. >> - * >> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> - */ >> - >> -#include >> -#include >> -#include >> -#include >> -#include >> -#include >> -#include >> - >> -#include >> -#include >> -#include >> -#include >> -#include >> -#include >> -#include >> -#include >> - >> -/* Forward declare to access virtual bus name */ >> -static struct rte_bus rte_vdev_bus; >> - >> -/** Double linked list of virtual device drivers. */ >> -TAILQ_HEAD(vdev_device_list, rte_vdev_device); >> - >> -static struct vdev_device_list vdev_device_list = >> - TAILQ_HEAD_INITIALIZER(vdev_device_list); >> -struct vdev_driver_list vdev_driver_list = >> - TAILQ_HEAD_INITIALIZER(vdev_driver_list); >> - >> -/* register a driver */ >> -void >> -rte_vdev_register(struct rte_vdev_driver *driver) >> -{ >> - TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next); >> -} >> - >> -/* unregister a driver */ >> -void >> -rte_vdev_unregister(struct rte_vdev_driver *driver) >> -{ >> - TAILQ_REMOVE(&vdev_driver_list, driver, next); >> -} >> - >> -static int >> -vdev_parse(const char *name, void *addr) >> -{ >> - struct rte_vdev_driver **out = addr; >> - struct rte_vdev_driver *driver = NULL; >> - >> - TAILQ_FOREACH(driver, &vdev_driver_list, next) { >> - if (strncmp(driver->driver.name, name, >> - strlen(driver->driver.name)) == 0) >> - break; >> - if (driver->driver.alias && >> - strncmp(driver->driver.alias, name, >> - strlen(driver->driver.alias)) == 0) >> - break; >> - } >> - if (driver != NULL && >> - addr != NULL) >> - *out = driver; >> - return driver == NULL; >> -} >> - >> -static int >> -vdev_probe_all_drivers(struct rte_vdev_device *dev) >> -{ >> - const char *name; >> - struct rte_vdev_driver *driver; >> - int ret; >> - >> - name = rte_vdev_device_name(dev); >> - >> - RTE_LOG(DEBUG, EAL, "Search driver %s to probe device %s\n", name, >> - rte_vdev_device_name(dev)); >> - >> - if (vdev_parse(name, &driver)) >> - return -1; >> - dev->device.driver = &driver->driver; >> - ret = driver->probe(dev); >> - if (ret) >> - dev->device.driver = NULL; >> - return ret; >> -} >> - >> -static struct rte_vdev_device * >> -find_vdev(const char *name) >> -{ >> - struct rte_vdev_device *dev; >> - >> - if (!name) >> - return NULL; >> - >> - TAILQ_FOREACH(dev, &vdev_device_list, next) { >> - const char *devname = rte_vdev_device_name(dev); >> - if (!strncmp(devname, name, strlen(name))) >> - return dev; >> - } >> - >> - return NULL; >> -} >> - >> -static struct rte_devargs * >> -alloc_devargs(const char *name, const char *args) >> -{ >> - struct rte_devargs *devargs; >> - int ret; >> - >> - devargs = calloc(1, sizeof(*devargs)); >> - if (!devargs) >> - return NULL; >> - >> - devargs->bus = &rte_vdev_bus; >> - if (args) >> - devargs->args = strdup(args); >> - else >> - devargs->args = strdup(""); >> - >> - ret = snprintf(devargs->name, sizeof(devargs->name), "%s", name); >> - if (ret < 0 || ret >= (int)sizeof(devargs->name)) { >> - free(devargs->args); >> - free(devargs); >> - return NULL; >> - } >> - >> - return devargs; >> -} >> - >> -int >> -rte_vdev_init(const char *name, const char *args) >> -{ >> - struct rte_vdev_device *dev; >> - struct rte_devargs *devargs; >> - int ret; >> - >> - if (name == NULL) >> - return -EINVAL; >> - >> - dev = find_vdev(name); >> - if (dev) >> - return -EEXIST; >> - >> - devargs = alloc_devargs(name, args); >> - if (!devargs) >> - return -ENOMEM; >> - >> - dev = calloc(1, sizeof(*dev)); >> - if (!dev) { >> - ret = -ENOMEM; >> - goto fail; >> - } >> - >> - dev->device.devargs = devargs; >> - dev->device.numa_node = SOCKET_ID_ANY; >> - dev->device.name = devargs->name; >> - >> - ret = vdev_probe_all_drivers(dev); >> - if (ret) { >> - if (ret > 0) >> - RTE_LOG(ERR, EAL, "no driver found for %s\n", name); >> - goto fail; >> - } >> - >> - TAILQ_INSERT_TAIL(&devargs_list, devargs, next); >> - >> - TAILQ_INSERT_TAIL(&vdev_device_list, dev, next); >> - return 0; >> - >> -fail: >> - free(devargs->args); >> - free(devargs); >> - free(dev); >> - return ret; >> -} >> - >> -static int >> -vdev_remove_driver(struct rte_vdev_device *dev) >> -{ >> - const char *name = rte_vdev_device_name(dev); >> - const struct rte_vdev_driver *driver; >> - >> - if (!dev->device.driver) { >> - RTE_LOG(DEBUG, EAL, "no driver attach to device %s\n", name); >> - return 1; >> - } >> - >> - driver = container_of(dev->device.driver, const struct rte_vdev_driver, >> - driver); >> - return driver->remove(dev); >> -} >> - >> -int >> -rte_vdev_uninit(const char *name) >> -{ >> - struct rte_vdev_device *dev; >> - struct rte_devargs *devargs; >> - int ret; >> - >> - if (name == NULL) >> - return -EINVAL; >> - >> - dev = find_vdev(name); >> - if (!dev) >> - return -ENOENT; >> - >> - devargs = dev->device.devargs; >> - >> - ret = vdev_remove_driver(dev); >> - if (ret) >> - return ret; >> - >> - TAILQ_REMOVE(&vdev_device_list, dev, next); >> - >> - TAILQ_REMOVE(&devargs_list, devargs, next); >> - >> - free(devargs->args); >> - free(devargs); >> - free(dev); >> - return 0; >> -} >> - >> -static int >> -vdev_scan(void) >> -{ >> - struct rte_vdev_device *dev; >> - struct rte_devargs *devargs; >> - >> - /* for virtual devices we scan the devargs_list populated via cmdline */ >> - TAILQ_FOREACH(devargs, &devargs_list, next) { >> - >> - if (devargs->bus != &rte_vdev_bus) >> - continue; >> - >> - dev = find_vdev(devargs->name); >> - if (dev) >> - continue; >> - >> - dev = calloc(1, sizeof(*dev)); >> - if (!dev) >> - return -1; >> - >> - dev->device.devargs = devargs; >> - dev->device.numa_node = SOCKET_ID_ANY; >> - dev->device.name = devargs->name; >> - >> - TAILQ_INSERT_TAIL(&vdev_device_list, dev, next); >> - } >> - >> - return 0; >> -} >> - >> -static int >> -vdev_probe(void) >> -{ >> - struct rte_vdev_device *dev; >> - >> - /* call the init function for each virtual device */ >> - TAILQ_FOREACH(dev, &vdev_device_list, next) { >> - >> - if (dev->device.driver) >> - continue; >> - >> - if (vdev_probe_all_drivers(dev)) { >> - RTE_LOG(ERR, EAL, "failed to initialize %s device\n", >> - rte_vdev_device_name(dev)); >> - return -1; >> - } >> - } >> - >> - return 0; >> -} >> - >> -static struct rte_device * >> -vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, >> - const void *data) >> -{ >> - struct rte_vdev_device *dev; >> - >> - TAILQ_FOREACH(dev, &vdev_device_list, next) { >> - if (start && &dev->device == start) { >> - start = NULL; >> - continue; >> - } >> - if (cmp(&dev->device, data) == 0) >> - return &dev->device; >> - } >> - return NULL; >> -} >> - >> -static int >> -vdev_plug(struct rte_device *dev) >> -{ >> - return vdev_probe_all_drivers(RTE_DEV_TO_VDEV(dev)); >> -} >> - >> -static int >> -vdev_unplug(struct rte_device *dev) >> -{ >> - return rte_vdev_uninit(dev->name); >> -} >> - >> -static struct rte_bus rte_vdev_bus = { >> - .scan = vdev_scan, >> - .probe = vdev_probe, >> - .find_device = vdev_find_device, >> - .plug = vdev_plug, >> - .unplug = vdev_unplug, >> - .parse = vdev_parse, >> -}; >> - >> -RTE_REGISTER_BUS(vdev, rte_vdev_bus); >> diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h >> index 5386d3a..8bfc343 100644 >> --- a/lib/librte_eal/common/include/rte_dev.h >> +++ b/lib/librte_eal/common/include/rte_dev.h >> @@ -166,28 +166,6 @@ struct rte_device { >> }; >> >> /** >> - * Initialize a driver specified by name. >> - * >> - * @param name >> - * The pointer to a driver name to be initialized. >> - * @param args >> - * The pointer to arguments used by driver initialization. >> - * @return >> - * 0 on success, negative on error >> - */ >> -int rte_vdev_init(const char *name, const char *args); >> - >> -/** >> - * Uninitalize a driver specified by name. >> - * >> - * @param name >> - * The pointer to a driver name to be initialized. >> - * @return >> - * 0 on success, negative on error >> - */ >> -int rte_vdev_uninit(const char *name); >> - >> -/** >> * Attach a device to a registered driver. >> * >> * @param name >> @@ -312,4 +290,4 @@ __attribute__((used)) = str >> } >> #endif >> >> -#endif /* _RTE_VDEV_H_ */ >> +#endif /* _RTE_DEV_H_ */ >> diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h >> deleted file mode 100644 >> index 29f5a52..0000000 >> --- a/lib/librte_eal/common/include/rte_vdev.h >> +++ /dev/null >> @@ -1,131 +0,0 @@ >> -/*- >> - * BSD LICENSE >> - * >> - * Copyright(c) 2016 RehiveTech. All rights reserved. >> - * >> - * Redistribution and use in source and binary forms, with or without >> - * modification, are permitted provided that the following conditions >> - * are met: >> - * >> - * * Redistributions of source code must retain the above copyright >> - * notice, this list of conditions and the following disclaimer. >> - * * Redistributions in binary form must reproduce the above copyright >> - * notice, this list of conditions and the following disclaimer in >> - * the documentation and/or other materials provided with the >> - * distribution. >> - * * Neither the name of RehiveTech nor the names of its >> - * contributors may be used to endorse or promote products derived >> - * from this software without specific prior written permission. >> - * >> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >> - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> - */ >> - >> -#ifndef RTE_VDEV_H >> -#define RTE_VDEV_H >> - >> -#ifdef __cplusplus >> -extern "C" { >> -#endif >> - >> -#include >> -#include >> -#include >> - >> -struct rte_vdev_device { >> - TAILQ_ENTRY(rte_vdev_device) next; /**< Next attached vdev */ >> - struct rte_device device; /**< Inherit core device */ >> -}; >> - >> -/** >> - * @internal >> - * Helper macro for drivers that need to convert to struct rte_vdev_device. >> - */ >> -#define RTE_DEV_TO_VDEV(ptr) \ >> - container_of(ptr, struct rte_vdev_device, device) >> - >> -static inline const char * >> -rte_vdev_device_name(const struct rte_vdev_device *dev) >> -{ >> - if (dev && dev->device.name) >> - return dev->device.name; >> - return NULL; >> -} >> - >> -static inline const char * >> -rte_vdev_device_args(const struct rte_vdev_device *dev) >> -{ >> - if (dev && dev->device.devargs) >> - return dev->device.devargs->args; >> - return ""; >> -} >> - >> -/** Double linked list of virtual device drivers. */ >> -TAILQ_HEAD(vdev_driver_list, rte_vdev_driver); >> - >> -/** >> - * Probe function called for each virtual device driver once. >> - */ >> -typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev); >> - >> -/** >> - * Remove function called for each virtual device driver once. >> - */ >> -typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev); >> - >> -/** >> - * A virtual device driver abstraction. >> - */ >> -struct rte_vdev_driver { >> - TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */ >> - struct rte_driver driver; /**< Inherited general driver. */ >> - rte_vdev_probe_t *probe; /**< Virtual device probe function. */ >> - rte_vdev_remove_t *remove; /**< Virtual device remove function. */ >> -}; >> - >> -/** >> - * Register a virtual device driver. >> - * >> - * @param driver >> - * A pointer to a rte_vdev_driver structure describing the driver >> - * to be registered. >> - */ >> -void rte_vdev_register(struct rte_vdev_driver *driver); >> - >> -/** >> - * Unregister a virtual device driver. >> - * >> - * @param driver >> - * A pointer to a rte_vdev_driver structure describing the driver >> - * to be unregistered. >> - */ >> -void rte_vdev_unregister(struct rte_vdev_driver *driver); >> - >> -#define RTE_PMD_REGISTER_VDEV(nm, vdrv)\ >> -RTE_INIT(vdrvinitfn_ ##vdrv);\ >> -static const char *vdrvinit_ ## nm ## _alias;\ >> -static void vdrvinitfn_ ##vdrv(void)\ >> -{\ >> - (vdrv).driver.name = RTE_STR(nm);\ >> - (vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\ >> - rte_vdev_register(&vdrv);\ >> -} \ >> -RTE_PMD_EXPORT_NAME(nm, __COUNTER__) >> - >> -#define RTE_PMD_REGISTER_ALIAS(nm, alias)\ >> -static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias) >> - >> -#ifdef __cplusplus >> -} >> -#endif >> - >> -#endif >> diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile >> index 90bca4d..33faa18 100644 >> --- a/lib/librte_eal/linuxapp/eal/Makefile >> +++ b/lib/librte_eal/linuxapp/eal/Makefile >> @@ -80,7 +80,6 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c >> -SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci_uio.c >> SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memory.c >> diff --git a/mk/rte.app.mk b/mk/rte.app.mk >> index c25fdd9..c423bf8 100644 >> --- a/mk/rte.app.mk >> +++ b/mk/rte.app.mk >> @@ -97,6 +97,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += -lrte_mempool >> _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING) += -lrte_mempool_ring >> _LDLIBS-$(CONFIG_RTE_LIBRTE_RING) += -lrte_ring >> _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL) += -lrte_eal >> +_LDLIBS-$(CONFIG_RTE_LIBRTE_VDEV) += -lrte_bus_vdev >> _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE) += -lrte_cmdline >> _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder >> >> -- >> 2.7.4 >>