[ovs-dev,2/2] dpdk: reflect status and version in the database
diff mbox series

Message ID 20180503190801.20925-3-aconole@redhat.com
State Accepted
Delegated to: Ian Stokes
Headers show
Series
  • dpdk: refactor the initialization step
Related show

Commit Message

Aaron Conole May 3, 2018, 7:08 p.m. UTC
The normal way of retrieving the running DPDK status involves parsing
log files and issuing various incantations of ovs-vsctl and ovs-appctl
commands to determine whether the rte_eal_init successfully started.

This commit adds two new records to reflect the dpdk version, and
the dpdk initialization status.

To support this, the other_config:dpdk-init configuration block supports
the 'true' and 'try' keywords now, instead of just 'true'.

Signed-off-by: Aaron Conole <aconole@redhat.com>
---
 Documentation/faq/configuration.rst  |  8 +++++---
 Documentation/intro/install/dpdk.rst | 27 ++++++++++++++++++++++++---
 lib/dpdk-stub.c                      | 10 ++++++++++
 lib/dpdk.c                           | 21 +++++++++++++++++++--
 lib/dpdk.h                           |  3 ++-
 vswitchd/bridge.c                    |  5 +++++
 vswitchd/vswitch.ovsschema           | 11 ++++++++---
 vswitchd/vswitch.xml                 | 11 +++++++++++
 8 files changed, 84 insertions(+), 12 deletions(-)

Comments

Kevin Traynor May 17, 2018, 8:45 p.m. UTC | #1
On 05/03/2018 08:08 PM, Aaron Conole wrote:
> The normal way of retrieving the running DPDK status involves parsing
> log files and issuing various incantations of ovs-vsctl and ovs-appctl
> commands to determine whether the rte_eal_init successfully started.
> 
> This commit adds two new records to reflect the dpdk version, and
> the dpdk initialization status.
> 
> To support this, the other_config:dpdk-init configuration block supports
> the 'true' and 'try' keywords now, instead of just 'true'.
> 

LGTM
Acked-by: Kevin Traynor <ktraynor@redhat.com>

> Signed-off-by: Aaron Conole <aconole@redhat.com>
> ---
>  Documentation/faq/configuration.rst  |  8 +++++---
>  Documentation/intro/install/dpdk.rst | 27 ++++++++++++++++++++++++---
>  lib/dpdk-stub.c                      | 10 ++++++++++
>  lib/dpdk.c                           | 21 +++++++++++++++++++--
>  lib/dpdk.h                           |  3 ++-
>  vswitchd/bridge.c                    |  5 +++++
>  vswitchd/vswitch.ovsschema           | 11 ++++++++---
>  vswitchd/vswitch.xml                 | 11 +++++++++++
>  8 files changed, 84 insertions(+), 12 deletions(-)
> 
> diff --git a/Documentation/faq/configuration.rst b/Documentation/faq/configuration.rst
> index 1c93a55cc..0213c58dd 100644
> --- a/Documentation/faq/configuration.rst
> +++ b/Documentation/faq/configuration.rst
> @@ -102,9 +102,11 @@ Q: How do I configure a DPDK port as an access port?
>  
>      A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
>  
> -    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'.
> +    If your version is DPDK-enabled it may support the dpdk_version and
> +    dpdk_initialized keys in the configuration database.  Earlier versions
> +    of Open vSwitch only supported the other-config:dpdk-init key in the
> +    configuration in the database.  All versions 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 and valid dpdk-devargs must be specified. For example::
> diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
> index fea48908d..8fb0c4163 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst
> @@ -208,7 +208,8 @@ Open vSwitch should be started as described in :doc:`general` with the
>  exception of ovs-vswitchd, which requires some special configuration to enable
>  DPDK functionality. DPDK configuration arguments can be passed to ovs-vswitchd
>  via the ``other_config`` column of the ``Open_vSwitch`` table. At a minimum,
> -the ``dpdk-init`` option must be set to ``true``. For example::
> +the ``dpdk-init`` option must be set to either ``true`` or ``try``.
> +For example::
>  
>      $ export PATH=$PATH:/usr/local/share/openvswitch/scripts
>      $ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
> @@ -219,8 +220,12 @@ There are many other configuration options, the most important of which are
>  listed below. 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.
> +  Specifies whether OVS should initialize and support DPDK ports. This field
> +  can either be ``true`` or ``try``.
> +  A value of ``true`` will cause the ovs-vswitchd process to abort on
> +  initialization failure.
> +  A value of ``try`` will imply that the ovs-vswitchd process should
> +  continue running even if the EAL initialization fails.
>  
>  ``dpdk-lcore-mask``
>    Specifies the CPU cores on which dpdk lcore threads should be spawned and
> @@ -257,6 +262,22 @@ See the section ``Performance Tuning`` for important DPDK customizations.
>  Validating
>  ----------
>  
> +DPDK support can be confirmed by validating the ``dpdk_initialized`` boolean
> +value from the ovsdb.  A value of ``true`` means that the DPDK EAL
> +initialization succeeded::
> +
> +  $ ovs-vsctl get Open_vSwitch . dpdk_initialized
> +  true
> +
> +Additionally, the library version linked to ovs-vswitchd can be confirmed
> +with either the ovs-vswitchd logs, or by running either of the commands::
> +
> +  $ ovs-vswitchd --version
> +  ovs-vswitchd (Open vSwitch) 2.9.0
> +  DPDK 17.11.0
> +  $ ovs-vsctl get Open_vSwitch . dpdk_version
> +  "DPDK 17.11.0"
> +
>  At this point you can use ovs-vsctl to set up bridges and other Open vSwitch
>  features. Seeing as we've configured the DPDK datapath, we will use DPDK-type
>  ports. For example, to create a userspace bridge named ``br0`` and add two
> diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
> index 041cd0cbb..1df1c5848 100644
> --- a/lib/dpdk-stub.c
> +++ b/lib/dpdk-stub.c
> @@ -21,6 +21,7 @@
>  #include "smap.h"
>  #include "ovs-thread.h"
>  #include "openvswitch/vlog.h"
> +#include "vswitch-idl.h"
>  
>  VLOG_DEFINE_THIS_MODULE(dpdk);
>  
> @@ -59,3 +60,12 @@ void
>  print_dpdk_version(void)
>  {
>  }
> +
> +void
> +dpdk_status(const struct ovsrec_open_vswitch *cfg)
> +{
> +    if (cfg) {
> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, false);
> +        ovsrec_open_vswitch_set_dpdk_version(cfg, "none");
> +    }
> +}
> diff --git a/lib/dpdk.c b/lib/dpdk.c
> index 8bb686c43..09afd8cc2 100644
> --- a/lib/dpdk.c
> +++ b/lib/dpdk.c
> @@ -37,6 +37,7 @@
>  #include "openvswitch/dynamic-string.h"
>  #include "openvswitch/vlog.h"
>  #include "smap.h"
> +#include "vswitch-idl.h"
>  
>  VLOG_DEFINE_THIS_MODULE(dpdk);
>  
> @@ -44,6 +45,8 @@ static FILE *log_stream = NULL;       /* Stream for DPDK log redirection */
>  
>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
>  static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU support */
> +static bool dpdk_initialized = false; /* Indicates successful initialization
> +                                       * of DPDK. */
>  
>  static int
>  process_vhost_flags(char *flag, const char *default_val, int size,
> @@ -474,7 +477,11 @@ dpdk_init(const struct smap *ovs_other_config)
>          return;
>      }
>  
> -    if (smap_get_bool(ovs_other_config, "dpdk-init", false)) {
> +    const char *dpdk_init_val = smap_get_def(ovs_other_config, "dpdk-init",
> +                                             "false");
> +
> +    bool try_only = !strcmp(dpdk_init_val, "try");
> +    if (!strcmp(dpdk_init_val, "true") || try_only) {
>          static struct ovsthread_once once_enable = OVSTHREAD_ONCE_INITIALIZER;
>  
>          if (ovsthread_once_start(&once_enable)) {
> @@ -483,7 +490,7 @@ dpdk_init(const struct smap *ovs_other_config)
>              enabled = dpdk_init__(ovs_other_config);
>              if (enabled) {
>                  VLOG_INFO("DPDK Enabled - initialized");
> -            } else {
> +            } else if (!try_only) {
>                  ovs_abort(rte_errno, "Cannot init EAL");
>              }
>              ovsthread_once_done(&once_enable);
> @@ -493,6 +500,7 @@ dpdk_init(const struct smap *ovs_other_config)
>      } else {
>          VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init to enable");
>      }
> +    dpdk_initialized = enabled;
>  }
>  
>  const char *
> @@ -520,3 +528,12 @@ print_dpdk_version(void)
>  {
>      puts(rte_version());
>  }
> +
> +void
> +dpdk_status(const struct ovsrec_open_vswitch *cfg)
> +{
> +    if (cfg) {
> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, dpdk_initialized);
> +        ovsrec_open_vswitch_set_dpdk_version(cfg, rte_version());
> +    }
> +}
> diff --git a/lib/dpdk.h b/lib/dpdk.h
> index b04153591..efdaa637c 100644
> --- a/lib/dpdk.h
> +++ b/lib/dpdk.h
> @@ -33,11 +33,12 @@
>  #endif /* DPDK_NETDEV */
>  
>  struct smap;
> +struct ovsrec_open_vswitch;
>  
>  void dpdk_init(const struct smap *ovs_other_config);
>  void dpdk_set_lcore_id(unsigned cpu);
>  const char *dpdk_get_vhost_sock_dir(void);
>  bool dpdk_vhost_iommu_enabled(void);
>  void print_dpdk_version(void);
> -
> +void dpdk_status(const struct ovsrec_open_vswitch *);
>  #endif /* dpdk.h */
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index d90997e3a..ef04b015f 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -407,6 +407,8 @@ bridge_init(const char *remote)
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_version);
> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_initialized);
>  
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> @@ -2836,10 +2838,13 @@ run_status_update(void)
>           * previous one is not done. */
>          seq = seq_read(connectivity_seq_get());
>          if (seq != connectivity_seqno || status_txn_try_again) {
> +            const struct ovsrec_open_vswitch *cfg =
> +                ovsrec_open_vswitch_first(idl);
>              struct bridge *br;
>  
>              connectivity_seqno = seq;
>              status_txn = ovsdb_idl_txn_create(idl);
> +            dpdk_status(cfg);
>              HMAP_FOR_EACH (br, node, &all_bridges) {
>                  struct port *port;
>  
> diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema
> index 90e50b626..80f17e89b 100644
> --- a/vswitchd/vswitch.ovsschema
> +++ b/vswitchd/vswitch.ovsschema
> @@ -1,6 +1,6 @@
>  {"name": "Open_vSwitch",
> - "version": "7.15.1",
> - "cksum": "3682332033 23608",
> + "version": "7.16.0",
> + "cksum": "2403910601 23776",
>   "tables": {
>     "Open_vSwitch": {
>       "columns": {
> @@ -47,7 +47,12 @@
>                    "min": 0, "max": "unlimited"}},
>         "iface_types": {
>           "type": {"key": {"type": "string"},
> -                  "min": 0, "max": "unlimited"}}},
> +                  "min": 0, "max": "unlimited"}},
> +       "dpdk_initialized": {
> +         "type": "boolean"},
> +       "dpdk_version": {
> +         "type": {"key": {"type": "string"},
> +                  "min": 0, "max": 1}}},
>       "isRoot": true,
>       "maxRows": 1},
>     "Bridge": {
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 9c2a8263e..37c7f4f80 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -466,6 +466,11 @@
>          configuration changes.
>        </column>
>  
> +      <column name="dpdk_initialized">
> +        True if <ref column="other_config" key="dpdk-init"/> is set to
> +        true and the DPDK library is successfully initialized.
> +      </column>
> +
>        <group title="Statistics">
>          <p>
>            The <code>statistics</code> column contains key-value pairs that
> @@ -649,6 +654,12 @@
>          </p>
>        </column>
>  
> +      <column name="dpdk_version">
> +        <p>
> +          The version of the linked DPDK library.
> +        </p>
> +      </column>
> +
>      </group>
>  
>      <group title="Capabilities">
>
Stokes, Ian May 22, 2018, 2:45 p.m. UTC | #2
> The normal way of retrieving the running DPDK status involves parsing log
> files and issuing various incantations of ovs-vsctl and ovs-appctl
> commands to determine whether the rte_eal_init successfully started.
> 
> This commit adds two new records to reflect the dpdk version, and the dpdk
> initialization status.
> 
> To support this, the other_config:dpdk-init configuration block supports
> the 'true' and 'try' keywords now, instead of just 'true'.
> 

Look ok overall, minor comments below that can be addressed on commit to DPDK_MERGE if you agree with them.

> Signed-off-by: Aaron Conole <aconole@redhat.com>
> ---
>  Documentation/faq/configuration.rst  |  8 +++++---
> Documentation/intro/install/dpdk.rst | 27 ++++++++++++++++++++++++---
>  lib/dpdk-stub.c                      | 10 ++++++++++
>  lib/dpdk.c                           | 21 +++++++++++++++++++--
>  lib/dpdk.h                           |  3 ++-
>  vswitchd/bridge.c                    |  5 +++++
>  vswitchd/vswitch.ovsschema           | 11 ++++++++---
>  vswitchd/vswitch.xml                 | 11 +++++++++++
>  8 files changed, 84 insertions(+), 12 deletions(-)

We should mention this in news as it seems like a relevant enough change for users.

> 
> diff --git a/Documentation/faq/configuration.rst
> b/Documentation/faq/configuration.rst
> index 1c93a55cc..0213c58dd 100644
> --- a/Documentation/faq/configuration.rst
> +++ b/Documentation/faq/configuration.rst
> @@ -102,9 +102,11 @@ Q: How do I configure a DPDK port as an access port?
> 
>      A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
> 
> -    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'.
> +    If your version is DPDK-enabled it may support the dpdk_version and
> +    dpdk_initialized keys in the configuration database.  Earlier
> versions
> +    of Open vSwitch only supported the other-config:dpdk-init key in the
> +    configuration in the database.  All versions 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 and valid dpdk-devargs must be specified. For example::
> diff --git a/Documentation/intro/install/dpdk.rst
> b/Documentation/intro/install/dpdk.rst
> index fea48908d..8fb0c4163 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst
> @@ -208,7 +208,8 @@ Open vSwitch should be started as described in
> :doc:`general` with the  exception of ovs-vswitchd, which requires some
> special configuration to enable  DPDK functionality. DPDK configuration
> arguments can be passed to ovs-vswitchd  via the ``other_config`` column
> of the ``Open_vSwitch`` table. At a minimum, -the ``dpdk-init`` option
> must be set to ``true``. For example::
> +the ``dpdk-init`` option must be set to either ``true`` or ``try``.
> +For example::
> 
>      $ export PATH=$PATH:/usr/local/share/openvswitch/scripts
>      $ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
> @@ -219,8 +220,12 @@ There are many other configuration options, the most
> important of which are  listed below. 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.
> +  Specifies whether OVS should initialize and support DPDK ports. This
> + field  can either be ``true`` or ``try``.
> +  A value of ``true`` will cause the ovs-vswitchd process to abort on
> + initialization failure.
> +  A value of ``try`` will imply that the ovs-vswitchd process should
> + continue running even if the EAL initialization fails.
> 
.. versionchanged:: 2.10.0

We've started to track changes in behavior in the docs, I'm wondering if one should be added here but it may look strange as 2.10 above has not been released yet. It's that or we have a 'to-do' to track it when the release is out. Thoughts?

Ian
>  ``dpdk-lcore-mask``
>    Specifies the CPU cores on which dpdk lcore threads should be spawned
> and @@ -257,6 +262,22 @@ See the section ``Performance Tuning`` for
> important DPDK customizations.
>  Validating
>  ----------
> 
> +DPDK support can be confirmed by validating the ``dpdk_initialized``
> +boolean value from the ovsdb.  A value of ``true`` means that the DPDK
> +EAL initialization succeeded::
> +
> +  $ ovs-vsctl get Open_vSwitch . dpdk_initialized  true
> +
> +Additionally, the library version linked to ovs-vswitchd can be
> +confirmed with either the ovs-vswitchd logs, or by running either of the
> commands::
> +
> +  $ ovs-vswitchd --version
> +  ovs-vswitchd (Open vSwitch) 2.9.0
> +  DPDK 17.11.0
> +  $ ovs-vsctl get Open_vSwitch . dpdk_version  "DPDK 17.11.0"
> +
>  At this point you can use ovs-vsctl to set up bridges and other Open
> vSwitch  features. Seeing as we've configured the DPDK datapath, we will
> use DPDK-type  ports. For example, to create a userspace bridge named
> ``br0`` and add two diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c index
> 041cd0cbb..1df1c5848 100644
> --- a/lib/dpdk-stub.c
> +++ b/lib/dpdk-stub.c
> @@ -21,6 +21,7 @@
>  #include "smap.h"
>  #include "ovs-thread.h"
>  #include "openvswitch/vlog.h"
> +#include "vswitch-idl.h"
> 
>  VLOG_DEFINE_THIS_MODULE(dpdk);
> 
> @@ -59,3 +60,12 @@ void
>  print_dpdk_version(void)
>  {
>  }
> +
> +void
> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
> +    if (cfg) {
> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, false);
> +        ovsrec_open_vswitch_set_dpdk_version(cfg, "none");
> +    }
> +}
> diff --git a/lib/dpdk.c b/lib/dpdk.c
> index 8bb686c43..09afd8cc2 100644
> --- a/lib/dpdk.c
> +++ b/lib/dpdk.c
> @@ -37,6 +37,7 @@
>  #include "openvswitch/dynamic-string.h"
>  #include "openvswitch/vlog.h"
>  #include "smap.h"
> +#include "vswitch-idl.h"
> 
>  VLOG_DEFINE_THIS_MODULE(dpdk);
> 
> @@ -44,6 +45,8 @@ static FILE *log_stream = NULL;       /* Stream for DPDK
> log redirection */
> 
>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets
> */
>  static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU support
> */
> +static bool dpdk_initialized = false; /* Indicates successful
> initialization
> +                                       * of DPDK. */
> 
>  static int
>  process_vhost_flags(char *flag, const char *default_val, int size, @@ -
> 474,7 +477,11 @@ dpdk_init(const struct smap *ovs_other_config)
>          return;
>      }
> 
> -    if (smap_get_bool(ovs_other_config, "dpdk-init", false)) {
> +    const char *dpdk_init_val = smap_get_def(ovs_other_config, "dpdk-
> init",
> +                                             "false");
> +
> +    bool try_only = !strcmp(dpdk_init_val, "try");
> +    if (!strcmp(dpdk_init_val, "true") || try_only) {
>          static struct ovsthread_once once_enable =
> OVSTHREAD_ONCE_INITIALIZER;
> 
>          if (ovsthread_once_start(&once_enable)) { @@ -483,7 +490,7 @@
> dpdk_init(const struct smap *ovs_other_config)
>              enabled = dpdk_init__(ovs_other_config);
>              if (enabled) {
>                  VLOG_INFO("DPDK Enabled - initialized");
> -            } else {
> +            } else if (!try_only) {
>                  ovs_abort(rte_errno, "Cannot init EAL");
>              }
>              ovsthread_once_done(&once_enable);
> @@ -493,6 +500,7 @@ dpdk_init(const struct smap *ovs_other_config)
>      } else {
>          VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init to
> enable");
>      }
> +    dpdk_initialized = enabled;
>  }
> 
>  const char *
> @@ -520,3 +528,12 @@ print_dpdk_version(void)  {
>      puts(rte_version());
>  }
> +
> +void
> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
> +    if (cfg) {
> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, dpdk_initialized);
> +        ovsrec_open_vswitch_set_dpdk_version(cfg, rte_version());
> +    }
> +}
> diff --git a/lib/dpdk.h b/lib/dpdk.h
> index b04153591..efdaa637c 100644
> --- a/lib/dpdk.h
> +++ b/lib/dpdk.h
> @@ -33,11 +33,12 @@
>  #endif /* DPDK_NETDEV */
> 
>  struct smap;
> +struct ovsrec_open_vswitch;
> 
>  void dpdk_init(const struct smap *ovs_other_config);  void
> dpdk_set_lcore_id(unsigned cpu);  const char
> *dpdk_get_vhost_sock_dir(void);  bool dpdk_vhost_iommu_enabled(void);
> void print_dpdk_version(void);
> -
> +void dpdk_status(const struct ovsrec_open_vswitch *);
>  #endif /* dpdk.h */
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index
> d90997e3a..ef04b015f 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -407,6 +407,8 @@ bridge_init(const char *remote)
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_version);
> +    ovsdb_idl_omit_alert(idl,
> + &ovsrec_open_vswitch_col_dpdk_initialized);
> 
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> @@ -2836,10 +2838,13 @@ run_status_update(void)
>           * previous one is not done. */
>          seq = seq_read(connectivity_seq_get());
>          if (seq != connectivity_seqno || status_txn_try_again) {
> +            const struct ovsrec_open_vswitch *cfg =
> +                ovsrec_open_vswitch_first(idl);
>              struct bridge *br;
> 
>              connectivity_seqno = seq;
>              status_txn = ovsdb_idl_txn_create(idl);
> +            dpdk_status(cfg);
>              HMAP_FOR_EACH (br, node, &all_bridges) {
>                  struct port *port;
> 
> diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema index
> 90e50b626..80f17e89b 100644
> --- a/vswitchd/vswitch.ovsschema
> +++ b/vswitchd/vswitch.ovsschema
> @@ -1,6 +1,6 @@
>  {"name": "Open_vSwitch",
> - "version": "7.15.1",
> - "cksum": "3682332033 23608",
> + "version": "7.16.0",
> + "cksum": "2403910601 23776",
>   "tables": {
>     "Open_vSwitch": {
>       "columns": {
> @@ -47,7 +47,12 @@
>                    "min": 0, "max": "unlimited"}},
>         "iface_types": {
>           "type": {"key": {"type": "string"},
> -                  "min": 0, "max": "unlimited"}}},
> +                  "min": 0, "max": "unlimited"}},
> +       "dpdk_initialized": {
> +         "type": "boolean"},
> +       "dpdk_version": {
> +         "type": {"key": {"type": "string"},
> +                  "min": 0, "max": 1}}},
>       "isRoot": true,
>       "maxRows": 1},
>     "Bridge": {
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index
> 9c2a8263e..37c7f4f80 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -466,6 +466,11 @@
>          configuration changes.
>        </column>
> 
> +      <column name="dpdk_initialized">
> +        True if <ref column="other_config" key="dpdk-init"/> is set to
> +        true and the DPDK library is successfully initialized.
> +      </column>
> +
>        <group title="Statistics">
>          <p>
>            The <code>statistics</code> column contains key-value pairs
> that @@ -649,6 +654,12 @@
>          </p>
>        </column>
> 
> +      <column name="dpdk_version">
> +        <p>
> +          The version of the linked DPDK library.
> +        </p>
> +      </column>
> +
>      </group>
> 
>      <group title="Capabilities">
> --
> 2.14.3
Aaron Conole May 22, 2018, 3:23 p.m. UTC | #3
"Stokes, Ian" <ian.stokes@intel.com> writes:

>> The normal way of retrieving the running DPDK status involves parsing log
>> files and issuing various incantations of ovs-vsctl and ovs-appctl
>> commands to determine whether the rte_eal_init successfully started.
>> 
>> This commit adds two new records to reflect the dpdk version, and the dpdk
>> initialization status.
>> 
>> To support this, the other_config:dpdk-init configuration block supports
>> the 'true' and 'try' keywords now, instead of just 'true'.
>> 
>
> Look ok overall, minor comments below that can be addressed on commit
> to DPDK_MERGE if you agree with them.

Okay.  Whichever you prefer.

>> Signed-off-by: Aaron Conole <aconole@redhat.com>
>> ---
>>  Documentation/faq/configuration.rst  |  8 +++++---
>> Documentation/intro/install/dpdk.rst | 27 ++++++++++++++++++++++++---
>>  lib/dpdk-stub.c                      | 10 ++++++++++
>>  lib/dpdk.c                           | 21 +++++++++++++++++++--
>>  lib/dpdk.h                           |  3 ++-
>>  vswitchd/bridge.c                    |  5 +++++
>>  vswitchd/vswitch.ovsschema           | 11 ++++++++---
>>  vswitchd/vswitch.xml                 | 11 +++++++++++
>>  8 files changed, 84 insertions(+), 12 deletions(-)
>
> We should mention this in news as it seems like a relevant enough
> change for users.

Okay.  I can submit a follow up patch to this (if you want), or I can
submit a v2 of this patch if you want.  Let me know how you'd like it.

>> 
>> diff --git a/Documentation/faq/configuration.rst
>> b/Documentation/faq/configuration.rst
>> index 1c93a55cc..0213c58dd 100644
>> --- a/Documentation/faq/configuration.rst
>> +++ b/Documentation/faq/configuration.rst
>> @@ -102,9 +102,11 @@ Q: How do I configure a DPDK port as an access port?
>> 
>>      A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
>> 
>> -    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'.
>> +    If your version is DPDK-enabled it may support the dpdk_version and
>> +    dpdk_initialized keys in the configuration database.  Earlier
>> versions
>> +    of Open vSwitch only supported the other-config:dpdk-init key in the
>> +    configuration in the database.  All versions 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 and valid dpdk-devargs must be specified. For example::
>> diff --git a/Documentation/intro/install/dpdk.rst
>> b/Documentation/intro/install/dpdk.rst
>> index fea48908d..8fb0c4163 100644
>> --- a/Documentation/intro/install/dpdk.rst
>> +++ b/Documentation/intro/install/dpdk.rst
>> @@ -208,7 +208,8 @@ Open vSwitch should be started as described in
>> :doc:`general` with the  exception of ovs-vswitchd, which requires some
>> special configuration to enable  DPDK functionality. DPDK configuration
>> arguments can be passed to ovs-vswitchd  via the ``other_config`` column
>> of the ``Open_vSwitch`` table. At a minimum, -the ``dpdk-init`` option
>> must be set to ``true``. For example::
>> +the ``dpdk-init`` option must be set to either ``true`` or ``try``.
>> +For example::
>> 
>>      $ export PATH=$PATH:/usr/local/share/openvswitch/scripts
>>      $ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
>> @@ -219,8 +220,12 @@ There are many other configuration options, the most
>> important of which are  listed below. 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.
>> +  Specifies whether OVS should initialize and support DPDK ports. This
>> + field  can either be ``true`` or ``try``.
>> +  A value of ``true`` will cause the ovs-vswitchd process to abort on
>> + initialization failure.
>> +  A value of ``try`` will imply that the ovs-vswitchd process should
>> + continue running even if the EAL initialization fails.
>> 
> .. versionchanged:: 2.10.0
>
> We've started to track changes in behavior in the docs, I'm wondering
> if one should be added here but it may look strange as 2.10 above has
> not been released yet. It's that or we have a 'to-do' to track it when
> the release is out. Thoughts?

I guess it would make more sense to use just write the document ovs
version instead (rather than which version changed it).  And that can be
accomplished with @VERSION@ tag and using a .in file.

Anyway, I missed that particular part of the docs, but that's because I
think some of it was modified between this patch being submitted and
interrim changes.  I can rebase.

I don't think it makes sense to change this version number though (do
you?) since as you note the version hasn't been released.

> Ian
>>  ``dpdk-lcore-mask``
>>    Specifies the CPU cores on which dpdk lcore threads should be spawned
>> and @@ -257,6 +262,22 @@ See the section ``Performance Tuning`` for
>> important DPDK customizations.
>>  Validating
>>  ----------
>> 
>> +DPDK support can be confirmed by validating the ``dpdk_initialized``
>> +boolean value from the ovsdb.  A value of ``true`` means that the DPDK
>> +EAL initialization succeeded::
>> +
>> +  $ ovs-vsctl get Open_vSwitch . dpdk_initialized  true
>> +
>> +Additionally, the library version linked to ovs-vswitchd can be
>> +confirmed with either the ovs-vswitchd logs, or by running either of the
>> commands::
>> +
>> +  $ ovs-vswitchd --version
>> +  ovs-vswitchd (Open vSwitch) 2.9.0
>> +  DPDK 17.11.0
>> +  $ ovs-vsctl get Open_vSwitch . dpdk_version  "DPDK 17.11.0"
>> +
>>  At this point you can use ovs-vsctl to set up bridges and other Open
>> vSwitch  features. Seeing as we've configured the DPDK datapath, we will
>> use DPDK-type  ports. For example, to create a userspace bridge named
>> ``br0`` and add two diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c index
>> 041cd0cbb..1df1c5848 100644
>> --- a/lib/dpdk-stub.c
>> +++ b/lib/dpdk-stub.c
>> @@ -21,6 +21,7 @@
>>  #include "smap.h"
>>  #include "ovs-thread.h"
>>  #include "openvswitch/vlog.h"
>> +#include "vswitch-idl.h"
>> 
>>  VLOG_DEFINE_THIS_MODULE(dpdk);
>> 
>> @@ -59,3 +60,12 @@ void
>>  print_dpdk_version(void)
>>  {
>>  }
>> +
>> +void
>> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
>> +    if (cfg) {
>> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, false);
>> +        ovsrec_open_vswitch_set_dpdk_version(cfg, "none");
>> +    }
>> +}
>> diff --git a/lib/dpdk.c b/lib/dpdk.c
>> index 8bb686c43..09afd8cc2 100644
>> --- a/lib/dpdk.c
>> +++ b/lib/dpdk.c
>> @@ -37,6 +37,7 @@
>>  #include "openvswitch/dynamic-string.h"
>>  #include "openvswitch/vlog.h"
>>  #include "smap.h"
>> +#include "vswitch-idl.h"
>> 
>>  VLOG_DEFINE_THIS_MODULE(dpdk);
>> 
>> @@ -44,6 +45,8 @@ static FILE *log_stream = NULL;       /* Stream for DPDK
>> log redirection */
>> 
>>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets
>> */
>>  static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU support
>> */
>> +static bool dpdk_initialized = false; /* Indicates successful
>> initialization
>> +                                       * of DPDK. */
>> 
>>  static int
>>  process_vhost_flags(char *flag, const char *default_val, int size, @@ -
>> 474,7 +477,11 @@ dpdk_init(const struct smap *ovs_other_config)
>>          return;
>>      }
>> 
>> -    if (smap_get_bool(ovs_other_config, "dpdk-init", false)) {
>> +    const char *dpdk_init_val = smap_get_def(ovs_other_config, "dpdk-
>> init",
>> +                                             "false");
>> +
>> +    bool try_only = !strcmp(dpdk_init_val, "try");
>> +    if (!strcmp(dpdk_init_val, "true") || try_only) {
>>          static struct ovsthread_once once_enable =
>> OVSTHREAD_ONCE_INITIALIZER;
>> 
>>          if (ovsthread_once_start(&once_enable)) { @@ -483,7 +490,7 @@
>> dpdk_init(const struct smap *ovs_other_config)
>>              enabled = dpdk_init__(ovs_other_config);
>>              if (enabled) {
>>                  VLOG_INFO("DPDK Enabled - initialized");
>> -            } else {
>> +            } else if (!try_only) {
>>                  ovs_abort(rte_errno, "Cannot init EAL");
>>              }
>>              ovsthread_once_done(&once_enable);
>> @@ -493,6 +500,7 @@ dpdk_init(const struct smap *ovs_other_config)
>>      } else {
>>          VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init to
>> enable");
>>      }
>> +    dpdk_initialized = enabled;
>>  }
>> 
>>  const char *
>> @@ -520,3 +528,12 @@ print_dpdk_version(void)  {
>>      puts(rte_version());
>>  }
>> +
>> +void
>> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
>> +    if (cfg) {
>> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, dpdk_initialized);
>> +        ovsrec_open_vswitch_set_dpdk_version(cfg, rte_version());
>> +    }
>> +}
>> diff --git a/lib/dpdk.h b/lib/dpdk.h
>> index b04153591..efdaa637c 100644
>> --- a/lib/dpdk.h
>> +++ b/lib/dpdk.h
>> @@ -33,11 +33,12 @@
>>  #endif /* DPDK_NETDEV */
>> 
>>  struct smap;
>> +struct ovsrec_open_vswitch;
>> 
>>  void dpdk_init(const struct smap *ovs_other_config);  void
>> dpdk_set_lcore_id(unsigned cpu);  const char
>> *dpdk_get_vhost_sock_dir(void);  bool dpdk_vhost_iommu_enabled(void);
>> void print_dpdk_version(void);
>> -
>> +void dpdk_status(const struct ovsrec_open_vswitch *);
>>  #endif /* dpdk.h */
>> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index
>> d90997e3a..ef04b015f 100644
>> --- a/vswitchd/bridge.c
>> +++ b/vswitchd/bridge.c
>> @@ -407,6 +407,8 @@ bridge_init(const char *remote)
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
>>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
>> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_version);
>> +    ovsdb_idl_omit_alert(idl,
>> + &ovsrec_open_vswitch_col_dpdk_initialized);
>> 
>>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
>>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
>> @@ -2836,10 +2838,13 @@ run_status_update(void)
>>           * previous one is not done. */
>>          seq = seq_read(connectivity_seq_get());
>>          if (seq != connectivity_seqno || status_txn_try_again) {
>> +            const struct ovsrec_open_vswitch *cfg =
>> +                ovsrec_open_vswitch_first(idl);
>>              struct bridge *br;
>> 
>>              connectivity_seqno = seq;
>>              status_txn = ovsdb_idl_txn_create(idl);
>> +            dpdk_status(cfg);
>>              HMAP_FOR_EACH (br, node, &all_bridges) {
>>                  struct port *port;
>> 
>> diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema index
>> 90e50b626..80f17e89b 100644
>> --- a/vswitchd/vswitch.ovsschema
>> +++ b/vswitchd/vswitch.ovsschema
>> @@ -1,6 +1,6 @@
>>  {"name": "Open_vSwitch",
>> - "version": "7.15.1",
>> - "cksum": "3682332033 23608",
>> + "version": "7.16.0",
>> + "cksum": "2403910601 23776",
>>   "tables": {
>>     "Open_vSwitch": {
>>       "columns": {
>> @@ -47,7 +47,12 @@
>>                    "min": 0, "max": "unlimited"}},
>>         "iface_types": {
>>           "type": {"key": {"type": "string"},
>> -                  "min": 0, "max": "unlimited"}}},
>> +                  "min": 0, "max": "unlimited"}},
>> +       "dpdk_initialized": {
>> +         "type": "boolean"},
>> +       "dpdk_version": {
>> +         "type": {"key": {"type": "string"},
>> +                  "min": 0, "max": 1}}},
>>       "isRoot": true,
>>       "maxRows": 1},
>>     "Bridge": {
>> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index
>> 9c2a8263e..37c7f4f80 100644
>> --- a/vswitchd/vswitch.xml
>> +++ b/vswitchd/vswitch.xml
>> @@ -466,6 +466,11 @@
>>          configuration changes.
>>        </column>
>> 
>> +      <column name="dpdk_initialized">
>> +        True if <ref column="other_config" key="dpdk-init"/> is set to
>> +        true and the DPDK library is successfully initialized.
>> +      </column>
>> +
>>        <group title="Statistics">
>>          <p>
>>            The <code>statistics</code> column contains key-value pairs
>> that @@ -649,6 +654,12 @@
>>          </p>
>>        </column>
>> 
>> +      <column name="dpdk_version">
>> +        <p>
>> +          The version of the linked DPDK library.
>> +        </p>
>> +      </column>
>> +
>>      </group>
>> 
>>      <group title="Capabilities">
>> --
>> 2.14.3
Stokes, Ian May 22, 2018, 3:32 p.m. UTC | #4
> "Stokes, Ian" <ian.stokes@intel.com> writes:
> 
> >> The normal way of retrieving the running DPDK status involves parsing
> >> log files and issuing various incantations of ovs-vsctl and
> >> ovs-appctl commands to determine whether the rte_eal_init successfully
> started.
> >>
> >> This commit adds two new records to reflect the dpdk version, and the
> >> dpdk initialization status.
> >>
> >> To support this, the other_config:dpdk-init configuration block
> >> supports the 'true' and 'try' keywords now, instead of just 'true'.
> >>
> >
> > Look ok overall, minor comments below that can be addressed on commit
> > to DPDK_MERGE if you agree with them.
> 
> Okay.  Whichever you prefer.
> 
> >> Signed-off-by: Aaron Conole <aconole@redhat.com>
> >> ---
> >>  Documentation/faq/configuration.rst  |  8 +++++---
> >> Documentation/intro/install/dpdk.rst | 27 ++++++++++++++++++++++++---
> >>  lib/dpdk-stub.c                      | 10 ++++++++++
> >>  lib/dpdk.c                           | 21 +++++++++++++++++++--
> >>  lib/dpdk.h                           |  3 ++-
> >>  vswitchd/bridge.c                    |  5 +++++
> >>  vswitchd/vswitch.ovsschema           | 11 ++++++++---
> >>  vswitchd/vswitch.xml                 | 11 +++++++++++
> >>  8 files changed, 84 insertions(+), 12 deletions(-)
> >
> > We should mention this in news as it seems like a relevant enough
> > change for users.
> 
> Okay.  I can submit a follow up patch to this (if you want), or I can
> submit a v2 of this patch if you want.  Let me know how you'd like it.
> 

A v2 will be fine.

> >>
> >> diff --git a/Documentation/faq/configuration.rst
> >> b/Documentation/faq/configuration.rst
> >> index 1c93a55cc..0213c58dd 100644
> >> --- a/Documentation/faq/configuration.rst
> >> +++ b/Documentation/faq/configuration.rst
> >> @@ -102,9 +102,11 @@ Q: How do I configure a DPDK port as an access
> port?
> >>
> >>      A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
> >>
> >> -    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'.
> >> +    If your version is DPDK-enabled it may support the dpdk_version
> and
> >> +    dpdk_initialized keys in the configuration database.  Earlier
> >> versions
> >> +    of Open vSwitch only supported the other-config:dpdk-init key in
> the
> >> +    configuration in the database.  All versions 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 and valid dpdk-devargs must be specified. For example::
> >> diff --git a/Documentation/intro/install/dpdk.rst
> >> b/Documentation/intro/install/dpdk.rst
> >> index fea48908d..8fb0c4163 100644
> >> --- a/Documentation/intro/install/dpdk.rst
> >> +++ b/Documentation/intro/install/dpdk.rst
> >> @@ -208,7 +208,8 @@ Open vSwitch should be started as described in
> >> :doc:`general` with the  exception of ovs-vswitchd, which requires
> >> some special configuration to enable  DPDK functionality. DPDK
> >> configuration arguments can be passed to ovs-vswitchd  via the
> >> ``other_config`` column of the ``Open_vSwitch`` table. At a minimum,
> >> -the ``dpdk-init`` option must be set to ``true``. For example::
> >> +the ``dpdk-init`` option must be set to either ``true`` or ``try``.
> >> +For example::
> >>
> >>      $ export PATH=$PATH:/usr/local/share/openvswitch/scripts
> >>      $ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
> >> @@ -219,8 +220,12 @@ There are many other configuration options, the
> >> most important of which are  listed below. 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.
> >> +  Specifies whether OVS should initialize and support DPDK ports.
> >> + This field  can either be ``true`` or ``try``.
> >> +  A value of ``true`` will cause the ovs-vswitchd process to abort
> >> + on initialization failure.
> >> +  A value of ``try`` will imply that the ovs-vswitchd process should
> >> + continue running even if the EAL initialization fails.
> >>
> > .. versionchanged:: 2.10.0
> >
> > We've started to track changes in behavior in the docs, I'm wondering
> > if one should be added here but it may look strange as 2.10 above has
> > not been released yet. It's that or we have a 'to-do' to track it when
> > the release is out. Thoughts?
> 
> I guess it would make more sense to use just write the document ovs
> version instead (rather than which version changed it).  And that can be
> accomplished with @VERSION@ tag and using a .in file.
> 
> Anyway, I missed that particular part of the docs, but that's because I
> think some of it was modified between this patch being submitted and
> interrim changes.  I can rebase.
> 
> I don't think it makes sense to change this version number though (do
> you?) since as you note the version hasn't been released.
> 

I agree that 2.10 doesn't make sense. I've haven't used the @version and .in approach before but it sounds interesting. There is a minor nit to be fair though, I won't block on it as it is either.

Ian
> > Ian
> >>  ``dpdk-lcore-mask``
> >>    Specifies the CPU cores on which dpdk lcore threads should be
> >> spawned and @@ -257,6 +262,22 @@ See the section ``Performance
> >> Tuning`` for important DPDK customizations.
> >>  Validating
> >>  ----------
> >>
> >> +DPDK support can be confirmed by validating the ``dpdk_initialized``
> >> +boolean value from the ovsdb.  A value of ``true`` means that the
> >> +DPDK EAL initialization succeeded::
> >> +
> >> +  $ ovs-vsctl get Open_vSwitch . dpdk_initialized  true
> >> +
> >> +Additionally, the library version linked to ovs-vswitchd can be
> >> +confirmed with either the ovs-vswitchd logs, or by running either of
> >> +the
> >> commands::
> >> +
> >> +  $ ovs-vswitchd --version
> >> +  ovs-vswitchd (Open vSwitch) 2.9.0
> >> +  DPDK 17.11.0
> >> +  $ ovs-vsctl get Open_vSwitch . dpdk_version  "DPDK 17.11.0"
> >> +
> >>  At this point you can use ovs-vsctl to set up bridges and other Open
> >> vSwitch  features. Seeing as we've configured the DPDK datapath, we
> >> will use DPDK-type  ports. For example, to create a userspace bridge
> >> named ``br0`` and add two diff --git a/lib/dpdk-stub.c
> >> b/lib/dpdk-stub.c index
> >> 041cd0cbb..1df1c5848 100644
> >> --- a/lib/dpdk-stub.c
> >> +++ b/lib/dpdk-stub.c
> >> @@ -21,6 +21,7 @@
> >>  #include "smap.h"
> >>  #include "ovs-thread.h"
> >>  #include "openvswitch/vlog.h"
> >> +#include "vswitch-idl.h"
> >>
> >>  VLOG_DEFINE_THIS_MODULE(dpdk);
> >>
> >> @@ -59,3 +60,12 @@ void
> >>  print_dpdk_version(void)
> >>  {
> >>  }
> >> +
> >> +void
> >> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
> >> +    if (cfg) {
> >> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg, false);
> >> +        ovsrec_open_vswitch_set_dpdk_version(cfg, "none");
> >> +    }
> >> +}
> >> diff --git a/lib/dpdk.c b/lib/dpdk.c
> >> index 8bb686c43..09afd8cc2 100644
> >> --- a/lib/dpdk.c
> >> +++ b/lib/dpdk.c
> >> @@ -37,6 +37,7 @@
> >>  #include "openvswitch/dynamic-string.h"
> >>  #include "openvswitch/vlog.h"
> >>  #include "smap.h"
> >> +#include "vswitch-idl.h"
> >>
> >>  VLOG_DEFINE_THIS_MODULE(dpdk);
> >>
> >> @@ -44,6 +45,8 @@ static FILE *log_stream = NULL;       /* Stream for
> DPDK
> >> log redirection */
> >>
> >>  static char *vhost_sock_dir = NULL;   /* Location of vhost-user
> sockets
> >> */
> >>  static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU
> >> support */
> >> +static bool dpdk_initialized = false; /* Indicates successful
> >> initialization
> >> +                                       * of DPDK. */
> >>
> >>  static int
> >>  process_vhost_flags(char *flag, const char *default_val, int size,
> >> @@ -
> >> 474,7 +477,11 @@ dpdk_init(const struct smap *ovs_other_config)
> >>          return;
> >>      }
> >>
> >> -    if (smap_get_bool(ovs_other_config, "dpdk-init", false)) {
> >> +    const char *dpdk_init_val = smap_get_def(ovs_other_config,
> >> + "dpdk-
> >> init",
> >> +                                             "false");
> >> +
> >> +    bool try_only = !strcmp(dpdk_init_val, "try");
> >> +    if (!strcmp(dpdk_init_val, "true") || try_only) {
> >>          static struct ovsthread_once once_enable =
> >> OVSTHREAD_ONCE_INITIALIZER;
> >>
> >>          if (ovsthread_once_start(&once_enable)) { @@ -483,7 +490,7
> >> @@ dpdk_init(const struct smap *ovs_other_config)
> >>              enabled = dpdk_init__(ovs_other_config);
> >>              if (enabled) {
> >>                  VLOG_INFO("DPDK Enabled - initialized");
> >> -            } else {
> >> +            } else if (!try_only) {
> >>                  ovs_abort(rte_errno, "Cannot init EAL");
> >>              }
> >>              ovsthread_once_done(&once_enable);
> >> @@ -493,6 +500,7 @@ dpdk_init(const struct smap *ovs_other_config)
> >>      } else {
> >>          VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init
> >> to enable");
> >>      }
> >> +    dpdk_initialized = enabled;
> >>  }
> >>
> >>  const char *
> >> @@ -520,3 +528,12 @@ print_dpdk_version(void)  {
> >>      puts(rte_version());
> >>  }
> >> +
> >> +void
> >> +dpdk_status(const struct ovsrec_open_vswitch *cfg) {
> >> +    if (cfg) {
> >> +        ovsrec_open_vswitch_set_dpdk_initialized(cfg,
> dpdk_initialized);
> >> +        ovsrec_open_vswitch_set_dpdk_version(cfg, rte_version());
> >> +    }
> >> +}
> >> diff --git a/lib/dpdk.h b/lib/dpdk.h
> >> index b04153591..efdaa637c 100644
> >> --- a/lib/dpdk.h
> >> +++ b/lib/dpdk.h
> >> @@ -33,11 +33,12 @@
> >>  #endif /* DPDK_NETDEV */
> >>
> >>  struct smap;
> >> +struct ovsrec_open_vswitch;
> >>
> >>  void dpdk_init(const struct smap *ovs_other_config);  void
> >> dpdk_set_lcore_id(unsigned cpu);  const char
> >> *dpdk_get_vhost_sock_dir(void);  bool dpdk_vhost_iommu_enabled(void);
> >> void print_dpdk_version(void);
> >> -
> >> +void dpdk_status(const struct ovsrec_open_vswitch *);
> >>  #endif /* dpdk.h */
> >> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index
> >> d90997e3a..ef04b015f 100644
> >> --- a/vswitchd/bridge.c
> >> +++ b/vswitchd/bridge.c
> >> @@ -407,6 +407,8 @@ bridge_init(const char *remote)
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
> >>      ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
> >> +    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_version);
> >> +    ovsdb_idl_omit_alert(idl,
> >> + &ovsrec_open_vswitch_col_dpdk_initialized);
> >>
> >>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
> >>      ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
> >> @@ -2836,10 +2838,13 @@ run_status_update(void)
> >>           * previous one is not done. */
> >>          seq = seq_read(connectivity_seq_get());
> >>          if (seq != connectivity_seqno || status_txn_try_again) {
> >> +            const struct ovsrec_open_vswitch *cfg =
> >> +                ovsrec_open_vswitch_first(idl);
> >>              struct bridge *br;
> >>
> >>              connectivity_seqno = seq;
> >>              status_txn = ovsdb_idl_txn_create(idl);
> >> +            dpdk_status(cfg);
> >>              HMAP_FOR_EACH (br, node, &all_bridges) {
> >>                  struct port *port;
> >>
> >> diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema
> >> index 90e50b626..80f17e89b 100644
> >> --- a/vswitchd/vswitch.ovsschema
> >> +++ b/vswitchd/vswitch.ovsschema
> >> @@ -1,6 +1,6 @@
> >>  {"name": "Open_vSwitch",
> >> - "version": "7.15.1",
> >> - "cksum": "3682332033 23608",
> >> + "version": "7.16.0",
> >> + "cksum": "2403910601 23776",
> >>   "tables": {
> >>     "Open_vSwitch": {
> >>       "columns": {
> >> @@ -47,7 +47,12 @@
> >>                    "min": 0, "max": "unlimited"}},
> >>         "iface_types": {
> >>           "type": {"key": {"type": "string"},
> >> -                  "min": 0, "max": "unlimited"}}},
> >> +                  "min": 0, "max": "unlimited"}},
> >> +       "dpdk_initialized": {
> >> +         "type": "boolean"},
> >> +       "dpdk_version": {
> >> +         "type": {"key": {"type": "string"},
> >> +                  "min": 0, "max": 1}}},
> >>       "isRoot": true,
> >>       "maxRows": 1},
> >>     "Bridge": {
> >> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index
> >> 9c2a8263e..37c7f4f80 100644
> >> --- a/vswitchd/vswitch.xml
> >> +++ b/vswitchd/vswitch.xml
> >> @@ -466,6 +466,11 @@
> >>          configuration changes.
> >>        </column>
> >>
> >> +      <column name="dpdk_initialized">
> >> +        True if <ref column="other_config" key="dpdk-init"/> is set to
> >> +        true and the DPDK library is successfully initialized.
> >> +      </column>
> >> +
> >>        <group title="Statistics">
> >>          <p>
> >>            The <code>statistics</code> column contains key-value
> >> pairs that @@ -649,6 +654,12 @@
> >>          </p>
> >>        </column>
> >>
> >> +      <column name="dpdk_version">
> >> +        <p>
> >> +          The version of the linked DPDK library.
> >> +        </p>
> >> +      </column>
> >> +
> >>      </group>
> >>
> >>      <group title="Capabilities">
> >> --
> >> 2.14.3

Patch
diff mbox series

diff --git a/Documentation/faq/configuration.rst b/Documentation/faq/configuration.rst
index 1c93a55cc..0213c58dd 100644
--- a/Documentation/faq/configuration.rst
+++ b/Documentation/faq/configuration.rst
@@ -102,9 +102,11 @@  Q: How do I configure a DPDK port as an access port?
 
     A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
 
-    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'.
+    If your version is DPDK-enabled it may support the dpdk_version and
+    dpdk_initialized keys in the configuration database.  Earlier versions
+    of Open vSwitch only supported the other-config:dpdk-init key in the
+    configuration in the database.  All versions 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 and valid dpdk-devargs must be specified. For example::
diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
index fea48908d..8fb0c4163 100644
--- a/Documentation/intro/install/dpdk.rst
+++ b/Documentation/intro/install/dpdk.rst
@@ -208,7 +208,8 @@  Open vSwitch should be started as described in :doc:`general` with the
 exception of ovs-vswitchd, which requires some special configuration to enable
 DPDK functionality. DPDK configuration arguments can be passed to ovs-vswitchd
 via the ``other_config`` column of the ``Open_vSwitch`` table. At a minimum,
-the ``dpdk-init`` option must be set to ``true``. For example::
+the ``dpdk-init`` option must be set to either ``true`` or ``try``.
+For example::
 
     $ export PATH=$PATH:/usr/local/share/openvswitch/scripts
     $ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
@@ -219,8 +220,12 @@  There are many other configuration options, the most important of which are
 listed below. 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.
+  Specifies whether OVS should initialize and support DPDK ports. This field
+  can either be ``true`` or ``try``.
+  A value of ``true`` will cause the ovs-vswitchd process to abort on
+  initialization failure.
+  A value of ``try`` will imply that the ovs-vswitchd process should
+  continue running even if the EAL initialization fails.
 
 ``dpdk-lcore-mask``
   Specifies the CPU cores on which dpdk lcore threads should be spawned and
@@ -257,6 +262,22 @@  See the section ``Performance Tuning`` for important DPDK customizations.
 Validating
 ----------
 
+DPDK support can be confirmed by validating the ``dpdk_initialized`` boolean
+value from the ovsdb.  A value of ``true`` means that the DPDK EAL
+initialization succeeded::
+
+  $ ovs-vsctl get Open_vSwitch . dpdk_initialized
+  true
+
+Additionally, the library version linked to ovs-vswitchd can be confirmed
+with either the ovs-vswitchd logs, or by running either of the commands::
+
+  $ ovs-vswitchd --version
+  ovs-vswitchd (Open vSwitch) 2.9.0
+  DPDK 17.11.0
+  $ ovs-vsctl get Open_vSwitch . dpdk_version
+  "DPDK 17.11.0"
+
 At this point you can use ovs-vsctl to set up bridges and other Open vSwitch
 features. Seeing as we've configured the DPDK datapath, we will use DPDK-type
 ports. For example, to create a userspace bridge named ``br0`` and add two
diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
index 041cd0cbb..1df1c5848 100644
--- a/lib/dpdk-stub.c
+++ b/lib/dpdk-stub.c
@@ -21,6 +21,7 @@ 
 #include "smap.h"
 #include "ovs-thread.h"
 #include "openvswitch/vlog.h"
+#include "vswitch-idl.h"
 
 VLOG_DEFINE_THIS_MODULE(dpdk);
 
@@ -59,3 +60,12 @@  void
 print_dpdk_version(void)
 {
 }
+
+void
+dpdk_status(const struct ovsrec_open_vswitch *cfg)
+{
+    if (cfg) {
+        ovsrec_open_vswitch_set_dpdk_initialized(cfg, false);
+        ovsrec_open_vswitch_set_dpdk_version(cfg, "none");
+    }
+}
diff --git a/lib/dpdk.c b/lib/dpdk.c
index 8bb686c43..09afd8cc2 100644
--- a/lib/dpdk.c
+++ b/lib/dpdk.c
@@ -37,6 +37,7 @@ 
 #include "openvswitch/dynamic-string.h"
 #include "openvswitch/vlog.h"
 #include "smap.h"
+#include "vswitch-idl.h"
 
 VLOG_DEFINE_THIS_MODULE(dpdk);
 
@@ -44,6 +45,8 @@  static FILE *log_stream = NULL;       /* Stream for DPDK log redirection */
 
 static char *vhost_sock_dir = NULL;   /* Location of vhost-user sockets */
 static bool vhost_iommu_enabled = false; /* Status of vHost IOMMU support */
+static bool dpdk_initialized = false; /* Indicates successful initialization
+                                       * of DPDK. */
 
 static int
 process_vhost_flags(char *flag, const char *default_val, int size,
@@ -474,7 +477,11 @@  dpdk_init(const struct smap *ovs_other_config)
         return;
     }
 
-    if (smap_get_bool(ovs_other_config, "dpdk-init", false)) {
+    const char *dpdk_init_val = smap_get_def(ovs_other_config, "dpdk-init",
+                                             "false");
+
+    bool try_only = !strcmp(dpdk_init_val, "try");
+    if (!strcmp(dpdk_init_val, "true") || try_only) {
         static struct ovsthread_once once_enable = OVSTHREAD_ONCE_INITIALIZER;
 
         if (ovsthread_once_start(&once_enable)) {
@@ -483,7 +490,7 @@  dpdk_init(const struct smap *ovs_other_config)
             enabled = dpdk_init__(ovs_other_config);
             if (enabled) {
                 VLOG_INFO("DPDK Enabled - initialized");
-            } else {
+            } else if (!try_only) {
                 ovs_abort(rte_errno, "Cannot init EAL");
             }
             ovsthread_once_done(&once_enable);
@@ -493,6 +500,7 @@  dpdk_init(const struct smap *ovs_other_config)
     } else {
         VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init to enable");
     }
+    dpdk_initialized = enabled;
 }
 
 const char *
@@ -520,3 +528,12 @@  print_dpdk_version(void)
 {
     puts(rte_version());
 }
+
+void
+dpdk_status(const struct ovsrec_open_vswitch *cfg)
+{
+    if (cfg) {
+        ovsrec_open_vswitch_set_dpdk_initialized(cfg, dpdk_initialized);
+        ovsrec_open_vswitch_set_dpdk_version(cfg, rte_version());
+    }
+}
diff --git a/lib/dpdk.h b/lib/dpdk.h
index b04153591..efdaa637c 100644
--- a/lib/dpdk.h
+++ b/lib/dpdk.h
@@ -33,11 +33,12 @@ 
 #endif /* DPDK_NETDEV */
 
 struct smap;
+struct ovsrec_open_vswitch;
 
 void dpdk_init(const struct smap *ovs_other_config);
 void dpdk_set_lcore_id(unsigned cpu);
 const char *dpdk_get_vhost_sock_dir(void);
 bool dpdk_vhost_iommu_enabled(void);
 void print_dpdk_version(void);
-
+void dpdk_status(const struct ovsrec_open_vswitch *);
 #endif /* dpdk.h */
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index d90997e3a..ef04b015f 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -407,6 +407,8 @@  bridge_init(const char *remote)
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_db_version);
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_type);
     ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_system_version);
+    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_version);
+    ovsdb_idl_omit_alert(idl, &ovsrec_open_vswitch_col_dpdk_initialized);
 
     ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_id);
     ovsdb_idl_omit_alert(idl, &ovsrec_bridge_col_datapath_version);
@@ -2836,10 +2838,13 @@  run_status_update(void)
          * previous one is not done. */
         seq = seq_read(connectivity_seq_get());
         if (seq != connectivity_seqno || status_txn_try_again) {
+            const struct ovsrec_open_vswitch *cfg =
+                ovsrec_open_vswitch_first(idl);
             struct bridge *br;
 
             connectivity_seqno = seq;
             status_txn = ovsdb_idl_txn_create(idl);
+            dpdk_status(cfg);
             HMAP_FOR_EACH (br, node, &all_bridges) {
                 struct port *port;
 
diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema
index 90e50b626..80f17e89b 100644
--- a/vswitchd/vswitch.ovsschema
+++ b/vswitchd/vswitch.ovsschema
@@ -1,6 +1,6 @@ 
 {"name": "Open_vSwitch",
- "version": "7.15.1",
- "cksum": "3682332033 23608",
+ "version": "7.16.0",
+ "cksum": "2403910601 23776",
  "tables": {
    "Open_vSwitch": {
      "columns": {
@@ -47,7 +47,12 @@ 
                   "min": 0, "max": "unlimited"}},
        "iface_types": {
          "type": {"key": {"type": "string"},
-                  "min": 0, "max": "unlimited"}}},
+                  "min": 0, "max": "unlimited"}},
+       "dpdk_initialized": {
+         "type": "boolean"},
+       "dpdk_version": {
+         "type": {"key": {"type": "string"},
+                  "min": 0, "max": 1}}},
      "isRoot": true,
      "maxRows": 1},
    "Bridge": {
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 9c2a8263e..37c7f4f80 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -466,6 +466,11 @@ 
         configuration changes.
       </column>
 
+      <column name="dpdk_initialized">
+        True if <ref column="other_config" key="dpdk-init"/> is set to
+        true and the DPDK library is successfully initialized.
+      </column>
+
       <group title="Statistics">
         <p>
           The <code>statistics</code> column contains key-value pairs that
@@ -649,6 +654,12 @@ 
         </p>
       </column>
 
+      <column name="dpdk_version">
+        <p>
+          The version of the linked DPDK library.
+        </p>
+      </column>
+
     </group>
 
     <group title="Capabilities">