1a2bc0584SZhirun Yan /* SPDX-License-Identifier: BSD-3-Clause 2a2bc0584SZhirun Yan * Copyright(C) 2020 Marvell International Ltd. 3a2bc0584SZhirun Yan * Copyright(C) 2023 Intel Corporation 4a2bc0584SZhirun Yan */ 5a2bc0584SZhirun Yan 6a2bc0584SZhirun Yan #include "rte_graph_worker_common.h" 7a2bc0584SZhirun Yan 8a2bc0584SZhirun Yan /** 9a2bc0584SZhirun Yan * Perform graph walk on the circular buffer and invoke the process function 10a2bc0584SZhirun Yan * of the nodes and collect the stats. 11a2bc0584SZhirun Yan * 12a2bc0584SZhirun Yan * @param graph 13a2bc0584SZhirun Yan * Graph pointer returned from rte_graph_lookup function. 14a2bc0584SZhirun Yan * 15a2bc0584SZhirun Yan * @see rte_graph_lookup() 16a2bc0584SZhirun Yan */ 17a2bc0584SZhirun Yan static inline void rte_graph_walk_rtc(struct rte_graph * graph)18a2bc0584SZhirun Yanrte_graph_walk_rtc(struct rte_graph *graph) 19a2bc0584SZhirun Yan { 20a2bc0584SZhirun Yan const rte_graph_off_t *cir_start = graph->cir_start; 21a2bc0584SZhirun Yan const rte_node_t mask = graph->cir_mask; 22a2bc0584SZhirun Yan uint32_t head = graph->head; 23a2bc0584SZhirun Yan struct rte_node *node; 24a2bc0584SZhirun Yan 25a2bc0584SZhirun Yan /* 26a2bc0584SZhirun Yan * Walk on the source node(s) ((cir_start - head) -> cir_start) and then 27a2bc0584SZhirun Yan * on the pending streams (cir_start -> (cir_start + mask) -> cir_start) 28a2bc0584SZhirun Yan * in a circular buffer fashion. 29a2bc0584SZhirun Yan * 30a2bc0584SZhirun Yan * +-----+ <= cir_start - head [number of source nodes] 31a2bc0584SZhirun Yan * | | 32a2bc0584SZhirun Yan * | ... | <= source nodes 33a2bc0584SZhirun Yan * | | 34a2bc0584SZhirun Yan * +-----+ <= cir_start [head = 0] [tail = 0] 35a2bc0584SZhirun Yan * | | 36a2bc0584SZhirun Yan * | ... | <= pending streams 37a2bc0584SZhirun Yan * | | 38a2bc0584SZhirun Yan * +-----+ <= cir_start + mask 39a2bc0584SZhirun Yan */ 40a2bc0584SZhirun Yan while (likely(head != graph->tail)) { 41a2bc0584SZhirun Yan node = (struct rte_node *)RTE_PTR_ADD(graph, cir_start[(int32_t)head++]); 42*0580f49eSZhirun Yan __rte_node_process(graph, node); 43a2bc0584SZhirun Yan head = likely((int32_t)head > 0) ? head & mask : head; 44a2bc0584SZhirun Yan } 45a2bc0584SZhirun Yan graph->tail = 0; 46a2bc0584SZhirun Yan } 47