[ovs-dev] [RFC 2/2] dpdk: reflect status and version in the database

Aaron Conole aconole at redhat.com
Thu Apr 5 21:22:54 UTC 2018


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.

Signed-off-by: Aaron Conole <aconole at redhat.com>
---
 lib/dpdk-stub.c            | 10 ++++++++++
 lib/dpdk.c                 | 13 +++++++++++++
 lib/dpdk.h                 |  3 ++-
 vswitchd/bridge.c          |  5 +++++
 vswitchd/vswitch.ovsschema | 11 ++++++++---
 vswitchd/vswitch.xml       | 11 +++++++++++
 6 files changed, 49 insertions(+), 4 deletions(-)

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 876ba01f1..ac8b61879 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,
@@ -490,6 +493,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 *
@@ -517,3 +521,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



More information about the dev mailing list