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 <ktray...@redhat.com>

> Signed-off-by: Aaron Conole <acon...@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">
> 

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to