Add lcore_id for graph to hold affinity core id where graph would run on.
Add bind/unbind API to set/unset graph affinity attribute. lcore_id will
be set as MAX by default, it means not enable this attribute.

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/graph.c         | 59 +++++++++++++++++++++++++++++++++++++++
 lib/graph/graph_private.h |  2 ++
 lib/graph/rte_graph.h     | 22 +++++++++++++++
 lib/graph/version.map     |  2 ++
 4 files changed, 85 insertions(+)

diff --git a/lib/graph/graph.c b/lib/graph/graph.c
index a839a2803b..b39a99aac6 100644
--- a/lib/graph/graph.c
+++ b/lib/graph/graph.c
@@ -254,6 +254,64 @@ graph_mem_fixup_secondary(struct rte_graph *graph)
        return graph_mem_fixup_node_ctx(graph);
 }
 
+static __rte_always_inline bool
+graph_src_node_avail(struct graph *graph)
+{
+       struct graph_node *graph_node;
+
+       STAILQ_FOREACH(graph_node, &graph->node_list, next)
+               if ((graph_node->node->flags & RTE_NODE_SOURCE_F) &&
+                   (graph_node->node->lcore_id == RTE_MAX_LCORE ||
+                    graph->lcore_id == graph_node->node->lcore_id))
+                       return true;
+
+       return false;
+}
+
+int
+rte_graph_model_dispatch_core_bind(rte_graph_t id, int lcore)
+{
+       struct graph *graph;
+
+       GRAPH_ID_CHECK(id);
+       if (!rte_lcore_is_enabled(lcore))
+               SET_ERR_JMP(ENOLINK, fail,
+                           "lcore %d not enabled\n",
+                           lcore);
+
+       STAILQ_FOREACH(graph, &graph_list, next)
+               if (graph->id == id)
+                       break;
+
+       graph->lcore_id = lcore;
+       graph->socket = rte_lcore_to_socket_id(lcore);
+
+       /* check the availability of source node */
+       if (!graph_src_node_avail(graph))
+               graph->graph->head = 0;
+
+       return 0;
+
+fail:
+       return -rte_errno;
+}
+
+void
+rte_graph_model_dispatch_core_unbind(rte_graph_t id)
+{
+       struct graph *graph;
+
+       GRAPH_ID_CHECK(id);
+       STAILQ_FOREACH(graph, &graph_list, next)
+               if (graph->id == id)
+                       break;
+
+       graph->lcore_id = RTE_MAX_LCORE;
+
+fail:
+       return;
+}
+
 struct rte_graph *
 rte_graph_lookup(const char *name)
 {
@@ -340,6 +398,7 @@ rte_graph_create(const char *name, struct rte_graph_param 
*prm)
        graph->src_node_count = src_node_count;
        graph->node_count = graph_nodes_count(graph);
        graph->id = graph_id;
+       graph->lcore_id = RTE_MAX_LCORE;
        graph->num_pkt_to_capture = prm->num_pkt_to_capture;
        if (prm->pcap_filename)
                rte_strscpy(graph->pcap_filename, prm->pcap_filename, 
RTE_GRAPH_PCAP_FILE_SZ);
diff --git a/lib/graph/graph_private.h b/lib/graph/graph_private.h
index 409eed3284..ad1d058945 100644
--- a/lib/graph/graph_private.h
+++ b/lib/graph/graph_private.h
@@ -98,6 +98,8 @@ struct graph {
        /**< Circular buffer mask for wrap around. */
        rte_graph_t id;
        /**< Graph identifier. */
+       unsigned int lcore_id;
+       /**< Lcore identifier where the graph prefer to run on. */
        size_t mem_sz;
        /**< Memory size of the graph. */
        int socket;
diff --git a/lib/graph/rte_graph.h b/lib/graph/rte_graph.h
index c9a77297fc..c523809d1f 100644
--- a/lib/graph/rte_graph.h
+++ b/lib/graph/rte_graph.h
@@ -285,6 +285,28 @@ char *rte_graph_id_to_name(rte_graph_t id);
 __rte_experimental
 int rte_graph_export(const char *name, FILE *f);
 
+/**
+ * Bind graph with specific lcore
+ *
+ * @param id
+ *   Graph id to get the pointer of graph object
+ * @param lcore
+ * The lcore where the graph will run on
+ * @return
+ *   0 on success, error otherwise.
+ */
+__rte_experimental
+int rte_graph_model_dispatch_core_bind(rte_graph_t id, int lcore);
+
+/**
+ * Unbind graph with lcore
+ *
+ * @param id
+ * Graph id to get the pointer of graph object
+ */
+__rte_experimental
+void rte_graph_model_dispatch_core_unbind(rte_graph_t id);
+
 /**
  * Get graph object from its name.
  *
diff --git a/lib/graph/version.map b/lib/graph/version.map
index 1f090be74e..7de6f08f59 100644
--- a/lib/graph/version.map
+++ b/lib/graph/version.map
@@ -18,6 +18,8 @@ EXPERIMENTAL {
        rte_graph_node_get_by_name;
        rte_graph_obj_dump;
        rte_graph_walk;
+       rte_graph_model_dispatch_core_bind;
+       rte_graph_model_dispatch_core_unbind;
 
        rte_graph_cluster_stats_create;
        rte_graph_cluster_stats_destroy;
-- 
2.37.2

Reply via email to