[ovs-dev] [PATCH v5 2/4] netdev-dpdk: Convert initialization from cmdline to db

Aaron Conole aconole at redhat.com
Wed Jan 20 18:55:50 UTC 2016


"Traynor, Kevin" <kevin.traynor at intel.com> writes:
>> -----Original Message-----
>> From: Aaron Conole [mailto:aconole at redhat.com]
>> Sent: Monday, January 18, 2016 8:29 PM
>> To: dev at openvswitch.org
>> Cc: Flavio Leitner; Traynor, Kevin; Panu Matilainen; Zoltan Kiss
>> Subject: [PATCH v5 2/4] netdev-dpdk: Convert initialization from cmdline to
>> db
>> 
>> Existing DPDK integration is provided by use of command line options which
>> must be split out and passed to librte in a special manner. However, this
>> forces any configuration to be passed by way of a special DPDK flag, and
>> interferes with ovs+dpdk packaging solutions.
>> 
>> This commit delays dpdk initialization until after the OVS database
>> connection is established, at which point ovs initializes librte. It
>> pulls all of the config data from the OVS database, and assembles a
>> new argv/argc pair to be passed along.
>> 
>> Signed-off-by: Aaron Conole <aconole at redhat.com>
>> ---
>> v2:
>> * Removed trailing whitespace
>> * Followed for() loop brace coding style
>> * Automatically enable DPDK when adding a DPDK enabled port
>> * Fixed an issue on startup when DPDK enabled ports are present
>> * Updated the documentation (including vswitch.xml) and documented all
>>   new parameters
>> * Dropped the premature initialization test
>> 
>> v3:
>> * Improved description language in INSTALL.DPDK.md
>> * Fixed the ovs-vsctl examples for DPDK
>> * Returned to the global dpdk-init (bullet 3 from v2)
>> * Fixed a build error when compiling without dpdk support enabled
>> * converted to xstrdup, for consistency after rebasing
>> 
>> v4:
>> * No change
>> 
>> v5:
>> * Adjust the ovs-dev script to account for the new dpdk configuration
>> * Update the ovs-vswitchd.8.in pointing to INSTALL.DPDK.md
>
> Hi Aaron. I've only one real comment below on this patch. The other patches
> look fine to me but I didn't get a chance to test.

I think I owe you a beer for all your hard work.
Thanks for the reviews, Kevin!

> thanks,
> Kevin.
>
>> 
>>  FAQ.md                     |   6 +-
>>  INSTALL.DPDK.md            |  81 ++++++++++++++-----
>>  lib/netdev-dpdk.c          | 191 ++++++++++++++++++++++++++++++++-----------
>> --
>>  lib/netdev-dpdk.h          |  22 ++++--
>>  utilities/ovs-dev.py       |  11 ++-
>>  vswitchd/bridge.c          |   3 +
>>  vswitchd/ovs-vswitchd.8.in |   5 +-
>>  vswitchd/ovs-vswitchd.c    |  25 +-----
>>  vswitchd/vswitch.xml       | 118 +++++++++++++++++++++++++++-
>>  9 files changed, 346 insertions(+), 116 deletions(-)
>> 
>> diff --git a/FAQ.md b/FAQ.md
>> index 29b2e19..c233118 100644
>> --- a/FAQ.md
>> +++ b/FAQ.md
>> @@ -431,9 +431,9 @@ A: Yes.  How you configure it depends on what you mean by
>> "promiscuous
>> 
>>  A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
>> 
>> -   If your version is DPDK-enabled it will support the --dpdk
>> -   argument on the command line and will display lines with
>> -   "EAL:..." during startup when --dpdk is supplied.
>> +   If your version is DPDK-enabled it will support the other_config:dpdk-
>> init
>> +   configuration in the database and will display lines with
>> +   "EAL:..." during startup when other_config:dpdk-init is set to 'true'.
>> 
>>     Secondly, when adding a DPDK port, unlike a system port, the
>>     type for the interface must be specified. For example;
>> diff --git a/INSTALL.DPDK.md b/INSTALL.DPDK.md
>> index 96b686c..46bd1a8 100644
>> --- a/INSTALL.DPDK.md
>> +++ b/INSTALL.DPDK.md
>> @@ -143,22 +143,64 @@ Using the DPDK with ovs-vswitchd:
>> 
>>  5. Start vswitchd:
>> 
>> -   DPDK configuration arguments can be passed to vswitchd via `--dpdk`
>> -   argument. This needs to be first argument passed to vswitchd process.
>> -   dpdk arg -c is ignored by ovs-dpdk, but it is a required parameter
>> -   for dpdk initialization.
>> +   DPDK configuration arguments can be passed to vswitchd via Open_vSwitch
>> +   other_config database. The recognized configuration options are listed.
>> +   Defaults will be provided for all values not explicitly set.
>> +
>> +   * dpdk-init
>> +   Specifies whether OVS should initialize and support DPDK ports. This is
>> +   a boolean, and defaults to false.
>
> I'm assuming you've renamed from 'dpdk' to 'dpdk-init', so it could be =false
> and there is still the possibility of adding a lazy init at a later time?
>
> If so, I think it is good idea because we wouldn't want a situation in the
> future where 'dpdk'=false but an introduced lazy init means DPDK is used.

Yes, that's _exactly_ the intent :D Seems clearer than dpdk=lazy (which
might imply the wrong thing...)

>> +
>> +   * dpdk-lcore-mask
>> +   Specifies the CPU cores on which dpdk lcore threads should be spawned.
>> +   The DPDK lcore threads are used for DPDK library tasks, such as
>> +   library internal message processing, logging, etc. Value should be in
>> +   the form of a hex string (so '0x123') similar to the 'taskset' mask
>> +   input.
>> +   If not specified, the value will be determined by choosing the lowest
>> +   CPU core from initial cpu affinity list. Otherwise, the value will be
>> +   passed directly to the DPDK library.
>> +   For performance reasons, it is best to set this to a single core on
>> +   the system, rather than allow lcore threads to float.
>> +
>> +   * dpdk-mem-channels
>> +   This sets the number of memory spread channels per CPU socket. It is
>> purely
>> +   an optimization flag.
>> +
>> +   * dpdk-alloc-mem
>> +   This sets the total memory to preallocate from hugepages regardless of
>> +   processor socket. It is recommended to use dpdk-socket-mem instead.
>> +
>> +   * dpdk-socket-mem
>> +   Comma separated list of memory to pre-allocate from hugepages on specific
>> +   sockets.
>> +
>> +   * dpdk-hugepage-dir
>> +   Directory where hugetlbfs is mounted
>> +
>> +   * cuse-dev-name
>> +   Option to set the vhost_cuse character device name.
>> +
>> +   * vhost-sock-dir
>> +   Option to set the path to the vhost_user unix socket files.
>> +
>> +   NOTE: Changing any of these options requires restarting the ovs-vswitchd
>> +   application.
>> +
>> +   Open vSwitch can be started as normal. DPDK will not be initialized until
>> +   the first DPDK-enabled port is added to the bridge.
>
> lazy init has been removed, so this is not true anymore.

D'oh!

>> 
>>     ```
>>     export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
>> -   ovs-vswitchd --dpdk -c 0x1 -n 4 -- unix:$DB_SOCK --pidfile --detach
>> +   ovs-vswitchd unix:$DB_SOCK --pidfile --detach
>>     ```
>> 
>>     If allocated more than one GB hugepage (as for IVSHMEM), set amount and
>>     use NUMA node 0 memory:
>> 
>>     ```
>> -   ovs-vswitchd --dpdk -c 0x1 -n 4 --socket-mem 1024,0 \
>> -   -- unix:$DB_SOCK --pidfile --detach
>> +   ovs-vsctl --no-wait set Open_vSwitch .
>> other_config:dpdk_socket_mem="1024,0"
>> +   ovs-vswitchd unix:$DB_SOCK --pidfile --detach
>>     ```
>> 
>>  6. Add bridge & ports
>> @@ -521,11 +563,13 @@ have arbitrary names.
>>       `/usr/local/var/run/openvswitch/vhost-user-1`, which you must provide
>>       to your VM on the QEMU command line. More instructions on this can be
>>       found in the next section "DPDK vhost-user VM configuration"
>> -     Note: If you wish for the vhost-user sockets to be created in a
>> -     directory other than `/usr/local/var/run/openvswitch`, you may specify
>> -     another location on the ovs-vswitchd command line like so:
>> 
>> -      `./vswitchd/ovs-vswitchd --dpdk -vhost_sock_dir /my-dir -c 0x1 ...`
>> +  - If you wish for the vhost-user sockets to be created in a directory
>> other
>> +    than `/usr/local/var/run/openvswitch`, you may specify another location
>> +    in the ovsdb like:
>> +
>> +    `./vswitchd/ovs-vsctl --no-wait \
>> +        set Open_vSwitch . other_config:vhost-sock-dir=path`
>> 
>>  DPDK vhost-user VM configuration:
>>  ---------------------------------
>> @@ -638,14 +682,13 @@ DPDK vhost-cuse VM configuration:
>> 
>>  1. This step is only needed if using an alternative character device.
>> 
>> -   The new character device filename must be specified on the vswitchd
>> -   commandline:
>> +   The new character device filename must be specified in the ovsdb:
>> 
>> -        `./vswitchd/ovs-vswitchd --dpdk --cuse_dev_name my-vhost-net -c 0x1
>> ...`
>> +   `./utilities/ovs-vsctl --no-wait set Open_vSwitch . \
>> +                          other_config:cuse-dev-name=my-vhost-net`
>> 
>> -   Note that the `--cuse_dev_name` argument and associated string must be
>> the first
>> -   arguments after `--dpdk` and come before the EAL arguments. In the
>> example
>> -   above, the character device to be used will be `/dev/my-vhost-net`.
>> +   In the example above, the character device to be used will be
>> +   `/dev/my-vhost-net`.
>> 
>>  2. This step is only needed if reusing the standard character device. It
>> will
>>     conflict with the kernel vhost character device so the user must first
>> @@ -758,8 +801,8 @@ steps.
>> 
>>          <my-vhost-device> refers to "vhost-net" if using the `/dev/vhost-
>> net`
>>          device. If you have specificed a different name on the ovs-vswitchd
>> -        commandline using the "--cuse_dev_name" parameter, please specify
>> that
>> -        filename instead.
>> +        database using the "other_config:cuse-dev-name" parameter, please
>> +        specify that filename instead.
>> 
>>       2. Disable SELinux or set to permissive mode
>> 
>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>> index 78f013d..b7bb3eb 100644
>> --- a/lib/netdev-dpdk.c
>> +++ b/lib/netdev-dpdk.c
>> @@ -29,6 +29,7 @@
>>  #include <stdio.h>
>>  #include <sys/types.h>
>>  #include <sys/stat.h>
>> +#include <getopt.h>
>> 
>>  #include "dirs.h"
>>  #include "dp-packet.h"
>> @@ -49,6 +50,8 @@
>>  #include "timeval.h"
>>  #include "unixctl.h"
>>  #include "openvswitch/vlog.h"
>> +#include "smap.h"
>> +#include "vswitch-idl.h"
>> 
>>  #include "rte_config.h"
>>  #include "rte_mbuf.h"
>> @@ -551,8 +554,15 @@ netdev_dpdk_cast(const struct netdev *netdev)
>>  static struct netdev *
>>  netdev_dpdk_alloc(void)
>>  {
>> -    struct netdev_dpdk *netdev = dpdk_rte_mzalloc(sizeof *netdev);
>> -    return &netdev->up;
>> +    struct netdev_dpdk *netdev;
>> +
>> +    if (!rte_eal_init_ret) { /* Only after successful initialization */
>> +        netdev = dpdk_rte_mzalloc(sizeof *netdev);
>> +        if (netdev) {
>> +            return &netdev->up;
>> +        }
>> +    }
>> +    return NULL;
>>  }
>> 
>>  static void
>> @@ -670,6 +680,10 @@ netdev_dpdk_vhost_cuse_construct(struct netdev *netdev_)
>>      struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
>>      int err;
>> 
>> +    if (rte_eal_init_ret) {
>> +        return rte_eal_init_ret;
>> +    }
>> +
>>      ovs_mutex_lock(&dpdk_mutex);
>>      strncpy(netdev->vhost_id, netdev->up.name, sizeof(netdev->vhost_id));
>>      err = vhost_construct_helper(netdev_);
>> @@ -683,6 +697,10 @@ netdev_dpdk_vhost_user_construct(struct netdev *netdev_)
>>      struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
>>      int err;
>> 
>> +    if (rte_eal_init_ret) {
>> +        return rte_eal_init_ret;
>> +    }
>> +
>>      ovs_mutex_lock(&dpdk_mutex);
>>      /* Take the name of the vhost-user port and append it to the location
>> where
>>       * the socket is to be created, then register the socket.
>> @@ -1776,6 +1794,8 @@ new_device(struct virtio_net *dev)
>>      struct netdev_dpdk *netdev;
>>      bool exists = false;
>> 
>> +
>> +
>
> added whitespace
>
> <snip>

Weird, my git hook didn't catch this. Okay, I'll fix it.

>> diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
>> index 646d3e2..cde8956 100644
>> --- a/lib/netdev-dpdk.h
>> +++ b/lib/netdev-dpdk.h
>> @@ -2,6 +2,9 @@
>>  #define NETDEV_DPDK_H
>> 
>>  #include <config.h>
>> +#include "smap.h"
>> +#include "ovs-thread.h"
>> +#include "vswitch-idl.h"
>> 
>>  struct dp_packet;
>> 
>> @@ -22,7 +25,9 @@ struct dp_packet;
>> 
>>  #define NON_PMD_CORE_ID LCORE_ID_ANY
>> 
>> -int dpdk_init(int argc, char **argv);
>> +struct ovsrec_open_vswitch;
>> +
>> +void dpdk_init(const struct ovsrec_open_vswitch *ovs_cfg);
>>  void netdev_dpdk_register(void);
>>  void free_dpdk_buf(struct dp_packet *);
>>  int pmd_thread_setaffinity_cpu(unsigned cpu);
>> @@ -30,16 +35,19 @@ int pmd_thread_setaffinity_cpu(unsigned cpu);
>>  #else
>> 
>>  #define NON_PMD_CORE_ID UINT32_MAX
>> -
>>  #include "util.h"
>> 
>> -static inline int
>> -dpdk_init(int argc, char **argv)
>> +static inline void
>> +dpdk_init(const struct ovsrec_open_vswitch *ovs_cfg)
>>  {
>> -    if (argc >= 2 && !strcmp(argv[1], "--dpdk")) {
>> -        ovs_fatal(0, "DPDK support not built into this copy of Open
>> vSwitch.");
>> +    static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
>> +
>> +    if (ovs_cfg && ovsthread_once_start(&once)) {
>> +        if(smap_get_bool(&ovs_cfg->other_config, "dpdk", false)) {
>> +            ovs_fatal(0, "DPDK not supported in this copy of Open
>> vSwitch.");
>
> The db entry has changed from 'dpdk' to 'dpdk-init' in this patchset

D'oh! I knew I must've missed something.

>> +        }
>> +        ovsthread_once_done(&once);
>>      }
>> -    return 0;
>>  }
>> 



More information about the dev mailing list