37 #include <sys/types.h>
45 #include <qb/qblist.h>
46 #include <qb/qbipcs.h>
47 #include <qb/qbipc_common.h>
68 #define MAX_SCHEDMISS_EVENTS 10
70 static unsigned int highest_schedmiss_event;
72 #define SCHEDMISS_PREFIX "stats.schedmiss"
209 #define NUM_PG_STATS (sizeof(cs_pg_stats) / sizeof(struct cs_stats_conv))
210 #define NUM_SRP_STATS (sizeof(cs_srp_stats) / sizeof(struct cs_stats_conv))
211 #define NUM_KNET_STATS (sizeof(cs_knet_stats) / sizeof(struct cs_stats_conv))
212 #define NUM_KNET_HANDLE_STATS (sizeof(cs_knet_handle_stats) / sizeof(struct cs_stats_conv))
213 #define NUM_IPCSC_STATS (sizeof(cs_ipcs_conn_stats) / sizeof(struct cs_stats_conv))
214 #define NUM_IPCSG_STATS (sizeof(cs_ipcs_global_stats) / sizeof(struct cs_stats_conv))
230 struct qb_list_head
list;
247 *value_len = strlen((
char *)(stat_array) + conv->
offset)+1;
251 assert(value_len != NULL);
253 memcpy(
value, (
char *)(stat_array) + conv->
offset, *value_len);
257 static void stats_add_entry(
const char *key,
struct cs_stats_conv *cs_conv)
267 static void stats_rm_entry(
const char *key)
277 static void stats_map_free_cb(uint32_t event,
278 char* key,
void* old_value,
320 err = qb_map_notify_add(
stats_map, NULL, stats_map_free_cb, QB_MAP_NOTIFY_FREE, NULL);
333 struct knet_link_status link_status;
336 struct knet_handle_stats knet_handle_stats;
342 unsigned int sm_event;
352 switch (statinfo->
type) {
355 stats_map_set_value(statinfo, pg_stats,
value, value_len,
type);
359 stats_map_set_value(statinfo, pg_stats->
srp,
value, value_len,
type);
361 case STAT_KNET_HANDLE:
366 stats_map_set_value(statinfo, &knet_handle_stats,
value, value_len,
type);
369 if (sscanf(key_name,
"stats.knet.node%d.link%d", &
nodeid, &link_no) != 2) {
374 if (nodeid <= 0 || nodeid > KNET_MAX_HOST ||
375 link_no < 0 || link_no > KNET_MAX_LINK) {
384 stats_map_set_value(statinfo, &link_status,
value, value_len,
type);
387 if (sscanf(key_name,
"stats.ipcs.service%d.%d.%p", &service_id, &pid, &conn_ptr) != 3) {
405 sm_type = strrchr(key_name,
'.');
406 if (sm_type == NULL) {
411 if (strcmp(sm_type,
"timestamp") == 0) {
412 memcpy(
value, &schedmiss_event[sm_event].timestamp,
sizeof(uint64_t));
413 *value_len =
sizeof(uint64_t);
416 if (strcmp(sm_type,
"delay") == 0) {
417 memcpy(
value, &schedmiss_event[sm_event].delay,
sizeof(
float));
418 *value_len =
sizeof(float);
428 static void schedmiss_clear_stats(
void)
434 if (i < highest_schedmiss_event) {
436 stats_rm_entry(
param);
438 stats_rm_entry(
param);
440 schedmiss_event[i].
timestamp = (uint64_t)0LL;
441 schedmiss_event[i].
delay = 0.0f;
443 highest_schedmiss_event = 0;
455 schedmiss_event[i+1].
delay = schedmiss_event[i].
delay;
459 schedmiss_event[0].
timestamp = timestamp;
460 schedmiss_event[0].
delay = delay;
468 highest_schedmiss_event++;
473 #define STATS_CLEAR "stats.clear."
474 #define STATS_CLEAR_KNET "stats.clear.knet"
475 #define STATS_CLEAR_IPC "stats.clear.ipc"
476 #define STATS_CLEAR_TOTEM "stats.clear.totem"
477 #define STATS_CLEAR_ALL "stats.clear.all"
478 #define STATS_CLEAR_SCHEDMISS "stats.clear.schedmiss"
500 schedmiss_clear_stats();
506 schedmiss_clear_stats();
537 return (qb_map_pref_iter_create(
stats_map, prefix));
546 res = qb_map_iter_next(iter, (
void **)&item);
550 stats_map_set_value(item->cs_conv, NULL, NULL, value_len,
type);
557 qb_map_iter_free(iter);
564 struct qb_list_head *iter;
572 qb_list_for_each(iter, &stats_tracker_list_head) {
586 old_val.
len = new_val.
len = value_len;
599 static void stats_map_notify_fn(uint32_t event,
char *key,
void *old_value,
void *
value,
void *
user_data)
606 if (
value == NULL && old_value == NULL) {
615 new_val.
data = new_value;
619 &new_val.type) !=
CS_OK) {
627 memcpy(&old_val, &new_val,
sizeof(new_val));
662 tracker->
events = track_type;
694 qb_list_add (&tracker->
list, &stats_tracker_list_head);
708 tracker->
key_name, stats_map_notify_fn,
715 qb_list_del(&tracker->
list);
747 stats_rm_entry(
param);
782 stats_rm_entry(
param);