]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/lib/librte_meter/rte_meter.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / seastar / dpdk / lib / librte_meter / rte_meter.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation
3 */
4
5 #include <inttypes.h>
6 #include <stdio.h>
7 #include <math.h>
8
9 #include <rte_common.h>
10 #include <rte_log.h>
11 #include <rte_cycles.h>
12
13 #include "rte_meter.h"
14
15 #ifndef RTE_METER_TB_PERIOD_MIN
16 #define RTE_METER_TB_PERIOD_MIN 100
17 #endif
18
19 static void
20 rte_meter_get_tb_params(uint64_t hz, uint64_t rate, uint64_t *tb_period, uint64_t *tb_bytes_per_period)
21 {
22 double period;
23
24 if (rate == 0) {
25 *tb_bytes_per_period = 0;
26 *tb_period = RTE_METER_TB_PERIOD_MIN;
27 return;
28 }
29
30 period = ((double) hz) / ((double) rate);
31
32 if (period >= RTE_METER_TB_PERIOD_MIN) {
33 *tb_bytes_per_period = 1;
34 *tb_period = (uint64_t) period;
35 } else {
36 *tb_bytes_per_period = (uint64_t) ceil(RTE_METER_TB_PERIOD_MIN / period);
37 *tb_period = (hz * (*tb_bytes_per_period)) / rate;
38 }
39 }
40
41 int
42 rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
43 struct rte_meter_srtcm_params *params)
44 {
45 uint64_t hz = rte_get_tsc_hz();
46
47 /* Check input parameters */
48 if ((p == NULL) ||
49 (params == NULL) ||
50 (params->cir == 0) ||
51 ((params->cbs == 0) && (params->ebs == 0)))
52 return -EINVAL;
53
54 /* Initialize srTCM run-time structure */
55 p->cbs = params->cbs;
56 p->ebs = params->ebs;
57 rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
58 &p->cir_bytes_per_period);
59
60 return 0;
61 }
62
63 int
64 rte_meter_srtcm_config(struct rte_meter_srtcm *m,
65 struct rte_meter_srtcm_profile *p)
66 {
67 /* Check input parameters */
68 if ((m == NULL) || (p == NULL))
69 return -EINVAL;
70
71 /* Initialize srTCM run-time structure */
72 m->time = rte_get_tsc_cycles();
73 m->tc = p->cbs;
74 m->te = p->ebs;
75
76 return 0;
77 }
78
79 int
80 rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
81 struct rte_meter_trtcm_params *params)
82 {
83 uint64_t hz = rte_get_tsc_hz();
84
85 /* Check input parameters */
86 if ((p == NULL) ||
87 (params == NULL) ||
88 (params->cir == 0) ||
89 (params->pir == 0) ||
90 (params->pir < params->cir) ||
91 (params->cbs == 0) ||
92 (params->pbs == 0))
93 return -EINVAL;
94
95 /* Initialize trTCM run-time structure */
96 p->cbs = params->cbs;
97 p->pbs = params->pbs;
98 rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
99 &p->cir_bytes_per_period);
100 rte_meter_get_tb_params(hz, params->pir, &p->pir_period,
101 &p->pir_bytes_per_period);
102
103 return 0;
104 }
105
106 int
107 rte_meter_trtcm_config(struct rte_meter_trtcm *m,
108 struct rte_meter_trtcm_profile *p)
109 {
110 /* Check input parameters */
111 if ((m == NULL) || (p == NULL))
112 return -EINVAL;
113
114 /* Initialize trTCM run-time structure */
115 m->time_tc = m->time_tp = rte_get_tsc_cycles();
116 m->tc = p->cbs;
117 m->tp = p->pbs;
118
119 return 0;
120 }
121
122 int __rte_experimental
123 rte_meter_trtcm_rfc4115_profile_config(
124 struct rte_meter_trtcm_rfc4115_profile *p,
125 struct rte_meter_trtcm_rfc4115_params *params)
126 {
127 uint64_t hz = rte_get_tsc_hz();
128
129 /* Check input parameters */
130 if ((p == NULL) ||
131 (params == NULL) ||
132 (params->cir != 0 && params->cbs == 0) ||
133 (params->eir != 0 && params->ebs == 0))
134 return -EINVAL;
135
136 /* Initialize trTCM run-time structure */
137 p->cbs = params->cbs;
138 p->ebs = params->ebs;
139 rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
140 &p->cir_bytes_per_period);
141 rte_meter_get_tb_params(hz, params->eir, &p->eir_period,
142 &p->eir_bytes_per_period);
143
144 return 0;
145 }
146
147 int __rte_experimental
148 rte_meter_trtcm_rfc4115_config(
149 struct rte_meter_trtcm_rfc4115 *m,
150 struct rte_meter_trtcm_rfc4115_profile *p)
151 {
152 /* Check input parameters */
153 if ((m == NULL) || (p == NULL))
154 return -EINVAL;
155
156 /* Initialize trTCM run-time structure */
157 m->time_tc = m->time_te = rte_get_tsc_cycles();
158 m->tc = p->cbs;
159 m->te = p->ebs;
160
161 return 0;
162 }