diff mbox series

[ovs-dev,v1,4/8] odp-execute: Add command to switch action implementation.

Message ID 20211202104118.4159929-5-emma.finn@intel.com
State Superseded
Headers show
Series Actions Infrastructure + Optimizations | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning

Commit Message

Emma Finn Dec. 2, 2021, 10:41 a.m. UTC
This commit adds a new command to allow the user to switch
the active action implementation at runtime. A probe function
is executed before switching the implementation, to ensure
the CPU is capable of running the ISA required.

Usage:
  $ ovs-appctl dpif-netdev/action-impl-set scalar

This commit also adds a new command to retrieve the list of available
action implementations. This can be used by to check what implementations
of actions are available and what implementation is active during runtime.

Usage:
   $ ovs-appctl dpif-netdev/action-impl-get

Signed-off-by: Emma Finn <emma.finn@intel.com>
---
 lib/dpif-netdev.c         | 39 +++++++++++++++++++++++++++++++++++++++
 lib/odp-execute-private.c | 30 ++++++++++++++++++++++++++++++
 lib/odp-execute.c         | 11 +++++++++++
 lib/odp-execute.h         |  5 +++++
 4 files changed, 85 insertions(+)

Comments

0-day Robot Dec. 2, 2021, 11:04 a.m. UTC | #1
Bleep bloop.  Greetings Emma Finn, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


Patch skipped due to previous failure.

Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
diff mbox series

Patch

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 277e0d6c3..9684bbbc4 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -59,6 +59,7 @@ 
 #include "netdev-vport.h"
 #include "netlink.h"
 #include "odp-execute.h"
+#include "odp-execute-private.h"
 #include "odp-util.h"
 #include "openvswitch/dynamic-string.h"
 #include "openvswitch/list.h"
@@ -1310,6 +1311,38 @@  error:
     ds_destroy(&reply);
 }
 
+static void
+action_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+    struct ds reply = DS_EMPTY_INITIALIZER;
+
+    int32_t err = odp_actions_impl_set(argv[1]);
+    if (err) {
+        ds_put_format(&reply, "action implementation %s not found.\n",
+                      argv[1]);
+        const char *reply_str = ds_cstr(&reply);
+        unixctl_command_reply_error(conn, reply_str);
+        VLOG_ERR("%s", reply_str);
+        ds_destroy(&reply);
+        return;
+    }
+
+    ds_put_format(&reply, "action implementation set to %s.\n", argv[1]);
+    unixctl_command_reply(conn, ds_cstr(&reply));
+    ds_destroy(&reply);
+}
+
+static void
+action_impl_get(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+    struct ds reply = DS_EMPTY_INITIALIZER;
+    odp_execute_action_get(&reply);
+    unixctl_command_reply(conn, ds_cstr(&reply));
+    ds_destroy(&reply);
+}
+
 static void
 dpif_netdev_pmd_rebalance(struct unixctl_conn *conn, int argc,
                           const char *argv[], void *aux OVS_UNUSED)
@@ -1547,6 +1580,12 @@  dpif_netdev_init(void)
     unixctl_command_register("dpif-netdev/miniflow-parser-get", "",
                              0, 0, dpif_miniflow_extract_impl_get,
                              NULL);
+    unixctl_command_register("dpif-netdev/action-impl-set", "name",
+                             1, 1, action_impl_set,
+                             NULL);
+    unixctl_command_register("dpif-netdev/action-impl-get", "",
+                             0, 0, action_impl_get,
+                             NULL);
     return 0;
 }
 
diff --git a/lib/odp-execute-private.c b/lib/odp-execute-private.c
index d5631ba0a..3d1176cdd 100644
--- a/lib/odp-execute-private.c
+++ b/lib/odp-execute-private.c
@@ -59,6 +59,36 @@  action_impl_copy_funcs(struct odp_execute_action_impl *to,
     }
 }
 
+void
+odp_execute_action_get(struct ds *string)
+{
+    uint32_t i;
+
+    ds_put_cstr(string, "Available Actions implementations:\n");
+    for (i = 0; i < ACTION_IMPL_MAX; i++) {
+        ds_put_format(string, "  %s (available: %s, active: %s)\n",
+                      action_impls[i].name,
+                      action_impls[i].available ? "True" : "False",
+                      i == active_action_impl_index ? "True" : "False");
+    }
+}
+
+int32_t
+odp_execute_action_set(const char *name,
+                       struct odp_execute_action_impl *active)
+{
+    uint32_t i;
+    for (i = 0; i < ACTION_IMPL_MAX; i++) {
+        /* string compare, and set ptrs *atomically*. */
+        if (strcmp(action_impls[i].name, name) == 0) {
+            action_impl_copy_funcs(active, &action_impls[i]);
+            active_action_impl_index = i;
+            return 0;
+        }
+    }
+    return -1;
+}
+
 void
 odp_execute_action_init(void)
 {
diff --git a/lib/odp-execute.c b/lib/odp-execute.c
index a447b4391..ab051aecc 100644
--- a/lib/odp-execute.c
+++ b/lib/odp-execute.c
@@ -870,6 +870,17 @@  odp_execute_init(void)
     }
 }
 
+int32_t
+odp_actions_impl_set(const char *name)
+{
+
+    int err = odp_execute_action_set(name, &actions_active_impl);
+    if (err) {
+        VLOG_ERR("error %d from action set to %s\n", err, name);
+        return -1;
+    }
+    return 0;
+}
 
 /* Executes all of the 'actions_len' bytes of datapath actions in 'actions' on
  * the packets in 'batch'.  If 'steal' is true, possibly modifies and
diff --git a/lib/odp-execute.h b/lib/odp-execute.h
index c4f5303e7..4f4cdc4ac 100644
--- a/lib/odp-execute.h
+++ b/lib/odp-execute.h
@@ -23,6 +23,7 @@ 
 #include <stdint.h>
 #include "openvswitch/types.h"
 
+struct ds;
 struct nlattr;
 struct dp_packet;
 struct pkt_metadata;
@@ -32,6 +33,10 @@  struct dp_packet_batch;
 /* Called once at initialization time. */
 void odp_execute_init(void);
 
+/* Runtime update get/set functionality. */
+int32_t odp_actions_impl_get(struct ds *name);
+int32_t odp_actions_impl_set(const char *name);
+
 typedef void (*odp_execute_cb)(void *dp, struct dp_packet_batch *batch,
                                const struct nlattr *action, bool should_steal);