Data Accelerator Offload
Loading...
Searching...
No Matches
dao_graph_feature_arc_worker.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: Marvell-MIT
2 * Copyright (c) 2024 Marvell.
3 */
4
5#ifndef _DAO_GRAPH_FEATURE_ARC_WORKER_H_
6#define _DAO_GRAPH_FEATURE_ARC_WORKER_H_
7
8#include <stddef.h>
9#include <stdalign.h>
11#include <rte_bitops.h>
12
21#ifdef __cplusplus
22extern "C" {
23#endif
24
29struct __rte_cache_aligned dao_graph_feature_node_list {
31 STAILQ_ENTRY(dao_graph_feature_node_list) next_feature;
32
34 struct rte_node_register *feature_node;
35
37 int32_t ref_count;
38
40 void *feature_arc;
41
43 rte_edge_t edge_to_this_feature;
44};
45
49typedef struct dao_graph_feature_data {
51 int64_t data;
52
55
58
65
67 struct dao_graph_feature_node_list *node_info;
69
80 struct dao_graph_feature_node_list *node_info;
81
86
92
93 /* uint32_t reserved; */
94
100};
101
109 STAILQ_HEAD(, dao_graph_feature_node_list) all_features;
110
112 char feature_arc_name[DAO_GRAPH_FEATURE_ARC_NAMELEN];
113
116
119
123 struct rte_node_register *start_node;
124
126 uint32_t max_features;
127
129 uint32_t max_indexes;
130
131 /* Fast path stuff*/
132 alignas(RTE_CACHE_LINE_SIZE) RTE_MARKER cacheline1;
138
141
143 uint64_t feature_bit_mask_by_index[];
144};
145
157
159#define dao_graph_feature_arc_get(dfl) ((struct dao_graph_feature_arc *)dfl)
160
161extern dao_graph_feature_arc_main_t *__feature_arc_main;
162
166static inline int
167__bsf64_safe(uint64_t v, uint8_t *pos)
168{
169 if (v == 0)
170 return 0;
171
172 *pos = (uint8_t)rte_ctz64(v);
173 return 1;
174}
175
187static inline struct dao_graph_feature_data *
188dao_graph_feature_data_get(struct dao_graph_feature *df, uint8_t feature_index)
189{
190 return (df->feature_data + feature_index);
191}
192
204static inline struct dao_graph_feature *
206{
207 return (dfl->features_by_index + index);
208}
209
227static inline int
229 uint32_t index, dao_graph_feature_t *feature)
230{
231 return __bsf64_safe(dfl->feature_bit_mask_by_index[index], feature);
232}
233
251static inline int
253 uint32_t index, dao_graph_feature_t *feature)
254{
255 uint64_t bitmask;
256
257#ifdef DAO_GRAPH_FEATURE_ARC_DEBUG
258 struct dao_graph_feature *df = dao_graph_feature_get(dfl, index);
259 struct dao_graph_feature_data *dfd = NULL;
260
261 dfd = dao_graph_feature_data_get(df, *feature);
263 if (unlikely(dfd->feature_data_index != *feature))
264 return 0;
265#endif
266
267 /* Create bitmask where current feature is cleared to get next feature
268 * bit set
269 */
270 bitmask = UINT64_MAX << (*feature + 1);
271 bitmask = dfl->feature_bit_mask_by_index[index] & bitmask;
272
273 return __bsf64_safe(bitmask, feature);
274}
275
284static inline void
286{
287 rte_prefetch0((uint8_t *)dfl +
288 (offsetof(struct dao_graph_feature_arc, feature_bit_mask_by_index) +
289 (index * sizeof(uint64_t *))));
290}
291
298static inline int
303
319static inline int
321 dao_graph_feature_t *feature)
322{
323#ifdef DAO_GRAPH_FEATURE_ARC_DEBUG
324 if (unlikely(dfl->max_indexes < index))
325 return 0;
326
327 if (unlikely(!feature))
328 return 0;
329#endif
330 if (likely(!dfl->feature_bit_mask_by_index[index]))
331 return 0;
332
333 /* Look for first feature */
334 if (*feature == DAO_GRAPH_FEATURE_INVALID_VALUE)
335 return dao_graph_feature_arc_has_first_feature(dfl, index, feature);
336 else
337 return dao_graph_feature_arc_has_next_feature(dfl, index, feature);
338}
339
352static inline void
354 dao_graph_feature_t feature)
355{
356 struct dao_graph_feature *df = dao_graph_feature_get(dfl, index);
357
358 rte_prefetch0((void *)dao_graph_feature_data_get(df, feature));
359}
360
373static inline void
375 dao_graph_feature_t feature)
376{
377#ifdef DAO_GRAPH_FEATURE_ARC_DEBUG
378 if (unlikely(index >= dfl->max_indexes))
379 return;
380
381 if (unlikely(feature >= dao_graph_feature_cast(dfl->max_features)))
382 return;
383#endif
384 if (feature != DAO_GRAPH_FEATURE_INVALID_VALUE)
385 __dao_graph_prefetch_data_prefetch(dfl, index, feature);
386}
387
409static inline int
411 dao_graph_feature_t feature,
412 uint32_t index, rte_edge_t *edge,
413 int64_t *data)
414{
415 struct dao_graph_feature *df = dao_graph_feature_get(dfl, index);
416 struct dao_graph_feature_data *dfd = NULL;
417
418 dfd = dao_graph_feature_data_get(df, feature);
419
420#ifdef DAO_GRAPH_FEATURE_ARC_DEBUG
422 if (unlikely(dfd->feature_data_index != feature))
423 return -1;
424
425 if (unlikely(!edge && !data))
426 return -1;
427#endif
428
429 *edge = dfd->edge_to_this_feature;
430 *data = dfd->data;
431
432 return 0;
433}
434
457static inline int
459 dao_graph_feature_t feature,
460 uint32_t index, rte_edge_t *edge,
461 int64_t *data)
462{
463 struct dao_graph_feature *df = dao_graph_feature_get(dfl, index);
464 struct dao_graph_feature_data *dfd = NULL;
465
466 dfd = dao_graph_feature_data_get(df, feature);
467
468#ifdef DAO_GRAPH_FEATURE_ARC_DEBUG
470 if (unlikely(dfd->feature_data_index != feature))
471 return -1;
472
473 if (unlikely(!edge && !data))
474 return -1;
475#endif
476
477 *edge = dfd->edge_to_next_feature;
478 *data = dfd->data;
479
480 return 0;
481}
482
502static inline int
504 dao_graph_feature_t feature,
505 uint32_t index, rte_edge_t *edge,
506 int64_t *data)
507{
508 if (feature == DAO_GRAPH_FEATURE_INVALID_VALUE)
509 return dao_graph_feature_arc_first_feature_data_get(dfl, feature, index, edge,
510 data);
511 else
512 return dao_graph_feature_arc_next_feature_data_get(dfl, feature, index, edge, data);
513}
514
515#ifdef __cplusplus
516}
517#endif
518#endif
#define DAO_GRAPH_FEATURE_MAX_PER_ARC
uint8_t dao_graph_feature_t
#define DAO_GRAPH_FEATURE_ARC_NAMELEN
uint64_t dao_graph_feature_arc_t
static int dao_graph_feature_arc_feature_data_get(struct dao_graph_feature_arc *dfl, dao_graph_feature_t feature, uint32_t index, rte_edge_t *edge, int64_t *data)
static int dao_graph_feature_arc_has_first_feature(struct dao_graph_feature_arc *dfl, uint32_t index, dao_graph_feature_t *feature)
static int dao_graph_feature_arc_next_feature_data_get(struct dao_graph_feature_arc *dfl, dao_graph_feature_t feature, uint32_t index, rte_edge_t *edge, int64_t *data)
static void __dao_graph_prefetch_data_prefetch(struct dao_graph_feature_arc *dfl, int index, dao_graph_feature_t feature)
static int dao_graph_feature_arc_num_enabled_features(struct dao_graph_feature_arc *arc)
static void dao_graph_feature_arc_prefetch(struct dao_graph_feature_arc *dfl, uint32_t index)
struct feature_arc_main dao_graph_feature_arc_main_t
static int dao_graph_feature_arc_has_feature(struct dao_graph_feature_arc *dfl, uint32_t index, dao_graph_feature_t *feature)
static int dao_graph_feature_arc_has_next_feature(struct dao_graph_feature_arc *dfl, uint32_t index, dao_graph_feature_t *feature)
struct dao_graph_feature_data dao_graph_feature_data_t
static void dao_graph_feature_data_prefetch(struct dao_graph_feature_arc *dfl, uint32_t index, dao_graph_feature_t feature)
static struct dao_graph_feature_data * dao_graph_feature_data_get(struct dao_graph_feature *df, uint8_t feature_index)
static struct dao_graph_feature * dao_graph_feature_get(struct dao_graph_feature_arc *dfl, uint32_t index)
static int dao_graph_feature_arc_first_feature_data_get(struct dao_graph_feature_arc *dfl, dao_graph_feature_t feature, uint32_t index, rte_edge_t *edge, int64_t *data)
struct rte_node_register * start_node
STAILQ_HEAD(, dao_graph_feature_node_list) all_features
struct dao_graph_feature * features_by_index
struct dao_graph_feature_node_list * node_info
struct dao_graph_feature_node_list * node_info
struct dao_graph_feature_data feature_data[DAO_GRAPH_FEATURE_MAX_PER_ARC]
dao_graph_feature_arc_t feature_arcs[]