On 14 Jun 2022, at 13:57, Emma Finn wrote:

> 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-show
>
> Added separate test-case for ovs-actions show/set commands:
> 1023: PMD - ovs-actions configuration
>
> Signed-off-by: Emma Finn <[email protected]>
> Co-authored-by: Kumar Amber <[email protected]>
> Signed-off-by: Kumar Amber <[email protected]>
> Acked-by: Harry van Haaren <[email protected]>
> ---
>  NEWS                        |  3 +++
>  lib/dpif-netdev-unixctl.man |  8 ++++++++
>  lib/dpif-netdev.c           | 38 +++++++++++++++++++++++++++++++++++++
>  lib/odp-execute-private.c   | 12 ++++++++++++
>  lib/odp-execute-private.h   |  3 +++
>  lib/odp-execute.h           |  2 ++
>  tests/pmd.at                | 30 +++++++++++++++++++++++++++++
>  7 files changed, 96 insertions(+)
>
> diff --git a/NEWS b/NEWS
> index 3a25f3035..90ceabd63 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -35,6 +35,9 @@ Post-v2.17.0
>     - Userspace datapath:
>       * Add actions auto-validator function to compare different actions
>         implementations against default implementation.
> +     * Add command line option to switch between different actions
> +       implementations available at run time.
> +
>
>
>  v2.17.0 - 17 Feb 2022
> diff --git a/lib/dpif-netdev-unixctl.man b/lib/dpif-netdev-unixctl.man
> index 8cd847416..81ef7d856 100644
> --- a/lib/dpif-netdev-unixctl.man
> +++ b/lib/dpif-netdev-unixctl.man
> @@ -262,3 +262,11 @@ PMDs in the case where no value is specified.  By 
> default "scalar" is used.
>  \fIstudy_cnt\fR defaults to 128 and indicates the number of packets that the
>  "study" miniflow implementation must parse before choosing an optimal
>  implementation.
> +
> +.IP "\fBdpif-netdev/action-impl-show\fR
> +Lists the actions implementations that are available and highlights the
> +currently enabled one.
> +.
> +.IP "\fBdpif-netdev/action-impl-set\fR \fIaction_impl\fR"
> +Sets the action implementation to any available implementation. By default
> +"scalar" is used.
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 47dd7a1a6..5a35c7ce5 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -63,6 +63,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"
> @@ -1387,6 +1388,37 @@ 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;
> +
> +    int err = odp_actions_impl_set(argv[1]);
> +    if (err) {
> +        ds_put_format(&reply,
> +                      "Error: unknown action implementation, %s, 
> specified!\n",

Remove "\n" here.

> +                      argv[1]);
> +        unixctl_command_reply_error(conn, ds_cstr(&reply));
> +    } else {
> +        ds_put_format(&reply, "Action implementation set to %s.\n", argv[1]);

Remove "\n" here.

> +        unixctl_command_reply(conn, ds_cstr(&reply));
> +    }
> +
> +    ds_destroy(&reply);
> +}
> +
> +static void
> +action_impl_show(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_info(&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)
> @@ -1624,6 +1656,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-show", "",
> +                             0, 0, action_impl_show,
> +                             NULL);
>      return 0;
>  }
>
> diff --git a/lib/odp-execute-private.c b/lib/odp-execute-private.c
> index 267f32c3e..f8d0896b5 100644
> --- a/lib/odp-execute-private.c
> +++ b/lib/odp-execute-private.c
> @@ -68,6 +68,18 @@ odp_execute_action_set(const char *name,
>      return -EINVAL;
>  }
>
> +void
> +odp_execute_action_get_info(struct ds *string)
> +{
> +    ds_put_cstr(string, "Available Actions implementations:\n");
> +    for (int 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 ? "Yes" : "No",
> +                      i == active_action_impl_index ? "Yes" : "No");
> +    }
> +}
> +
>  void
>  odp_execute_action_init(void)
>  {
> diff --git a/lib/odp-execute-private.h b/lib/odp-execute-private.h
> index d3dc669d1..5322eb8df 100644
> --- a/lib/odp-execute-private.h
> +++ b/lib/odp-execute-private.h
> @@ -85,4 +85,7 @@ int action_autoval_init(struct odp_execute_action_impl 
> *self);
>  int odp_execute_action_set(const char *name,
>                                 struct odp_execute_action_impl *active);
>
> +void odp_execute_action_get_info(struct ds *name);
> +
> +
>  #endif /* ODP_EXTRACT_PRIVATE */
> diff --git a/lib/odp-execute.h b/lib/odp-execute.h
> index 50d47b716..8668ab73f 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;
> @@ -36,6 +37,7 @@ typedef void (*odp_execute_action_cb)(struct 
> dp_packet_batch *batch,
>                                        const struct nlattr *action);
>
>  int odp_actions_impl_set(const char *name);
> +int odp_actions_impl_get(struct ds *name);
>
>  typedef void (*odp_execute_cb)(void *dp, struct dp_packet_batch *batch,
>                                 const struct nlattr *action, bool 
> should_steal);
> diff --git a/tests/pmd.at b/tests/pmd.at
> index e6b173dab..ac05f5f7d 100644
> --- a/tests/pmd.at
> +++ b/tests/pmd.at
> @@ -1200,3 +1200,33 @@ ovs-appctl: ovs-vswitchd: server returned an error
>
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
> +
> +AT_SETUP([PMD - ovs-actions configuration])
> +OVS_VSWITCHD_START([], [], [], [--dummy-numa 0,0])
> +AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd])
> +
> +dnl Scalar impl is set by default.
> +AT_CHECK([ovs-vsctl show], [], [stdout])
> +AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep "scalar"], [], [dnl
> +  scalar (available: Yes, active: Yes)
> +])
> +
> +AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep "autovalidator"], 
> [], [dnl
> +  autovalidator (available: Yes, active: No)
> +])
> +
> +dnl Set the autovalidator impl to active.
> +AT_CHECK([ovs-appctl dpif-netdev/action-impl-set autovalidator], [0], [dnl
> +Action implementation set to autovalidator.
> +])
> +
> +AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep "scalar"], [], [dnl
> +  scalar (available: Yes, active: No)
> +])
> +
> +AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep "autovalidator"], 
> [], [dnl
> +  autovalidator (available: Yes, active: Yes)
> +])
> +
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> -- 
> 2.32.0

The above test was failing due to a major issue in the next patch.
Here is the diff required to make these tests work (I've also added the 
negative tests I requested in v6):

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 5a35c7ce5..3e688fb8b 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1397,11 +1397,11 @@ action_impl_set(struct unixctl_conn *conn, int argc 
OVS_UNUSED,
     int err = odp_actions_impl_set(argv[1]);
     if (err) {
         ds_put_format(&reply,
-                      "Error: unknown action implementation, %s, specified!\n",
+                      "Error: unknown action implementation, %s, specified!",
                       argv[1]);
         unixctl_command_reply_error(conn, ds_cstr(&reply));
     } else {
-        ds_put_format(&reply, "Action implementation set to %s.\n", argv[1]);
+        ds_put_format(&reply, "Action implementation set to %s.", argv[1]);
         unixctl_command_reply(conn, ds_cstr(&reply));
     }

diff --git a/tests/pmd.at b/tests/pmd.at
index ac05f5f7d..643fa9285 100644
--- a/tests/pmd.at
+++ b/tests/pmd.at
@@ -1205,6 +1205,11 @@ AT_SETUP([PMD - ovs-actions configuration])
 OVS_VSWITCHD_START([], [], [], [--dummy-numa 0,0])
 AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd])

+dnl Set the scalar first, so we always have the scalar impl as Active.
+AT_CHECK([ovs-appctl dpif-netdev/action-impl-set scalar], [0], [dnl
+Action implementation set to scalar.
+])
+
-dnl Scalar impl is set by default.
-AT_CHECK([ovs-vsctl show], [], [stdout])
 AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep "scalar"], [], [dnl
@@ -1228,5 +1233,11 @@ AT_CHECK([ovs-appctl dpif-netdev/action-impl-show | grep 
"autovalidator"], [], [
   autovalidator (available: Yes, active: Yes)
 ])

-OVS_VSWITCHD_STOP
+dnl Set the autovalidator impl to active.
+AT_CHECK([ovs-appctl dpif-netdev/action-impl-set invalid_implementation], [2], 
[], [dnl
+Error: unknown action implementation, invalid_implementation, specified!
+ovs-appctl: ovs-vswitchd: server returned an error
+])
+
+OVS_VSWITCHD_STOP(["/Failed setting action implementation to 
invalid_implementation/d"])
 AT_CLEANUP

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to