[PATCH v7 04/17] graph: add get/set graph worker model APIs

Yan, Zhirun zhirun.yan at intel.com
Tue Jun 6 06:30:05 CEST 2023



> -----Original Message-----
> From: Jerin Jacob <jerinjacobk at gmail.com>
> Sent: Monday, June 5, 2023 8:38 PM
> To: Yan, Zhirun <zhirun.yan at intel.com>
> Cc: dev at dpdk.org; jerinj at marvell.com; kirankumark at marvell.com;
> ndabilpuram at marvell.com; stephen at networkplumber.org;
> pbhagavatula at marvell.com; Liang, Cunming <cunming.liang at intel.com>; Wang,
> Haiyue <haiyue.wang at intel.com>; mattias.ronnblom
> <mattias.ronnblom at ericsson.com>
> Subject: Re: [PATCH v7 04/17] graph: add get/set graph worker model APIs
> 
> On Mon, Jun 5, 2023 at 4:56 PM Zhirun Yan <zhirun.yan at intel.com> wrote:
> >
> > Add new get/set APIs to configure graph worker model which is used to
> > determine which model will be chosen.
> >
> > Signed-off-by: Haiyue Wang <haiyue.wang at intel.com>
> > Signed-off-by: Cunming Liang <cunming.liang at intel.com>
> > Signed-off-by: Zhirun Yan <zhirun.yan at intel.com>
> > ---
> >  lib/graph/meson.build               |  1 +
> >  lib/graph/rte_graph_worker.c        | 70 +++++++++++++++++++++++++++++
> >  lib/graph/rte_graph_worker_common.h | 19 ++++++++
> >  lib/graph/version.map               |  3 ++
> >  4 files changed, 93 insertions(+)
> >  create mode 100644 lib/graph/rte_graph_worker.c
> >
> > diff --git a/lib/graph/meson.build b/lib/graph/meson.build index
> > 3526d1b5d4..9fab8243da 100644
> > --- a/lib/graph/meson.build
> > +++ b/lib/graph/meson.build
> > @@ -15,6 +15,7 @@ sources = files(
> >          'graph_stats.c',
> >          'graph_populate.c',
> >          'graph_pcap.c',
> > +        'rte_graph_worker.c',
> >  )
> >  headers = files('rte_graph.h', 'rte_graph_worker.h')
> >
> > diff --git a/lib/graph/rte_graph_worker.c
> > b/lib/graph/rte_graph_worker.c new file mode 100644 index
> > 0000000000..fc188e7cfa
> > --- /dev/null
> > +++ b/lib/graph/rte_graph_worker.c
> > @@ -0,0 +1,70 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(C) 2023 Intel Corporation  */
> > +
> > +/**
> > + * @file graph_worker.c
> > + *
> > + * @warning
> > + * @b EXPERIMENTAL:
> > + * All functions in this file may be changed or removed without prior notice.
> > + *
> > + * These API enable to set/get graph walking model.
> > + *
> > + */
> > +
> > +#include "rte_graph_worker_common.h"
> > +#include "graph_private.h"
> > +
> > +/**
> > + * @note This function does not perform any locking, and is only safe to call
> > + *    before graph running. It will set all graphs the same model.
> > + *
> > + * @param name
> > + *   Name of the graph worker model.
> > + *
> > + * @return
> > + *   0 on success, -1 otherwise.
> < 0 otherwise
> 
> Doxygen comment is not required .c file.
> 
Yes, I will move the declaration into rte_graph_worker.h

> 
> > + */
> > +int
> > +rte_graph_worker_model_set(enum rte_graph_worker_model model) {
> > +       struct graph_head *graph_head = graph_list_head_get();
> > +       struct graph *graph;
> > +       int ret = 0;
> > +
> > +       if (model == RTE_GRAPH_MODEL_DEFAULT || model ==
> RTE_GRAPH_MODEL_RTC ||
> > +           model == RTE_GRAPH_MODEL_MCORE_DISPATCH)
> > +               STAILQ_FOREACH(graph, graph_head, next)
> > +                       graph->graph->model = model;
> > +       else {
> > +               STAILQ_FOREACH(graph, graph_head, next)
> > +                       graph->graph->model = RTE_GRAPH_MODEL_DEFAULT;
> > +               ret = -1;
> 
> Why returning -1 here?
> Also, why "else" case needed as RTE_GRAPH_MODEL_RTC ==
> RTE_GRAPH_MODEL_DEFAULT

Actually, the "else" offers a way to recover if this func called with model >
RTE_GRAPH_MODEL_MCORE_DISPATCH, or another not supported value. Then the
app could have ability to run in default RTC model or user app could reset the model.

> 
> Why not
> 
> struct graph_head *graph_head = graph_list_head_get(); struct graph *graph;
> 
> [1]
> if (model > RTE_GRAPH_MODEL_MCORE_DISPATCH)
>        return -EINVAL;
> 
> STAILQ_FOREACH(graph, graph_head, next)
>               graph->graph->model = model;
> 
> 
> For [1], Please add internal helper function graph_model_is_valid() to use
> everywhere as needed.
> 

I will add graph_model_is_valid().

And change it to 

If (!graph_model_is_valid()) {
  model = RTE_GRAPH_MODEL_DEFAULT;
  return -EINVAL;
}
STAILQ_FOREACH(graph, graph_head, next)
    graph->graph->model = model;

return 0;

> > +               }
> > +
> > +       return ret;
> > +}
> > +
> > +/**
> > + * Get the graph worker model
> > + *
> > + * @note All graph will use the same model and this function will get
> > +model from the first one
> > + *
> > + * @param name
> > + *   Name of the graph worker model.
> > + *
> > + * @return
> > + *   Graph worker model on success.
> > + */
> > +inline
> > +enum rte_graph_worker_model
> > +rte_graph_worker_model_get(void)
> > +{
> > +       struct graph_head *graph_head = graph_list_head_get();
> > +       struct graph *graph;
> > +
> > +       graph = STAILQ_FIRST(graph_head);
> 
> This can be used in fastpath, So lets pass graph object and make inline function
> to return graph->model
> 

Some functions don't have the graph object like graph_stats_*. No param could make
this API easy to call for current impl. And I think this func is mainly for configuration,
should not in fastpath. If different models coexisted, then the graph object must be passed.

I will change it. Thanks.

> > +
> > +       return graph->graph->model;
> 
> > +}
> > diff --git a/lib/graph/rte_graph_worker_common.h
> > b/lib/graph/rte_graph_worker_common.h
> > index 41428974db..72d132bae4 100644
> > --- a/lib/graph/rte_graph_worker_common.h
> > +++ b/lib/graph/rte_graph_worker_common.h
> > @@ -29,6 +29,16 @@
> >  extern "C" {
> >  #endif
> >
> > +/** Graph worker models */
> > +enum rte_graph_worker_model {
> > +       RTE_GRAPH_MODEL_DEFAULT,
> > +       /**< Default graph model*/
> > +       RTE_GRAPH_MODEL_RTC = RTE_GRAPH_MODEL_DEFAULT,
> > +       /**< Run-To-Completion model. It is the default model. */
> > +       RTE_GRAPH_MODEL_MCORE_DISPATCH
> > +       /**< Dispatch model to support cross-core dispatching within
> > +core affinity. */ };
> > +
> >  /**
> >   * @internal
> >   *
> > @@ -50,6 +60,7 @@ struct rte_graph {
> >         /** Number of packets to capture per core. */
> >         uint64_t nb_pkt_to_capture;
> >         char pcap_filename[RTE_GRAPH_PCAP_FILE_SZ];  /**< Pcap
> > filename. */
> > +       enum rte_graph_worker_model model; /**< graph model */
> 
> Used in fastpath, use in fastpath area
> [main]dell[dpdk.org] $ git diff
> diff --git a/lib/graph/rte_graph_worker.h b/lib/graph/rte_graph_worker.h index
> 438595b15c..462bbfa705 100644
> --- a/lib/graph/rte_graph_worker.h
> +++ b/lib/graph/rte_graph_worker.h
> @@ -41,6 +41,7 @@ struct rte_graph {
>         rte_node_t nb_nodes;         /**< Number of nodes in the graph. */
>         rte_graph_off_t *cir_start;  /**< Pointer to circular buffer. */
>         rte_graph_off_t nodes_start; /**< Offset at which node memory starts. */
> +       enum rte_graph_worker_model  model;
>         rte_graph_t id; /**< Graph identifier. */
>         int socket;     /**< Socket ID where memory is allocated. */
>         char name[RTE_GRAPH_NAMESIZE];  /**< Name of the graph. */
> 
> >         uint64_t fence;                 /**< Fence. */
> >  } __rte_cache_aligned;
> >
> > @@ -490,6 +501,14 @@ rte_node_next_stream_move(struct rte_graph
> *graph, struct rte_node *src,
> >         }
> >  }
> >
> > +__rte_experimental
> > +enum rte_graph_worker_model
> > +rte_graph_worker_model_get(void);
> > +
> > +__rte_experimental
> > +int
> > +rte_graph_worker_model_set(enum rte_graph_worker_model model);
> 
> 
> Add proper Doxygen comment for both.
> 
> Also check the build issue at
> http://mails.dpdk.org/archives/test-report/2023-June/404496.html

Got it, will fix in next version. Thanks.


More information about the dev mailing list