1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2023 Intel Corporation 3 */ 4 5 #ifndef _RTE_GRAPH_MODEL_MCORE_DISPATCH_H_ 6 #define _RTE_GRAPH_MODEL_MCORE_DISPATCH_H_ 7 8 /** 9 * @file rte_graph_model_mcore_dispatch.h 10 * 11 * These APIs allow to set core affinity with the node and only used for mcore 12 * dispatch model. 13 */ 14 15 #include <rte_errno.h> 16 #include <rte_mempool.h> 17 #include <rte_memzone.h> 18 #include <rte_ring.h> 19 20 #include "rte_graph_worker_common.h" 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 #define RTE_GRAPH_SCHED_WQ_SIZE_MULTIPLIER 8 27 #define RTE_GRAPH_SCHED_WQ_SIZE(nb_nodes) \ 28 ((typeof(nb_nodes))((nb_nodes) * RTE_GRAPH_SCHED_WQ_SIZE_MULTIPLIER)) 29 30 /** 31 * @internal 32 * 33 * Schedule the node to the right graph's work queue for mcore dispatch model. 34 * 35 * @param node 36 * Pointer to the scheduled node object. 37 * @param rq 38 * Pointer to the scheduled run-queue for all graphs. 39 * 40 * @return 41 * True on success, false otherwise. 42 * 43 * @note 44 * This implementation is used by mcore dispatch model only and user application 45 * should not call it directly. 46 */ 47 bool __rte_noinline __rte_graph_mcore_dispatch_sched_node_enqueue(struct rte_node *node, 48 struct rte_graph_rq_head *rq); 49 50 /** 51 * @internal 52 * 53 * Process all nodes (streams) in the graph's work queue for mcore dispatch model. 54 * 55 * @param graph 56 * Pointer to the graph object. 57 * 58 * @note 59 * This implementation is used by mcore dispatch model only and user application 60 * should not call it directly. 61 */ 62 void __rte_graph_mcore_dispatch_sched_wq_process(struct rte_graph *graph); 63 64 /** 65 * Set lcore affinity with the node used for mcore dispatch model. 66 * 67 * @param name 68 * Valid node name. In the case of the cloned node, the name will be 69 * "parent node name" + "-" + name. 70 * @param lcore_id 71 * The lcore ID value. 72 * 73 * @return 74 * 0 on success, error otherwise. 75 */ 76 int rte_graph_model_mcore_dispatch_node_lcore_affinity_set(const char *name, 77 unsigned int lcore_id); 78 79 /** 80 * Perform graph walk on the circular buffer and invoke the process function 81 * of the nodes and collect the stats. 82 * 83 * @param graph 84 * Graph pointer returned from rte_graph_lookup function. 85 * 86 * @see rte_graph_lookup() 87 */ 88 static inline void 89 rte_graph_walk_mcore_dispatch(struct rte_graph *graph) 90 { 91 const rte_graph_off_t *cir_start = graph->cir_start; 92 const rte_node_t mask = graph->cir_mask; 93 uint32_t head = graph->head; 94 struct rte_node *node; 95 96 if (graph->dispatch.wq != NULL) 97 __rte_graph_mcore_dispatch_sched_wq_process(graph); 98 99 while (likely(head != graph->tail)) { 100 node = (struct rte_node *)RTE_PTR_ADD(graph, cir_start[(int32_t)head++]); 101 102 /* skip the src nodes which not bind with current worker */ 103 if ((int32_t)head < 1 && node->dispatch.lcore_id != graph->dispatch.lcore_id) 104 continue; 105 106 /* Schedule the node until all task/objs are done */ 107 if (node->dispatch.lcore_id != RTE_MAX_LCORE && 108 graph->dispatch.lcore_id != node->dispatch.lcore_id && 109 graph->dispatch.rq != NULL && 110 __rte_graph_mcore_dispatch_sched_node_enqueue(node, graph->dispatch.rq)) 111 continue; 112 113 __rte_node_process(graph, node); 114 115 head = likely((int32_t)head > 0) ? head & mask : head; 116 } 117 118 graph->tail = 0; 119 } 120 121 #ifdef __cplusplus 122 } 123 #endif 124 125 #endif /* _RTE_GRAPH_MODEL_MCORE_DISPATCH_H_ */ 126