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 <jianfeng....@intel.com>
> ---
>  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,
> +                                     &params->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,
> +                                     &params->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,
> +                                     &params->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 <rte_vdev.h>
> +#include <inttypes.h>
> +
> +#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 <sys/queue.h>
> +#include <rte_dev.h>
> +#include <rte_devargs.h>
> +
> +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 <string.h>
> +#include <inttypes.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdint.h>
> +#include <stdbool.h>
> +#include <sys/queue.h>
> +
> +#include <rte_eal.h>
> +#include <rte_dev.h>
> +#include <rte_bus.h>
> +#include <rte_vdev.h>
> +#include <rte_common.h>
> +#include <rte_devargs.h>
> +#include <rte_memory.h>
> +#include <rte_errno.h>
> +
> +/* 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,
> -                                     &params->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,
> -                                     &params->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,
> -                                     &params->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 <rte_vdev.h>
> -#include <inttypes.h>
> -
> -#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 <string.h>
> -#include <inttypes.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <stdint.h>
> -#include <stdbool.h>
> -#include <sys/queue.h>
> -
> -#include <rte_eal.h>
> -#include <rte_dev.h>
> -#include <rte_bus.h>
> -#include <rte_vdev.h>
> -#include <rte_common.h>
> -#include <rte_devargs.h>
> -#include <rte_memory.h>
> -#include <rte_errno.h>
> -
> -/* 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 <sys/queue.h>
> -#include <rte_dev.h>
> -#include <rte_devargs.h>
> -
> -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

Reply via email to