xref: /dpdk/lib/member/rte_member_sketch.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4 
5 #ifndef RTE_MEMBER_SKETCH_H
6 #define RTE_MEMBER_SKETCH_H
7 
8 #include <rte_vect.h>
9 #include <rte_ring_elem.h>
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #define NUM_ROW_SCALAR 5
16 #define INTERVAL (1 << 15)
17 
18 #if !RTE_IS_POWER_OF_2(INTERVAL)
19 #error sketch INTERVAL macro must be a power of 2
20 #endif
21 
22 int
23 rte_member_create_sketch(struct rte_member_setsum *ss,
24 			 const struct rte_member_parameters *params,
25 			 struct rte_ring *r);
26 
27 int
28 rte_member_lookup_sketch(const struct rte_member_setsum *setsum,
29 			 const void *key, member_set_t *set_id);
30 
31 int
32 rte_member_add_sketch(const struct rte_member_setsum *setsum,
33 		      const void *key,
34 		      member_set_t set_id);
35 
36 int
37 rte_member_add_sketch_byte_count(const struct rte_member_setsum *ss,
38 				 const void *key, uint32_t byte_count);
39 
40 void
41 sketch_update_scalar(const struct rte_member_setsum *ss,
42 		     const void *key,
43 		     uint32_t count);
44 
45 uint64_t
46 sketch_lookup_scalar(const struct rte_member_setsum *ss,
47 		     const void *key);
48 
49 void
50 sketch_delete_scalar(const struct rte_member_setsum *ss,
51 		     const void *key);
52 
53 int
54 rte_member_delete_sketch(const struct rte_member_setsum *setsum,
55 			 const void *key);
56 
57 int
58 rte_member_query_sketch(const struct rte_member_setsum *setsum,
59 			const void *key, uint64_t *output);
60 
61 void
62 rte_member_free_sketch(struct rte_member_setsum *ss);
63 
64 void
65 rte_member_reset_sketch(const struct rte_member_setsum *setsum);
66 
67 int
68 rte_member_report_heavyhitter_sketch(const struct rte_member_setsum *setsum,
69 				     void **key, uint64_t *count);
70 
71 void
72 rte_member_update_heap(const struct rte_member_setsum *ss);
73 
74 static __rte_always_inline uint64_t
75 count_min(const struct rte_member_setsum *ss, const uint32_t *hash_results)
76 {
77 	uint64_t *count_array = ss->table;
78 	uint64_t count;
79 	uint32_t cur_row;
80 	uint64_t min = UINT64_MAX;
81 
82 	for (cur_row = 0; cur_row < ss->num_row; cur_row++) {
83 		uint64_t cnt = count_array[cur_row * ss->num_col + hash_results[cur_row]];
84 
85 		if (cnt < min)
86 			min = cnt;
87 	}
88 	count = min;
89 
90 	return count;
91 }
92 
93 #ifdef __cplusplus
94 }
95 #endif
96 
97 #endif /* RTE_MEMBER_SKETCH_H */
98