[v2,2/3] graph: add support for node free API
Checks
Commit Message
From: Kiran Kumar K <kirankumark@marvell.com>
Add support for rte_node_free API to free the node and its
memory, if node is not part of any of the created graphs.
Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
---
lib/graph/graph.c | 16 ++++++++++++++++
lib/graph/graph_private.h | 13 +++++++++++++
lib/graph/node.c | 21 +++++++++++++++++++++
lib/graph/rte_graph.h | 15 +++++++++++++++
lib/graph/version.map | 3 +++
5 files changed, 68 insertions(+)
Comments
Do these newly added functions need to protect the linked list with spin lock graph_stpinlock_lock?
By the way, I don't know where to consult about this issue at the moment.
Please forgive me for discussing this issue here. Can we set up a chat box on this
page instead of having to comment through email or git send email? Many email clients
cannot set the In Reply To header or do not currently have a git send email environment,
which is not conducive to the timeliness and convenience of comments.
@@ -20,6 +20,22 @@
static struct graph_head graph_list = STAILQ_HEAD_INITIALIZER(graph_list);
static rte_spinlock_t graph_lock = RTE_SPINLOCK_INITIALIZER;
+uint8_t
+graph_is_node_active_in_graph(struct node *node)
+{
+ struct graph *graph;
+
+ STAILQ_FOREACH(graph, &graph_list, next) {
+ struct graph_node *graph_node;
+
+ STAILQ_FOREACH(graph_node, &graph->node_list, next)
+ if (graph_node->node == node)
+ return 1;
+ }
+
+ return 0;
+}
+
/* Private functions */
static struct graph *
graph_from_id(rte_graph_t id)
@@ -440,4 +440,17 @@ int graph_sched_wq_create(struct graph *_graph, struct graph *_parent_graph,
*/
void graph_sched_wq_destroy(struct graph *_graph);
+/**
+ * @internal
+ *
+ * Check if given node present in any of the created graphs.
+ *
+ * @param node
+ * The node object
+ *
+ * @return
+ * 0 if not present in any graph, else return 1.
+ */
+uint8_t graph_is_node_active_in_graph(struct node *_node);
+
#endif /* _RTE_GRAPH_PRIVATE_H_ */
@@ -476,3 +476,24 @@ rte_node_max_count(void)
}
return node_id;
}
+
+int
+rte_node_free(rte_node_t id)
+{
+ struct node *node;
+
+ if (node_from_id(id) == NULL)
+ goto fail;
+
+ STAILQ_FOREACH(node, &node_list, next) {
+ if (id == node->id) {
+ if (graph_is_node_active_in_graph(node))
+ return -1;
+ STAILQ_REMOVE(&node_list, node, node, next);
+ free(node);
+ return 0;
+ }
+ }
+fail:
+ return -1;
+}
@@ -22,6 +22,7 @@
#include <stdio.h>
#include <rte_common.h>
+#include <rte_compat.h>
#ifdef __cplusplus
extern "C" {
@@ -661,6 +662,20 @@ rte_node_is_invalid(rte_node_t id)
return (id == RTE_NODE_ID_INVALID);
}
+/**
+ * Release the memory allocated for a node created using RTE_NODE_REGISTER or rte_node_clone,
+ * if it is not linked to any graphs.
+ *
+ * @param id
+ * Node id to check.
+ *
+ * @return
+ * - 0: Success.
+ * -<0: Failure.
+ */
+__rte_experimental
+int rte_node_free(rte_node_t id);
+
/**
* Test the validity of edge id.
*
@@ -58,4 +58,7 @@ EXPERIMENTAL {
# added in 24.11
rte_node_xstat_increment;
+
+ # added in 25.03
+ rte_node_free;
};