[ovs-dev] [RFC v2 1/2] dpdk: allow init to fail

Kevin Traynor ktraynor at redhat.com
Wed Apr 25 16:47:57 UTC 2018


On 04/18/2018 07:30 PM, Aaron Conole wrote:
> It's possible for dpdk initialization to fail either due to an internal
> error or an invalid configuration.  When that happens, it's rather
> impolite to immediately abort without any details.
> 
> With this change, a failed dpdk initialization attempt will continue to
> trigger a SIGABRT.  However, the failure details will be logged, and a
> user or administrator may have more information to correct the issue.
> A restart of OvS would still be required to re-attempt initialization.
> 
> The refactor to propagate the init error will be used in an upcoming
> commit.
> 
> Signed-off-by: Aaron Conole <aconole at redhat.com>
> ---
>  lib/dpdk.c | 20 ++++++++++++++------
>  1 file changed, 14 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/dpdk.c b/lib/dpdk.c
> index 00dd97470..641474cde 100644
> --- a/lib/dpdk.c
> +++ b/lib/dpdk.c
> @@ -22,6 +22,7 @@
>  #include <sys/stat.h>
>  #include <getopt.h>
>  
> +#include <rte_errno.h>
>  #include <rte_log.h>
>  #include <rte_memzone.h>
>  #include <rte_version.h>
> @@ -306,7 +307,7 @@ static cookie_io_functions_t dpdk_log_func = {
>      .write = dpdk_log_write,
>  };
>  
> -static void
> +static bool
>  dpdk_init__(const struct smap *ovs_other_config)
>  {
>      char **argv = NULL, **argv_to_release = NULL;
> @@ -422,10 +423,11 @@ dpdk_init__(const struct smap *ovs_other_config)
>  
>      /* Make sure things are initialized ... */
>      result = rte_eal_init(argc, argv);
> +    argv_release(argv, argv_to_release, argc);
>      if (result < 0) {
> -        ovs_abort(result, "Cannot init EAL");
> +        VLOG_EMER("Unable to initialize DPDK: %s", ovs_strerror(rte_errno));
> +        return false;
>      }
> -    argv_release(argv, argv_to_release, argc);
>  
>      /* Set the main thread affinity back to pre rte_eal_init() value */
>      if (auto_determine && !err) {

On eal init failure, I think you should still execute this code block
before returning to (possibly) restore the threads

> @@ -459,6 +461,7 @@ dpdk_init__(const struct smap *ovs_other_config)
>  
>      /* Finally, register the dpdk classes */
>      netdev_dpdk_register();
> +    return true;
>  }
>  
>  void
> @@ -476,10 +479,15 @@ dpdk_init(const struct smap *ovs_other_config)
>          if (ovsthread_once_start(&once_enable)) {
>              VLOG_INFO("Using %s", rte_version());
>              VLOG_INFO("DPDK Enabled - initializing...");
> -            dpdk_init__(ovs_other_config);
> -            enabled = true;
> -            VLOG_INFO("DPDK Enabled - initialized");
> +            enabled = dpdk_init__(ovs_other_config);
> +            if (enabled) {
> +                VLOG_INFO("DPDK Enabled - initialized");
> +            } else {
> +                ovs_abort(rte_errno, "Cannot init EAL");
> +            }
>              ovsthread_once_done(&once_enable);
> +        } else {
> +            VLOG_ERR_ONCE("DPDK Initialization Failed.");
>          }
>      } else {
>          VLOG_INFO_ONCE("DPDK Disabled - Use other_config:dpdk-init to enable");
> 



More information about the dev mailing list