1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*2d9fd380Sjfb8856606 * Copyright(C) 2020 Marvell International Ltd. 3*2d9fd380Sjfb8856606 */ 4*2d9fd380Sjfb8856606 5*2d9fd380Sjfb8856606 #ifndef _RTE_GRAPH_PRIVATE_H_ 6*2d9fd380Sjfb8856606 #define _RTE_GRAPH_PRIVATE_H_ 7*2d9fd380Sjfb8856606 8*2d9fd380Sjfb8856606 #include <inttypes.h> 9*2d9fd380Sjfb8856606 #include <sys/queue.h> 10*2d9fd380Sjfb8856606 11*2d9fd380Sjfb8856606 #include <rte_common.h> 12*2d9fd380Sjfb8856606 #include <rte_eal.h> 13*2d9fd380Sjfb8856606 14*2d9fd380Sjfb8856606 #include "rte_graph.h" 15*2d9fd380Sjfb8856606 #include "rte_graph_worker.h" 16*2d9fd380Sjfb8856606 17*2d9fd380Sjfb8856606 extern int rte_graph_logtype; 18*2d9fd380Sjfb8856606 19*2d9fd380Sjfb8856606 #define GRAPH_LOG(level, ...) \ 20*2d9fd380Sjfb8856606 rte_log(RTE_LOG_##level, rte_graph_logtype, \ 21*2d9fd380Sjfb8856606 RTE_FMT("GRAPH: %s():%u " RTE_FMT_HEAD(__VA_ARGS__, ) "\n", \ 22*2d9fd380Sjfb8856606 __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__, ))) 23*2d9fd380Sjfb8856606 24*2d9fd380Sjfb8856606 #define graph_err(...) GRAPH_LOG(ERR, __VA_ARGS__) 25*2d9fd380Sjfb8856606 #define graph_info(...) GRAPH_LOG(INFO, __VA_ARGS__) 26*2d9fd380Sjfb8856606 #define graph_dbg(...) GRAPH_LOG(DEBUG, __VA_ARGS__) 27*2d9fd380Sjfb8856606 28*2d9fd380Sjfb8856606 #define ID_CHECK(id, id_max) \ 29*2d9fd380Sjfb8856606 do { \ 30*2d9fd380Sjfb8856606 if ((id) >= (id_max)) { \ 31*2d9fd380Sjfb8856606 rte_errno = EINVAL; \ 32*2d9fd380Sjfb8856606 goto fail; \ 33*2d9fd380Sjfb8856606 } \ 34*2d9fd380Sjfb8856606 } while (0) 35*2d9fd380Sjfb8856606 36*2d9fd380Sjfb8856606 #define SET_ERR_JMP(err, where, fmt, ...) \ 37*2d9fd380Sjfb8856606 do { \ 38*2d9fd380Sjfb8856606 graph_err(fmt, ##__VA_ARGS__); \ 39*2d9fd380Sjfb8856606 rte_errno = err; \ 40*2d9fd380Sjfb8856606 goto where; \ 41*2d9fd380Sjfb8856606 } while (0) 42*2d9fd380Sjfb8856606 43*2d9fd380Sjfb8856606 /** 44*2d9fd380Sjfb8856606 * @internal 45*2d9fd380Sjfb8856606 * 46*2d9fd380Sjfb8856606 * Structure that holds node internal data. 47*2d9fd380Sjfb8856606 */ 48*2d9fd380Sjfb8856606 struct node { 49*2d9fd380Sjfb8856606 STAILQ_ENTRY(node) next; /**< Next node in the list. */ 50*2d9fd380Sjfb8856606 char name[RTE_NODE_NAMESIZE]; /**< Name of the node. */ 51*2d9fd380Sjfb8856606 uint64_t flags; /**< Node configuration flag. */ 52*2d9fd380Sjfb8856606 rte_node_process_t process; /**< Node process function. */ 53*2d9fd380Sjfb8856606 rte_node_init_t init; /**< Node init function. */ 54*2d9fd380Sjfb8856606 rte_node_fini_t fini; /**< Node fini function. */ 55*2d9fd380Sjfb8856606 rte_node_t id; /**< Allocated identifier for the node. */ 56*2d9fd380Sjfb8856606 rte_node_t parent_id; /**< Parent node identifier. */ 57*2d9fd380Sjfb8856606 rte_edge_t nb_edges; /**< Number of edges from this node. */ 58*2d9fd380Sjfb8856606 char next_nodes[][RTE_NODE_NAMESIZE]; /**< Names of next nodes. */ 59*2d9fd380Sjfb8856606 }; 60*2d9fd380Sjfb8856606 61*2d9fd380Sjfb8856606 /** 62*2d9fd380Sjfb8856606 * @internal 63*2d9fd380Sjfb8856606 * 64*2d9fd380Sjfb8856606 * Structure that holds the graph node data. 65*2d9fd380Sjfb8856606 */ 66*2d9fd380Sjfb8856606 struct graph_node { 67*2d9fd380Sjfb8856606 STAILQ_ENTRY(graph_node) next; /**< Next graph node in the list. */ 68*2d9fd380Sjfb8856606 struct node *node; /**< Pointer to internal node. */ 69*2d9fd380Sjfb8856606 bool visited; /**< Flag used in BFS to mark node visited. */ 70*2d9fd380Sjfb8856606 struct graph_node *adjacency_list[]; /**< Adjacency list of the node. */ 71*2d9fd380Sjfb8856606 }; 72*2d9fd380Sjfb8856606 73*2d9fd380Sjfb8856606 /** 74*2d9fd380Sjfb8856606 * @internal 75*2d9fd380Sjfb8856606 * 76*2d9fd380Sjfb8856606 * Structure that holds graph internal data. 77*2d9fd380Sjfb8856606 */ 78*2d9fd380Sjfb8856606 struct graph { 79*2d9fd380Sjfb8856606 STAILQ_ENTRY(graph) next; 80*2d9fd380Sjfb8856606 /**< List of graphs. */ 81*2d9fd380Sjfb8856606 char name[RTE_GRAPH_NAMESIZE]; 82*2d9fd380Sjfb8856606 /**< Name of the graph. */ 83*2d9fd380Sjfb8856606 const struct rte_memzone *mz; 84*2d9fd380Sjfb8856606 /**< Memzone to store graph data. */ 85*2d9fd380Sjfb8856606 rte_graph_off_t nodes_start; 86*2d9fd380Sjfb8856606 /**< Node memory start offset in graph reel. */ 87*2d9fd380Sjfb8856606 rte_node_t src_node_count; 88*2d9fd380Sjfb8856606 /**< Number of source nodes in a graph. */ 89*2d9fd380Sjfb8856606 struct rte_graph *graph; 90*2d9fd380Sjfb8856606 /**< Pointer to graph data. */ 91*2d9fd380Sjfb8856606 rte_node_t node_count; 92*2d9fd380Sjfb8856606 /**< Total number of nodes. */ 93*2d9fd380Sjfb8856606 uint32_t cir_start; 94*2d9fd380Sjfb8856606 /**< Circular buffer start offset in graph reel. */ 95*2d9fd380Sjfb8856606 uint32_t cir_mask; 96*2d9fd380Sjfb8856606 /**< Circular buffer mask for wrap around. */ 97*2d9fd380Sjfb8856606 rte_graph_t id; 98*2d9fd380Sjfb8856606 /**< Graph identifier. */ 99*2d9fd380Sjfb8856606 size_t mem_sz; 100*2d9fd380Sjfb8856606 /**< Memory size of the graph. */ 101*2d9fd380Sjfb8856606 int socket; 102*2d9fd380Sjfb8856606 /**< Socket identifier where memory is allocated. */ 103*2d9fd380Sjfb8856606 STAILQ_HEAD(gnode_list, graph_node) node_list; 104*2d9fd380Sjfb8856606 /**< Nodes in a graph. */ 105*2d9fd380Sjfb8856606 }; 106*2d9fd380Sjfb8856606 107*2d9fd380Sjfb8856606 /* Node functions */ 108*2d9fd380Sjfb8856606 STAILQ_HEAD(node_head, node); 109*2d9fd380Sjfb8856606 110*2d9fd380Sjfb8856606 /** 111*2d9fd380Sjfb8856606 * @internal 112*2d9fd380Sjfb8856606 * 113*2d9fd380Sjfb8856606 * Get the head of the node list. 114*2d9fd380Sjfb8856606 * 115*2d9fd380Sjfb8856606 * @return 116*2d9fd380Sjfb8856606 * Pointer to the node head. 117*2d9fd380Sjfb8856606 */ 118*2d9fd380Sjfb8856606 struct node_head *node_list_head_get(void); 119*2d9fd380Sjfb8856606 120*2d9fd380Sjfb8856606 /** 121*2d9fd380Sjfb8856606 * @internal 122*2d9fd380Sjfb8856606 * 123*2d9fd380Sjfb8856606 * Get node pointer from node name. 124*2d9fd380Sjfb8856606 * 125*2d9fd380Sjfb8856606 * @param name 126*2d9fd380Sjfb8856606 * Pointer to character string containing the node name. 127*2d9fd380Sjfb8856606 * 128*2d9fd380Sjfb8856606 * @return 129*2d9fd380Sjfb8856606 * Pointer to the node. 130*2d9fd380Sjfb8856606 */ 131*2d9fd380Sjfb8856606 struct node *node_from_name(const char *name); 132*2d9fd380Sjfb8856606 133*2d9fd380Sjfb8856606 /* Graph list functions */ 134*2d9fd380Sjfb8856606 STAILQ_HEAD(graph_head, graph); 135*2d9fd380Sjfb8856606 136*2d9fd380Sjfb8856606 /** 137*2d9fd380Sjfb8856606 * @internal 138*2d9fd380Sjfb8856606 * 139*2d9fd380Sjfb8856606 * Get the head of the graph list. 140*2d9fd380Sjfb8856606 * 141*2d9fd380Sjfb8856606 * @return 142*2d9fd380Sjfb8856606 * Pointer to the graph head. 143*2d9fd380Sjfb8856606 */ 144*2d9fd380Sjfb8856606 struct graph_head *graph_list_head_get(void); 145*2d9fd380Sjfb8856606 146*2d9fd380Sjfb8856606 /* Lock functions */ 147*2d9fd380Sjfb8856606 /** 148*2d9fd380Sjfb8856606 * @internal 149*2d9fd380Sjfb8856606 * 150*2d9fd380Sjfb8856606 * Take a lock on the graph internal spin lock. 151*2d9fd380Sjfb8856606 */ 152*2d9fd380Sjfb8856606 void graph_spinlock_lock(void); 153*2d9fd380Sjfb8856606 154*2d9fd380Sjfb8856606 /** 155*2d9fd380Sjfb8856606 * @internal 156*2d9fd380Sjfb8856606 * 157*2d9fd380Sjfb8856606 * Release a lock on the graph internal spin lock. 158*2d9fd380Sjfb8856606 */ 159*2d9fd380Sjfb8856606 void graph_spinlock_unlock(void); 160*2d9fd380Sjfb8856606 161*2d9fd380Sjfb8856606 /* Graph operations */ 162*2d9fd380Sjfb8856606 /** 163*2d9fd380Sjfb8856606 * @internal 164*2d9fd380Sjfb8856606 * 165*2d9fd380Sjfb8856606 * Run a BFS(Breadth First Search) on the graph marking all 166*2d9fd380Sjfb8856606 * the graph nodes as visited. 167*2d9fd380Sjfb8856606 * 168*2d9fd380Sjfb8856606 * @param graph 169*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 170*2d9fd380Sjfb8856606 * @param start 171*2d9fd380Sjfb8856606 * Pointer to the starting graph node. 172*2d9fd380Sjfb8856606 * 173*2d9fd380Sjfb8856606 * @return 174*2d9fd380Sjfb8856606 * - 0: Success. 175*2d9fd380Sjfb8856606 * - -ENOMEM: Not enough memory for BFS. 176*2d9fd380Sjfb8856606 */ 177*2d9fd380Sjfb8856606 int graph_bfs(struct graph *graph, struct graph_node *start); 178*2d9fd380Sjfb8856606 179*2d9fd380Sjfb8856606 /** 180*2d9fd380Sjfb8856606 * @internal 181*2d9fd380Sjfb8856606 * 182*2d9fd380Sjfb8856606 * Check if there is an isolated node in the given graph. 183*2d9fd380Sjfb8856606 * 184*2d9fd380Sjfb8856606 * @param graph 185*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 186*2d9fd380Sjfb8856606 * 187*2d9fd380Sjfb8856606 * @return 188*2d9fd380Sjfb8856606 * - 0: No isolated node found. 189*2d9fd380Sjfb8856606 * - 1: Isolated node found. 190*2d9fd380Sjfb8856606 */ 191*2d9fd380Sjfb8856606 int graph_has_isolated_node(struct graph *graph); 192*2d9fd380Sjfb8856606 193*2d9fd380Sjfb8856606 /** 194*2d9fd380Sjfb8856606 * @internal 195*2d9fd380Sjfb8856606 * 196*2d9fd380Sjfb8856606 * Check whether a node in the graph has next_node to a source node. 197*2d9fd380Sjfb8856606 * 198*2d9fd380Sjfb8856606 * @param graph 199*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 200*2d9fd380Sjfb8856606 * 201*2d9fd380Sjfb8856606 * @return 202*2d9fd380Sjfb8856606 * - 0: Node has an edge to source node. 203*2d9fd380Sjfb8856606 * - 1: Node doesn't have an edge to source node. 204*2d9fd380Sjfb8856606 */ 205*2d9fd380Sjfb8856606 int graph_node_has_edge_to_src_node(struct graph *graph); 206*2d9fd380Sjfb8856606 207*2d9fd380Sjfb8856606 /** 208*2d9fd380Sjfb8856606 * @internal 209*2d9fd380Sjfb8856606 * 210*2d9fd380Sjfb8856606 * Checks whether node in the graph has a edge to itself i.e. forms a 211*2d9fd380Sjfb8856606 * loop. 212*2d9fd380Sjfb8856606 * 213*2d9fd380Sjfb8856606 * @param graph 214*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 215*2d9fd380Sjfb8856606 * 216*2d9fd380Sjfb8856606 * @return 217*2d9fd380Sjfb8856606 * - 0: Node has an edge to itself. 218*2d9fd380Sjfb8856606 * - 1: Node doesn't have an edge to itself. 219*2d9fd380Sjfb8856606 */ 220*2d9fd380Sjfb8856606 int graph_node_has_loop_edge(struct graph *graph); 221*2d9fd380Sjfb8856606 222*2d9fd380Sjfb8856606 /** 223*2d9fd380Sjfb8856606 * @internal 224*2d9fd380Sjfb8856606 * 225*2d9fd380Sjfb8856606 * Get the count of source nodes in the graph. 226*2d9fd380Sjfb8856606 * 227*2d9fd380Sjfb8856606 * @param graph 228*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 229*2d9fd380Sjfb8856606 * 230*2d9fd380Sjfb8856606 * @return 231*2d9fd380Sjfb8856606 * Number of source nodes. 232*2d9fd380Sjfb8856606 */ 233*2d9fd380Sjfb8856606 rte_node_t graph_src_nodes_count(struct graph *graph); 234*2d9fd380Sjfb8856606 235*2d9fd380Sjfb8856606 /** 236*2d9fd380Sjfb8856606 * @internal 237*2d9fd380Sjfb8856606 * 238*2d9fd380Sjfb8856606 * Get the count of total number of nodes in the graph. 239*2d9fd380Sjfb8856606 * 240*2d9fd380Sjfb8856606 * @param graph 241*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 242*2d9fd380Sjfb8856606 * 243*2d9fd380Sjfb8856606 * @return 244*2d9fd380Sjfb8856606 * Number of nodes. 245*2d9fd380Sjfb8856606 */ 246*2d9fd380Sjfb8856606 rte_node_t graph_nodes_count(struct graph *graph); 247*2d9fd380Sjfb8856606 248*2d9fd380Sjfb8856606 /** 249*2d9fd380Sjfb8856606 * @internal 250*2d9fd380Sjfb8856606 * 251*2d9fd380Sjfb8856606 * Clear the visited flag of all the nodes in the graph. 252*2d9fd380Sjfb8856606 * 253*2d9fd380Sjfb8856606 * @param graph 254*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 255*2d9fd380Sjfb8856606 */ 256*2d9fd380Sjfb8856606 void graph_mark_nodes_as_not_visited(struct graph *graph); 257*2d9fd380Sjfb8856606 258*2d9fd380Sjfb8856606 /* Fast path graph memory populate unctions */ 259*2d9fd380Sjfb8856606 260*2d9fd380Sjfb8856606 /** 261*2d9fd380Sjfb8856606 * @internal 262*2d9fd380Sjfb8856606 * 263*2d9fd380Sjfb8856606 * Create fast-path memory for the graph and nodes. 264*2d9fd380Sjfb8856606 * 265*2d9fd380Sjfb8856606 * @param graph 266*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 267*2d9fd380Sjfb8856606 * 268*2d9fd380Sjfb8856606 * @return 269*2d9fd380Sjfb8856606 * - 0: Success. 270*2d9fd380Sjfb8856606 * - -ENOMEM: Not enough for graph and nodes. 271*2d9fd380Sjfb8856606 * - -EINVAL: Graph nodes not found. 272*2d9fd380Sjfb8856606 */ 273*2d9fd380Sjfb8856606 int graph_fp_mem_create(struct graph *graph); 274*2d9fd380Sjfb8856606 275*2d9fd380Sjfb8856606 /** 276*2d9fd380Sjfb8856606 * @internal 277*2d9fd380Sjfb8856606 * 278*2d9fd380Sjfb8856606 * Free fast-path memory used by graph and nodes. 279*2d9fd380Sjfb8856606 * 280*2d9fd380Sjfb8856606 * @param graph 281*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 282*2d9fd380Sjfb8856606 * 283*2d9fd380Sjfb8856606 * @return 284*2d9fd380Sjfb8856606 * - 0: Success. 285*2d9fd380Sjfb8856606 * - <0: Graph memzone related error. 286*2d9fd380Sjfb8856606 */ 287*2d9fd380Sjfb8856606 int graph_fp_mem_destroy(struct graph *graph); 288*2d9fd380Sjfb8856606 289*2d9fd380Sjfb8856606 /* Lookup functions */ 290*2d9fd380Sjfb8856606 /** 291*2d9fd380Sjfb8856606 * @internal 292*2d9fd380Sjfb8856606 * 293*2d9fd380Sjfb8856606 * Get graph node object from node id. 294*2d9fd380Sjfb8856606 * 295*2d9fd380Sjfb8856606 * @param graph 296*2d9fd380Sjfb8856606 * Pointer to rte_graph object. 297*2d9fd380Sjfb8856606 * @param id 298*2d9fd380Sjfb8856606 * Node Identifier. 299*2d9fd380Sjfb8856606 * 300*2d9fd380Sjfb8856606 * @return 301*2d9fd380Sjfb8856606 * Pointer to rte_node if identifier is valid else NULL. 302*2d9fd380Sjfb8856606 */ 303*2d9fd380Sjfb8856606 struct rte_node *graph_node_id_to_ptr(const struct rte_graph *graph, 304*2d9fd380Sjfb8856606 rte_node_t id); 305*2d9fd380Sjfb8856606 306*2d9fd380Sjfb8856606 /** 307*2d9fd380Sjfb8856606 * @internal 308*2d9fd380Sjfb8856606 * 309*2d9fd380Sjfb8856606 * Get graph node object from node name. 310*2d9fd380Sjfb8856606 * 311*2d9fd380Sjfb8856606 * @param graph 312*2d9fd380Sjfb8856606 * Pointer to rte_graph object. 313*2d9fd380Sjfb8856606 * @param node_name 314*2d9fd380Sjfb8856606 * Pointer to character string holding the node name. 315*2d9fd380Sjfb8856606 * 316*2d9fd380Sjfb8856606 * @return 317*2d9fd380Sjfb8856606 * Pointer to rte_node if identifier is valid else NULL. 318*2d9fd380Sjfb8856606 */ 319*2d9fd380Sjfb8856606 struct rte_node *graph_node_name_to_ptr(const struct rte_graph *graph, 320*2d9fd380Sjfb8856606 const char *node_name); 321*2d9fd380Sjfb8856606 322*2d9fd380Sjfb8856606 /* Debug functions */ 323*2d9fd380Sjfb8856606 /** 324*2d9fd380Sjfb8856606 * @internal 325*2d9fd380Sjfb8856606 * 326*2d9fd380Sjfb8856606 * Dump internal graph object data. 327*2d9fd380Sjfb8856606 * 328*2d9fd380Sjfb8856606 * @param f 329*2d9fd380Sjfb8856606 * FILE pointer to dump the data. 330*2d9fd380Sjfb8856606 * @param g 331*2d9fd380Sjfb8856606 * Pointer to the internal graph object. 332*2d9fd380Sjfb8856606 */ 333*2d9fd380Sjfb8856606 void graph_dump(FILE *f, struct graph *g); 334*2d9fd380Sjfb8856606 335*2d9fd380Sjfb8856606 /** 336*2d9fd380Sjfb8856606 * @internal 337*2d9fd380Sjfb8856606 * 338*2d9fd380Sjfb8856606 * Dump internal node object data. 339*2d9fd380Sjfb8856606 * 340*2d9fd380Sjfb8856606 * @param f 341*2d9fd380Sjfb8856606 * FILE pointer to dump the info. 342*2d9fd380Sjfb8856606 * @param g 343*2d9fd380Sjfb8856606 * Pointer to the internal node object. 344*2d9fd380Sjfb8856606 */ 345*2d9fd380Sjfb8856606 void node_dump(FILE *f, struct node *n); 346*2d9fd380Sjfb8856606 347*2d9fd380Sjfb8856606 #endif /* _RTE_GRAPH_PRIVATE_H_ */ 348