Skip to content

Commit 7d29e32

Browse files
Ole Troanayourtch
authored andcommitted
stats: remove offsets on vpp side
Represent pointers directly in shared memory and require clients to adjust for shared memory segment being mapped at different base address. Deprecated: stat_segment_pointer() / stat_segment_offset() Added: stat_segment_adjust() Bumped the stat segment version to 2. Type: refactor Signed-off-by: Ole Troan <ot@cisco.com> Change-Id: I33e756187b8903b45dcd353e6c1a101b7a4acb79
1 parent ff40d8f commit 7d29e32

File tree

7 files changed

+82
-209
lines changed

7 files changed

+82
-209
lines changed

src/plugins/mactime/mactime_top.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include <vppinfra/time.h>
22
#include <vppinfra/hash.h>
33
#include <vppinfra/pool.h>
4-
#include <vpp/stats/stat_segment.h>
54
#include <vpp-api/client/stat_client.h>
65
#include <vppinfra/vec.h>
76
#include <mactime/mactime_device.h>
@@ -11,9 +10,9 @@
1110
#include <vnet/api_errno.h>
1211
#include <svm/queue.h>
1312

14-
/* define message IDs */
15-
#include <mactime/mactime.api_enum.h>
13+
#include <vnet/format_fns.h>
1614
#include <mactime/mactime.api_types.h>
15+
#include <mactime/mactime.api_enum.h>
1716

1817
typedef struct
1918
{
@@ -108,14 +107,18 @@ vl_api_mactime_details_t_handler (vl_api_mactime_details_t * mp)
108107
}
109108

110109
#define vl_print(handle, ...) fformat(handle, __VA_ARGS__)
110+
#define vl_endianfun /* define message structures */
111+
#include <mactime/mactime.api.h>
112+
#undef vl_endianfun
111113

112-
#define vl_endianfun
114+
/* instantiate all the print functions we know about */
113115
#define vl_printfun
116+
#include <mactime/mactime.api.h>
117+
#undef vl_printfun
118+
114119
#define vl_api_version(n,v) static u32 api_version = v;
115120
#include <mactime/mactime.api.h>
116121
#undef vl_api_version
117-
#undef vl_printfun
118-
#undef vl_endianfun
119122

120123
static int
121124
connect_to_vpp (char *name)
@@ -137,7 +140,7 @@ connect_to_vpp (char *name)
137140

138141
vec_free (msg_base_lookup_name);
139142

140-
if (mm->msg_id_base == ~0)
143+
if (mm->msg_id_base == (u16) ~ 0)
141144
return -1;
142145

143146
#define _(N,n) \
@@ -183,7 +186,6 @@ scrape_stats_segment (mt_main_t * mm)
183186
{
184187
vlib_counter_t **counters_by_thread;
185188
vlib_counter_t *counters;
186-
u64 *offset_vector;
187189
mactime_device_t *dev;
188190
stat_segment_access_t sa;
189191
stat_client_main_t *sm = mm->stat_client_main;
@@ -217,8 +219,7 @@ scrape_stats_segment (mt_main_t * mm)
217219
stat_segment_access_start (&sa, sm);
218220

219221
ep = vec_elt_at_index (sm->directory_vector, mm->ls_result1[0]);
220-
counters_by_thread = stat_segment_pointer (sm->shared_header, ep->offset);
221-
offset_vector = stat_segment_pointer (sm->shared_header, ep->offset_vector);
222+
counters_by_thread = stat_segment_adjust (sm, ep->data);
222223

223224
for (i = 0; i < vec_len (pool_indices); i++)
224225
{
@@ -230,8 +231,7 @@ scrape_stats_segment (mt_main_t * mm)
230231

231232
for (j = 0; j < vec_len (counters_by_thread); j++)
232233
{
233-
counters = stat_segment_pointer (sm->shared_header,
234-
offset_vector[j]);
234+
counters = stat_segment_adjust (sm, counters_by_thread[j]);
235235
mm->allow_counters[index].packets += counters[index].packets;
236236
mm->allow_counters[index].bytes += counters[index].bytes;
237237
}
@@ -252,8 +252,7 @@ scrape_stats_segment (mt_main_t * mm)
252252
stat_segment_access_start (&sa, sm);
253253

254254
ep = vec_elt_at_index (sm->directory_vector, mm->ls_result2[0]);
255-
counters_by_thread = stat_segment_pointer (sm->shared_header, ep->offset);
256-
offset_vector = stat_segment_pointer (sm->shared_header, ep->offset_vector);
255+
counters_by_thread = stat_segment_adjust (sm, ep->data);
257256

258257
for (i = 0; i < vec_len (pool_indices); i++)
259258
{
@@ -265,8 +264,7 @@ scrape_stats_segment (mt_main_t * mm)
265264

266265
for (j = 0; j < vec_len (counters_by_thread); j++)
267266
{
268-
counters = stat_segment_pointer (sm->shared_header,
269-
offset_vector[j]);
267+
counters = stat_segment_adjust (sm, counters_by_thread[j]);
270268
mm->drop_counters[index].packets += counters[index].packets;
271269
mm->drop_counters[index].bytes += counters[index].bytes;
272270
}

src/vpp-api/client/stat_client.c

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ static stat_segment_directory_entry_t *
8585
get_stat_vector_r (stat_client_main_t * sm)
8686
{
8787
ASSERT (sm->shared_header);
88-
return stat_segment_pointer (sm->shared_header,
89-
sm->shared_header->directory_offset);
88+
return stat_segment_adjust (sm,
89+
(void *) sm->shared_header->directory_vector);
9090
}
9191

9292
int
@@ -142,7 +142,7 @@ stat_segment_connect_r (const char *socket_name, stat_client_main_t * sm)
142142
sm->memory_size = st.st_size;
143143
sm->shared_header = memaddr;
144144
sm->directory_vector =
145-
stat_segment_pointer (memaddr, sm->shared_header->directory_offset);
145+
stat_segment_adjust (sm, (void *) sm->shared_header->directory_vector);
146146

147147
return 0;
148148
}
@@ -199,7 +199,7 @@ copy_data (stat_segment_directory_entry_t * ep, stat_client_main_t * sm)
199199
int i;
200200
vlib_counter_t **combined_c; /* Combined counter */
201201
counter_t **simple_c; /* Simple counter */
202-
uint64_t *offset_vector;
202+
uint64_t *error_vector;
203203

204204
assert (sm->shared_header);
205205

@@ -212,67 +212,47 @@ copy_data (stat_segment_directory_entry_t * ep, stat_client_main_t * sm)
212212
break;
213213

214214
case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
215-
if (ep->offset == 0)
216-
return result;
217-
simple_c = stat_segment_pointer (sm->shared_header, ep->offset);
215+
simple_c = stat_segment_adjust (sm, ep->data);
218216
result.simple_counter_vec = vec_dup (simple_c);
219-
offset_vector =
220-
stat_segment_pointer (sm->shared_header, ep->offset_vector);
221217
for (i = 0; i < vec_len (simple_c); i++)
222218
{
223-
counter_t *cb =
224-
stat_segment_pointer (sm->shared_header, offset_vector[i]);
219+
counter_t *cb = stat_segment_adjust (sm, simple_c[i]);
225220
result.simple_counter_vec[i] = vec_dup (cb);
226221
}
227222
break;
228223

229224
case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
230-
if (ep->offset == 0)
231-
return result;
232-
combined_c = stat_segment_pointer (sm->shared_header, ep->offset);
225+
combined_c = stat_segment_adjust (sm, ep->data);
233226
result.combined_counter_vec = vec_dup (combined_c);
234-
offset_vector =
235-
stat_segment_pointer (sm->shared_header, ep->offset_vector);
236227
for (i = 0; i < vec_len (combined_c); i++)
237228
{
238-
vlib_counter_t *cb =
239-
stat_segment_pointer (sm->shared_header, offset_vector[i]);
229+
vlib_counter_t *cb = stat_segment_adjust (sm, combined_c[i]);
240230
result.combined_counter_vec[i] = vec_dup (cb);
241231
}
242232
break;
243233

244234
case STAT_DIR_TYPE_ERROR_INDEX:
245235
/* Gather errors from all threads into a vector */
246-
offset_vector = stat_segment_pointer (sm->shared_header,
247-
sm->shared_header->error_offset);
248-
vec_validate (result.error_vector, vec_len (offset_vector) - 1);
249-
for (i = 0; i < vec_len (offset_vector); i++)
236+
error_vector =
237+
stat_segment_adjust (sm, (void *) sm->shared_header->error_vector);
238+
vec_validate (result.error_vector, vec_len (error_vector) - 1);
239+
for (i = 0; i < vec_len (error_vector); i++)
250240
{
251-
counter_t *cb =
252-
stat_segment_pointer (sm->shared_header, offset_vector[i]);
241+
counter_t *cb = stat_segment_adjust (sm, (void *) error_vector[i]);
253242
result.error_vector[i] = cb[ep->index];
254243
}
255244
break;
256245

257246
case STAT_DIR_TYPE_NAME_VECTOR:
258-
if (ep->offset == 0)
259-
return result;
260-
uint8_t **name_vector =
261-
stat_segment_pointer (sm->shared_header, ep->offset);
262-
result.name_vector = vec_dup (name_vector);
263-
offset_vector =
264-
stat_segment_pointer (sm->shared_header, ep->offset_vector);
265-
for (i = 0; i < vec_len (name_vector); i++)
266-
{
267-
if (offset_vector[i])
268-
{
269-
u8 *name =
270-
stat_segment_pointer (sm->shared_header, offset_vector[i]);
271-
result.name_vector[i] = vec_dup (name);
272-
}
273-
else
274-
result.name_vector[i] = 0;
275-
}
247+
{
248+
uint8_t **name_vector = stat_segment_adjust (sm, ep->data);
249+
result.name_vector = vec_dup (name_vector);
250+
for (i = 0; i < vec_len (name_vector); i++)
251+
{
252+
u8 *name = stat_segment_adjust (sm, name_vector[i]);
253+
result.name_vector[i] = vec_dup (name);
254+
}
255+
}
276256
break;
277257

278258
case STAT_DIR_TYPE_EMPTY:

src/vpp-api/client/stat_client.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ _time_now_nsec (void)
101101
return 1e9 * ts.tv_sec + ts.tv_nsec;
102102
}
103103

104+
static inline void *
105+
stat_segment_adjust (stat_client_main_t * sm, void *data)
106+
{
107+
return (void *) ((char *) sm->shared_header +
108+
((char *) data - (char *) sm->shared_header->base));
109+
}
110+
104111
static inline int
105112
stat_segment_access_start (stat_segment_access_t * sa,
106113
stat_client_main_t * sm)
@@ -120,9 +127,10 @@ stat_segment_access_start (stat_segment_access_t * sa,
120127
while (shared_header->in_progress != 0)
121128
;
122129
}
123-
sm->directory_vector = (stat_segment_directory_entry_t *)
124-
stat_segment_pointer (sm->shared_header,
125-
sm->shared_header->directory_offset);
130+
sm->directory_vector =
131+
(stat_segment_directory_entry_t *) stat_segment_adjust (sm,
132+
(void *)
133+
sm->shared_header->directory_vector);
126134
if (sm->timeout)
127135
return _time_now_nsec () < max_time ? 0 : -1;
128136
return 0;
@@ -147,7 +155,6 @@ stat_segment_access_end (stat_segment_access_t * sa, stat_client_main_t * sm)
147155
return true;
148156
}
149157

150-
151158
#endif /* included_stat_client_h */
152159

153160
/*

src/vpp-api/python/vpp_papi/vpp_stats.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@
2525
{
2626
stat_directory_type_t type;
2727
union {
28-
uint64_t offset;
2928
uint64_t index;
3029
uint64_t value;
30+
uint64_t *data;
3131
};
32-
uint64_t offset_vector;
3332
char name[128]; // TODO change this to pointer to "somewhere"
3433
} stat_segment_directory_entry_t;
3534
@@ -50,11 +49,11 @@
5049
typedef struct
5150
{
5251
uint64_t version;
52+
void *base;
5353
uint64_t epoch;
5454
uint64_t in_progress;
55-
uint64_t directory_offset;
56-
uint64_t error_offset;
57-
uint64_t stats_offset;
55+
stat_segment_directory_entry_t *directory_vector;
56+
uint64_t **error_vector;
5857
} stat_segment_shared_header_t;
5958
6059
typedef struct

0 commit comments

Comments
 (0)