DPDK  22.03.0
rte_power_empty_poll.h
Go to the documentation of this file.
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 
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 
75  /* Used for training only */
76  struct freq_threshold thresh[NUM_FREQ];
77  enum freq_val cur_freq;
78 
79  /* bucket arrays to calculate the averages */
80  /* edpi mean empty poll counter difference per interval */
81  uint64_t edpi_av[BINS_AV];
82  /* empty poll counter */
83  uint32_t ec;
84 
85  uint32_t lcore_id;
86  uint32_t iter_counter;
87  uint32_t threshold_ctr;
88  uint32_t display_ctr;
89  uint8_t dev_id;
90 
92 
93 
94 struct stats_data {
95 
96  struct priority_worker wrk_stats[NUM_NODES];
97 
98  /* flag to stop rx threads processing packets until training over */
99  bool start_rx;
100 
101 };
102 
103 /* Empty Poll Parameters */
104 struct ep_params {
105 
106  /* Timer related stuff */
107  uint64_t interval_ticks;
108  uint32_t max_train_iter;
109 
110  struct rte_timer timer0;
111  struct stats_data wrk_data;
112 };
113 
114 
115 /* Sample App Init information */
116 struct ep_policy {
117 
118  uint64_t med_base_edpi;
119  uint64_t hgh_base_edpi;
120 
121  enum queue_state state;
122 };
123 
124 
125 
140 __rte_experimental
141 int
142 rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb,
143  struct ep_policy *policy);
144 
148 __rte_experimental
149 void
151 
163 __rte_experimental
164 int
165 rte_power_empty_poll_stat_update(unsigned int lcore_id);
166 
179 __rte_experimental
180 int
181 rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt);
182 
192 __rte_experimental
193 uint64_t
194 rte_power_empty_poll_stat_fetch(unsigned int lcore_id);
195 
205 __rte_experimental
206 uint64_t
207 rte_power_poll_stat_fetch(unsigned int lcore_id);
208 
217 __rte_experimental
218 void
219 rte_empty_poll_detection(struct rte_timer *tim, void *arg);
220 
221 #ifdef __cplusplus
222 }
223 #endif
224 
225 #endif
__rte_experimental uint64_t rte_power_poll_stat_fetch(unsigned int lcore_id)
__rte_experimental int rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt)
__rte_experimental void rte_power_empty_poll_stat_free(void)
__rte_experimental void rte_empty_poll_detection(struct rte_timer *tim, void *arg)
__rte_experimental int rte_power_empty_poll_stat_update(unsigned int lcore_id)
#define __rte_cache_aligned
Definition: rte_common.h:402
__rte_experimental uint64_t rte_power_empty_poll_stat_fetch(unsigned int lcore_id)
__rte_experimental int rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb, struct ep_policy *policy)