71#include "em_libconfig.h"
88 pid_t ext_tids[ODP_THREAD_COUNT_MAX];
89 int ext_thr_ids[ODP_THREAD_COUNT_MAX];
94static const char *cpu_arch_name(odp_cpu_arch_t cpu_arch)
97 case ODP_CPU_ARCH_ARM:
99 case ODP_CPU_ARCH_MIPS:
101 case ODP_CPU_ARCH_PPC:
103 case ODP_CPU_ARCH_RISCV:
105 case ODP_CPU_ARCH_X86:
112static const char *arm_isa_name(odp_cpu_arch_arm_t isa)
115 case ODP_CPU_ARCH_ARMV6:
117 case ODP_CPU_ARCH_ARMV7:
119 case ODP_CPU_ARCH_ARMV8_0:
121 case ODP_CPU_ARCH_ARMV8_1:
123 case ODP_CPU_ARCH_ARMV8_2:
125 case ODP_CPU_ARCH_ARMV8_3:
127 case ODP_CPU_ARCH_ARMV8_4:
129 case ODP_CPU_ARCH_ARMV8_5:
131 case ODP_CPU_ARCH_ARMV8_6:
133 case ODP_CPU_ARCH_ARMV8_7:
135 case ODP_CPU_ARCH_ARMV9_0:
137 case ODP_CPU_ARCH_ARMV9_1:
139 case ODP_CPU_ARCH_ARMV9_2:
141 case ODP_CPU_ARCH_ARMV8_8:
143 case ODP_CPU_ARCH_ARMV8_9:
145 case ODP_CPU_ARCH_ARMV9_3:
152static const char *x86_isa_name(odp_cpu_arch_x86_t isa)
155 case ODP_CPU_ARCH_X86_I686:
157 case ODP_CPU_ARCH_X86_64:
164static const char *cpu_arch_isa_name(odp_cpu_arch_t cpu_arch,
165 odp_cpu_arch_isa_t cpu_arch_isa)
168 case ODP_CPU_ARCH_ARM:
169 return arm_isa_name(cpu_arch_isa.arm);
170 case ODP_CPU_ARCH_MIPS:
172 case ODP_CPU_ARCH_PPC:
174 case ODP_CPU_ARCH_RISCV:
176 case ODP_CPU_ARCH_X86:
177 return x86_isa_name(cpu_arch_isa.x86);
187static odp_cpu_arch_arm_t detect_sw_isa_arm(
void)
189#if defined(__ARM_ARCH)
190 if (__ARM_ARCH == 8) {
191 #ifdef __ARM_FEATURE_QRDMX
193 return ODP_CPU_ARCH_ARMV8_1;
195 return ODP_CPU_ARCH_ARMV8_0;
199 if (__ARM_ARCH == 9) {
201 return ODP_CPU_ARCH_ARMV9_0;
204 if (__ARM_ARCH >= 800) {
210 int major = __ARM_ARCH / 100;
211 int minor = __ARM_ARCH - (major * 100);
216 return ODP_CPU_ARCH_ARMV8_0;
218 return ODP_CPU_ARCH_ARMV8_1;
220 return ODP_CPU_ARCH_ARMV8_2;
222 return ODP_CPU_ARCH_ARMV8_3;
224 return ODP_CPU_ARCH_ARMV8_4;
226 return ODP_CPU_ARCH_ARMV8_5;
228 return ODP_CPU_ARCH_ARMV8_6;
230 return ODP_CPU_ARCH_ARMV8_7;
232 return ODP_CPU_ARCH_ARMV8_8;
234 return ODP_CPU_ARCH_ARMV8_9;
236 return ODP_CPU_ARCH_ARM_UNKNOWN;
238 }
else if (major == 9) {
241 return ODP_CPU_ARCH_ARMV9_0;
243 return ODP_CPU_ARCH_ARMV9_1;
245 return ODP_CPU_ARCH_ARMV9_2;
247 return ODP_CPU_ARCH_ARMV9_3;
249 return ODP_CPU_ARCH_ARM_UNKNOWN;
254 return ODP_CPU_ARCH_ARM_UNKNOWN;
261static odp_cpu_arch_x86_t detect_sw_isa_x86(
void)
263 odp_cpu_arch_x86_t isa_x86 = ODP_CPU_ARCH_X86_UNKNOWN;
265#if defined __x86_64 || defined __x86_64__
266 isa_x86 = ODP_CPU_ARCH_X86_64;
267#elif defined __i686 || defined __i686__
268 isa_x86 = ODP_CPU_ARCH_X86_I686;
273static odp_cpu_arch_mips_t detect_sw_isa_mips(
void)
275 return ODP_CPU_ARCH_MIPS_UNKNOWN;
278static odp_cpu_arch_ppc_t detect_sw_isa_ppc(
void)
280 return ODP_CPU_ARCH_PPC_UNKNOWN;
283static odp_cpu_arch_riscv_t detect_sw_isa_riscv(
void)
285 return ODP_CPU_ARCH_RISCV_UNKNOWN;
292static odp_cpu_arch_isa_t detect_sw_isa(odp_cpu_arch_t cpu_arch)
294 odp_cpu_arch_isa_t sw_isa;
297 case ODP_CPU_ARCH_ARM:
298 sw_isa.arm = detect_sw_isa_arm();
300 case ODP_CPU_ARCH_MIPS:
301 sw_isa.mips = detect_sw_isa_mips();
303 case ODP_CPU_ARCH_PPC:
304 sw_isa.ppc = detect_sw_isa_ppc();
306 case ODP_CPU_ARCH_RISCV:
307 sw_isa.riscv = detect_sw_isa_riscv();
309 case ODP_CPU_ARCH_X86:
310 sw_isa.x86 = detect_sw_isa_x86();
313 sw_isa.arm = ODP_CPU_ARCH_ARM_UNKNOWN;
323 if (unlikely(cnt <= 0))
327 const int logic_last = cur_map->logic_cores[cnt - 1];
330 for (
int i = 0; i <= logic_last; i++) {
331 if (i == cur_map->logic_cores[idx]) {
332 int phys_core = cur_map->phys_cores[idx];
333 char phys_core_str[20];
336 snprintf(phys_core_str,
sizeof(phys_core_str),
"%2d", phys_core);
338 snprintf(phys_core_str,
sizeof(phys_core_str),
" ?");
339 phys_core_str[
sizeof(phys_core_str) - 1] =
'\0';
341 EM_PRINT(
" %2d %s %2d %s %" PRIu64
"\n",
342 cur_map->logic_cores[idx], phys_core_str, cur_map->thr_ids[idx],
344 (uint64_t)cur_map->tids[idx]);
347 EM_PRINT(
" - - - - -\n");
355 if (unlikely(ext_cnt <= 0))
358 for (
int i = 0; i < ext_cnt; i++) {
359 EM_PRINT(
" - - %2d EXT %" PRIu64
"\n",
360 cur_map->ext_thr_ids[i], (uint64_t)cur_map->ext_tids[i]);
364void print_core_map_info(
void)
368 const odp_cpumask_t *
const logic_mask = &core_map->rwlocked.
logic_mask.odp_cpumask;
369 const odp_thrmask_t *
const thrmask_extthrs = &core_map->rwlocked.
thrmask_extthrs;
371 odp_rwlock_read_lock(&core_map->
rwlock);
375 int logic_core = odp_cpumask_first(logic_mask);
378 cur_map->logic_cores[cnt] = logic_core;
380 cur_map->thr_ids[cnt] = core_map->rwlocked.thr_vs_logic.
odp_thr[logic_core];
381 cur_map->tids[cnt] = core_map->rwlocked.
tids[logic_core];
382 cur_map->core_types[cnt] = core_map->rwlocked.
core_types[logic_core];
383 memcpy(cur_map->proc_tid_stat_paths[cnt],
385 sizeof(cur_map->proc_tid_stat_paths[cnt]));
386 logic_core = odp_cpumask_next(logic_mask, logic_core);
392 int ext_thr = odp_thrmask_first(thrmask_extthrs);
394 while (ext_thr >= 0 && ext_cnt < ODP_THREAD_COUNT_MAX) {
395 cur_map->ext_thr_ids[ext_cnt] = ext_thr;
396 cur_map->ext_tids[ext_cnt] = core_map->rwlocked.
ext_tids[ext_thr];
397 ext_thr = odp_thrmask_next(thrmask_extthrs, ext_thr);
401 odp_rwlock_read_unlock(&core_map->
rwlock);
403 if (unlikely(cnt == 0 && ext_cnt == 0))
407 for (uint32_t i = 0; i < cnt; i++) {
408 const char *path = cur_map->proc_tid_stat_paths[i];
410 if (unlikely(path[0] ==
'\0')) {
411 cur_map->phys_cores[i] = -1;
415 FILE *file = fopen(path,
"r");
418 EM_LOG(EM_LOG_ERR,
"fopen(%s) failed: %s (%d)\n",
419 path, strerror(errno), errno);
422 cur_map->phys_cores[i] = read_proc_cpuid(file);
427 EM_PRINT(
"Core mapping:\n"
428 "EM-core <-> phys-core <-> ODP-thread <-> type <-> pid\n");
431 print_em_cores(cur_map, cnt);
434 print_ext_threads(cur_map, ext_cnt);
440 EM_PRINT(
"Core mapping:\n"
441 "EM-core <-> phys-core <-> ODP-thread <-> type <-> pid\n"
445void print_cpu_arch_info(
void)
447 odp_system_info_t sysinfo;
450 err = odp_system_info(&sysinfo);
452 EM_PRINT(
"%s(): odp_system_info() call failed:%d\n",
458 odp_cpu_arch_isa_t isa_em = detect_sw_isa(sysinfo.cpu_arch);
460 const char *cpu_arch = cpu_arch_name(sysinfo.cpu_arch);
461 const char *hw_isa = cpu_arch_isa_name(sysinfo.cpu_arch,
463 const char *sw_isa_odp = cpu_arch_isa_name(sysinfo.cpu_arch,
465 const char *sw_isa_em = cpu_arch_isa_name(sysinfo.cpu_arch, isa_em);
467 EM_PRINT(
"CPU model: %s\n"
469 "CPU ISA version: %s\n"
470 " SW ISA version (ODP): %s\n"
471 " SW ISA version (EM): %s\n"
473 odp_cpu_model_str(), cpu_arch,
474 hw_isa, sw_isa_odp, sw_isa_em);
477static void print_mem_info(
void)
479 EM_PRINT(
"EM shared mem size: %zu B\n"
480 "EM local mem size: %zu B (per core)\n",
483 DBG_PRINT(
"\nem_locm_t:\t\t\t offset\t size\n"
484 "\t\t\t\t ------\t ----\n"
485 "current:\t\t\t%5zu B\t%5zu B\n"
486 "idle_state:\t\t\t%5zu B\t%5zu B\n"
487 "dispatch_cnt:\t\t\t%5zu B\t%5zu B\n"
488 "poll_drain_dispatch_cnt:\t%5zu B\t%5zu B\n"
489 "event_burst_cnt:\t\t%5zu B\t%5zu B\n"
490 "core_id:\t\t\t%5zu B\t%5zu B\n"
491 "local_queues:\t\t\t%5zu B\t%5zu B\n"
492 "local_event_cnt:\t\t%5zu B\t%5zu B\n"
493 "input_poll_fn:\t\t\t%5zu B\t%5zu B\n"
494 "output_drain_fn:\t\t%5zu B\t%5zu B\n"
495 "atomic_group_released:\t\t%5zu B\t%5zu B\n"
496 "is_sched_paused:\t\t%5zu B\t%5zu B\n"
497 "is_em_core:\t\t\t%5zu B\t%5zu B\n"
498 "is_external_thread:\t\t%5zu B\t%5zu B\n"
499 "is_term_thread_done:\t\t%5zu B\t%5zu B\n"
500 "is_core_local_inited:\t\t%5zu B\t%5zu B\n"
501 "dispatch_last_run:\t\t%5zu B\t%5zu B\n"
502 "poll_ctrl_interval_time:\t%5zu B\t%5zu B\n"
503 "poll_drain_dispatch_last_run:\t%5zu B\t%5zu B\n"
504 "poll_drain_interval_time:\t%5zu B\t%5zu B\n"
505 "init_pid:\t\t\t%5zu B\t%5zu B\n"
506 "start_eo_elem:\t\t\t%5zu B\t%5zu B\n"
507 "error_count:\t\t\t%5zu B\t%5zu B\n"
508 "log_fn:\t\t\t\t%5zu B\t%5zu B\n"
509 "vlog_fn:\t\t\t%5zu B\t%5zu B\n"
510 "sync_api:\t\t\t%5zu B\t%5zu B\n"
511 "debug_ts[]:\t\t\t%5zu B\t%5zu B\n"
512 "output_queue_track:\t\t%5zu B\t%5zu B\n"
513 "conf_local:\t\t\t%5zu B\t%5zu B\n"
514 "evhdr_nonem:\t\t\t%5zu B\t%5zu B\n"
515 "end:\t\t\t\t%5zu B\t%5zu B\n\n",
522 offsetof(
em_locm_t, poll_drain_dispatch_cnt),
523 sizeof_field(
em_locm_t, poll_drain_dispatch_cnt),
525 sizeof_field(
em_locm_t, event_burst_cnt),
531 sizeof_field(
em_locm_t, local_event_cnt),
535 sizeof_field(
em_locm_t, output_drain_fn),
536 offsetof(
em_locm_t, atomic_group_released),
537 sizeof_field(
em_locm_t, atomic_group_released),
539 sizeof_field(
em_locm_t, is_sched_paused),
543 sizeof_field(
em_locm_t, is_external_thread),
544 offsetof(
em_locm_t, is_term_thread_done),
545 sizeof_field(
em_locm_t, is_term_thread_done),
546 offsetof(
em_locm_t, is_core_local_inited),
547 sizeof_field(
em_locm_t, is_core_local_inited),
549 sizeof_field(
em_locm_t, dispatch_last_run),
550 offsetof(
em_locm_t, poll_ctrl_interval_time),
551 sizeof_field(
em_locm_t, poll_ctrl_interval_time),
552 offsetof(
em_locm_t, poll_drain_dispatch_last_run),
553 sizeof_field(
em_locm_t, poll_drain_dispatch_last_run),
554 offsetof(
em_locm_t, poll_drain_interval_time),
555 sizeof_field(
em_locm_t, poll_drain_interval_time),
571 sizeof_field(
em_locm_t, output_queue_track),
581void print_version_info(
void)
584 "===========================================================\n"
585 "EM version information: %s\n"
586 "===========================================================\n"
587 "EM API version: %s\n"
594 "(EM_CHECK_LEVEL:%d, EM_ESV_ENABLE:%d)\n"
595 "EM build info: %s\n"
596 "ODP API version: %s\n"
597 "ODP impl name: %s\n"
598 "ODP impl details: %s\n",
602 odp_version_api_str(),
603 odp_version_impl_name(),
604 odp_version_impl_str());
606 print_cpu_arch_info();
612void print_em_info(
void)
615 "===========================================================\n"
616 "EM Info on target: %s\n"
617 "===========================================================\n",
620 print_core_map_info();
622 print_queue_elem_info();
623 queue_group_info_print_all();
625 print_pool_elem_info();
626 print_ag_elem_info();
void em_pool_info_print_all(void)
#define EM_VERSION_API_STR
#define EM_BUILD_INFO_STR
char proc_tid_stat_paths[EM_MAX_CORES][32]
em_core_type_t core_types[EM_MAX_CORES]
pid_t ext_tids[ODP_THREAD_COUNT_MAX]
uint16_t odp_thr[EM_MAX_CORES]
odp_thrmask_t thrmask_extthrs
em_core_mask_t logic_mask