From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by dpdk.org (Postfix) with ESMTP id CDC67137C for ; Tue, 29 Aug 2017 15:04:41 +0200 (CEST) Received: by mail-wm0-f48.google.com with SMTP id t201so1731244wmt.1 for ; Tue, 29 Aug 2017 06:04:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=dt5TVF6qRSIZxf7QNmCOYTnmgc4xNYwTiTjhZ7tXky8=; b=utkdtpX9Re50Q20qjVxkD6GLfuBBaovj2scnrO7OhzeiDrS49l0KPOJCrLC9WLBQM6 pSUTXbd05MrbGzzvW+wXFqkcgfqKSSWqrm81UVlbbZlwgVtxk2ombIKeRO3Msd37DGES SK0HgXbVH+b+IdUSDUOcAHrcnoJURWHhPMJCpu9PtkvfyQl0egp8F6YKisEhpwfiah08 528cnSN7DWapfk60mG/pr62hb/t0edaMDw0dz7SXNBVTlqFYu2ErTMxhFjUdTXC2+Rcd CMi6vyuplFHnjuwlF6LOamf8PqWAIMsweX6WnzRUytfW98ZnNtBQurUFoPfFb6bsLOsR KUTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=dt5TVF6qRSIZxf7QNmCOYTnmgc4xNYwTiTjhZ7tXky8=; b=JNo6I6tsgA0zEAz4E0hVc/A1vTVaFKlzlCvTvZ8Z89dHCSOS48scdiNoucnEz+24CE jhG4YodmK90DMR+pnXgURGFZtN3T4QRIXwZlnta24LNOtxVGpRrRKgLLhZO2dzijngtY LdBrVob2blsWYDe1AJWlGga0Ob4JK1h7b0DF18xA7xno5p+/rULpHkMC00/KvzNbzTJ5 HMLzhD042VmoxAn0dNqm3S9S0PPkB7kIHb9fAe89v8brP1YpbUnjwI1Lx5jK4YhlcZ7Z WFM1hm6cIm8KV7Oz/LHsi94Sd85bNMGzbbnp0XuShmr2Dv2CNZSy6G9assUEME6B1bEw YVcQ== X-Gm-Message-State: AHYfb5hF6jP//2IIiKc8LoedIJhj+YEJZwfcpKya3aGETxJwfC1ndR76 tH4rUgSvssyZmYuM X-Received: by 10.28.32.83 with SMTP id g80mr1176356wmg.149.1504011880606; Tue, 29 Aug 2017 06:04:40 -0700 (PDT) Received: from bidouze.vm.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id u127sm1216338wmd.27.2017.08.29.06.04.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Aug 2017 06:04:39 -0700 (PDT) Date: Tue, 29 Aug 2017 15:04:30 +0200 From: =?iso-8859-1?Q?Ga=EBtan?= Rivet To: Jianfeng Tan 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 Message-ID: <20170829130430.GO8124@bidouze.vm.6wind.com> References: <1503654052-84730-1-git-send-email-jianfeng.tan@intel.com> <1503654052-84730-5-git-send-email-jianfeng.tan@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1503654052-84730-5-git-send-email-jianfeng.tan@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) 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 13:04:42 -0000 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. > 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? I did something somewhat similar for PCI: http://dpdk.org/ml/archives/dev/2017-August/073525.html 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 > +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 > -- Gaëtan Rivet 6WIND