]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/lib/librte_power/rte_power_empty_poll.h
33f24e0c33d5bce422e80c8e59c1ea22357bac3a
[ceph.git] / ceph / src / spdk / dpdk / lib / librte_power / rte_power_empty_poll.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2018 Intel Corporation
3 */
4
5 #ifndef _RTE_EMPTY_POLL_H
6 #define _RTE_EMPTY_POLL_H
7
8 /**
9 * @file
10 * RTE Power Management
11 */
12 #include <stdint.h>
13 #include <stdbool.h>
14
15 #include <rte_common.h>
16 #include <rte_byteorder.h>
17 #include <rte_log.h>
18 #include <rte_string_fns.h>
19 #include <rte_power.h>
20 #include <rte_timer.h>
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 #define NUM_FREQS RTE_MAX_LCORE_FREQS
27
28 #define BINS_AV 4 /* Has to be ^2 */
29
30 #define DROP (NUM_DIRECTIONS * NUM_DEVICES)
31
32 #define NUM_PRIORITIES 2
33
34 #define NUM_NODES 256 /* Max core number*/
35
36 /* Processor Power State */
37 enum freq_val {
38 LOW,
39 MED,
40 HGH,
41 NUM_FREQ = NUM_FREQS
42 };
43
44
45 /* Queue Polling State */
46 enum queue_state {
47 TRAINING, /* NO TRAFFIC */
48 MED_NORMAL, /* MED */
49 HGH_BUSY, /* HIGH */
50 LOW_PURGE, /* LOW */
51 };
52
53 /* Queue Stats */
54 struct freq_threshold {
55
56 uint64_t base_edpi;
57 bool trained;
58 uint32_t threshold_percent;
59 uint32_t cur_train_iter;
60 };
61
62 /* Each Worker Thread Empty Poll Stats */
63 struct priority_worker {
64
65 /* Current dequeue and throughput counts */
66 /* These 2 are written to by the worker threads */
67 /* So keep them on their own cache line */
68 uint64_t empty_dequeues;
69 uint64_t num_dequeue_pkts;
70
71 enum queue_state queue_state;
72
73 uint64_t empty_dequeues_prev;
74 uint64_t num_dequeue_pkts_prev;
75
76 /* Used for training only */
77 struct freq_threshold thresh[NUM_FREQ];
78 enum freq_val cur_freq;
79
80 /* bucket arrays to calculate the averages */
81 /* edpi mean empty poll counter difference per interval */
82 uint64_t edpi_av[BINS_AV];
83 /* empty poll counter */
84 uint32_t ec;
85 /* ppi mean valid poll counter per interval */
86 uint64_t ppi_av[BINS_AV];
87 /* valid poll counter */
88 uint32_t pc;
89
90 uint32_t lcore_id;
91 uint32_t iter_counter;
92 uint32_t threshold_ctr;
93 uint32_t display_ctr;
94 uint8_t dev_id;
95
96 } __rte_cache_aligned;
97
98
99 struct stats_data {
100
101 struct priority_worker wrk_stats[NUM_NODES];
102
103 /* flag to stop rx threads processing packets until training over */
104 bool start_rx;
105
106 };
107
108 /* Empty Poll Parameters */
109 struct ep_params {
110
111 /* Timer related stuff */
112 uint64_t interval_ticks;
113 uint32_t max_train_iter;
114
115 struct rte_timer timer0;
116 struct stats_data wrk_data;
117 };
118
119
120 /* Sample App Init information */
121 struct ep_policy {
122
123 uint64_t med_base_edpi;
124 uint64_t hgh_base_edpi;
125
126 enum queue_state state;
127 };
128
129
130
131 /**
132 * Initialize the power management system.
133 *
134 * @param eptr
135 * the structure of empty poll configuration
136 * @param freq_tlb
137 * the power state/frequency mapping table
138 * @param policy
139 * the initialization policy from sample app
140 *
141 * @return
142 * - 0 on success.
143 * - Negative on error.
144 */
145 int __rte_experimental
146 rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb,
147 struct ep_policy *policy);
148
149 /**
150 * Free the resource hold by power management system.
151 */
152 void __rte_experimental
153 rte_power_empty_poll_stat_free(void);
154
155 /**
156 * Update specific core empty poll counter
157 * It's not thread safe.
158 *
159 * @param lcore_id
160 * lcore id
161 *
162 * @return
163 * - 0 on success.
164 * - Negative on error.
165 */
166 int __rte_experimental
167 rte_power_empty_poll_stat_update(unsigned int lcore_id);
168
169 /**
170 * Update specific core valid poll counter, not thread safe.
171 *
172 * @param lcore_id
173 * lcore id.
174 * @param nb_pkt
175 * The packet number of one valid poll.
176 *
177 * @return
178 * - 0 on success.
179 * - Negative on error.
180 */
181 int __rte_experimental
182 rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt);
183
184 /**
185 * Fetch specific core empty poll counter.
186 *
187 * @param lcore_id
188 * lcore id
189 *
190 * @return
191 * Current lcore empty poll counter value.
192 */
193 uint64_t __rte_experimental
194 rte_power_empty_poll_stat_fetch(unsigned int lcore_id);
195
196 /**
197 * Fetch specific core valid poll counter.
198 *
199 * @param lcore_id
200 * lcore id
201 *
202 * @return
203 * Current lcore valid poll counter value.
204 */
205 uint64_t __rte_experimental
206 rte_power_poll_stat_fetch(unsigned int lcore_id);
207
208 /**
209 * Empty poll state change detection function
210 *
211 * @param tim
212 * The timer structure
213 * @param arg
214 * The customized parameter
215 */
216 void __rte_experimental
217 rte_empty_poll_detection(struct rte_timer *tim, void *arg);
218
219 #ifdef __cplusplus
220 }
221 #endif
222
223 #endif