This patch introduces the task scheduler mechanism to enable dispatching tasks to another worker cores. Currently, there is only a local work queue for one graph to walk. We introduce a scheduler worker queue in each worker core for dispatching tasks. It will perform the walk on scheduler work queue first, then handle the local work queue.
Signed-off-by: Haiyue Wang <haiyue.w...@intel.com> Signed-off-by: Cunming Liang <cunming.li...@intel.com> Signed-off-by: Zhirun Yan <zhirun....@intel.com> --- lib/graph/rte_graph_model_generic.h | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/graph/rte_graph_model_generic.h b/lib/graph/rte_graph_model_generic.h index 5715fc8ffb..c29fc31309 100644 --- a/lib/graph/rte_graph_model_generic.h +++ b/lib/graph/rte_graph_model_generic.h @@ -71,6 +71,42 @@ void __rte_noinline __rte_graph_sched_wq_process(struct rte_graph *graph); __rte_experimental int rte_node_model_generic_set_lcore_affinity(const char *name, unsigned int lcore_id); +/** + * Perform graph walk on the circular buffer and invoke the process function + * of the nodes and collect the stats. + * + * @param graph + * Graph pointer returned from rte_graph_lookup function. + * + * @see rte_graph_lookup() + */ +__rte_experimental +static inline void +rte_graph_walk_generic(struct rte_graph *graph) +{ + uint32_t head = graph->head; + struct rte_node *node; + + if (graph->wq != NULL) + __rte_graph_sched_wq_process(graph); + + rte_graph_walk_node(graph, head, node) { + /* skip the src nodes which not bind with current worker */ + if ((int32_t)head < 0 && node->lcore_id != graph->lcore_id) + continue; + + /* Schedule the node until all task/objs are done */ + if (node->lcore_id != RTE_MAX_LCORE && + graph->lcore_id != node->lcore_id && graph->rq != NULL && + __rte_graph_sched_node_enqueue(node, graph->rq)) + continue; + + __rte_node_process(graph, node); + } + + graph->tail = 0; +} + #ifdef __cplusplus } #endif -- 2.25.1