DPDK 21.11.9
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
23extern "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 */
37enum freq_val {
38 LOW,
39 MED,
40 HGH,
41 NUM_FREQ = NUM_FREQS
42};
43
44
45/* Queue Polling State */
46enum queue_state {
47 TRAINING, /* NO TRAFFIC */
48 MED_NORMAL, /* MED */
49 HGH_BUSY, /* HIGH */
50 LOW_PURGE, /* LOW */
51};
52
53/* Queue Stats */
54struct 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 */
63struct 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
94struct 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 */
104struct 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 */
116struct 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
141int
142rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb,
143 struct ep_policy *policy);
144
148__rte_experimental
149void
151
163__rte_experimental
164int
165rte_power_empty_poll_stat_update(unsigned int lcore_id);
166
179__rte_experimental
180int
181rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt);
182
192__rte_experimental
193uint64_t
194rte_power_empty_poll_stat_fetch(unsigned int lcore_id);
195
205__rte_experimental
206uint64_t
207rte_power_poll_stat_fetch(unsigned int lcore_id);
208
217__rte_experimental
218void
219rte_empty_poll_detection(struct rte_timer *tim, void *arg);
220
221#ifdef __cplusplus
222}
223#endif
224
225#endif
#define __rte_cache_aligned
Definition: rte_common.h:420
__rte_experimental uint64_t rte_power_empty_poll_stat_fetch(unsigned int lcore_id)
__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)
__rte_experimental int rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt)
__rte_experimental int rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb, struct ep_policy *policy)
__rte_experimental uint64_t rte_power_poll_stat_fetch(unsigned int lcore_id)
__rte_experimental void rte_power_empty_poll_stat_free(void)