@@ -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;
}
@@ -30,6 +30,7 @@
int32_t action_autoval_init(struct odp_execute_action_impl *self);
VLOG_DEFINE_THIS_MODULE(odp_execute_private);
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+static uint32_t active_action_impl_index;
static struct odp_execute_action_impl action_impls[] = {
[ACTION_IMPL_SCALAR] = {
@@ -57,6 +58,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)
{
@@ -865,10 +865,22 @@ odp_execute_init(void)
static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
if (ovsthread_once_start(&once)) {
odp_execute_action_init();
+ odp_actions_impl_set("scalar");
ovsthread_once_done(&once);
}
}
+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
@@ -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);
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> --- v2: - Refactor to fix build warnings --- lib/dpif-netdev.c | 39 +++++++++++++++++++++++++++++++++++++++ lib/odp-execute-private.c | 31 +++++++++++++++++++++++++++++++ lib/odp-execute.c | 12 ++++++++++++ lib/odp-execute.h | 5 +++++ 4 files changed, 87 insertions(+)