Topology generation
include/smp/topo_gen.h View source View on GitHubStructs
Section titled “Structs”topo_gen_descriptor
Section titled “topo_gen_descriptor” struct topo_gen_descriptor (1 field) source
§
struct pertopo_descriptor *descs[TOPOLOGY_LEVEL_MAX] Macros
Section titled “Macros”TOPO_GEN_CTOR
Section titled “TOPO_GEN_CTOR”#define TOPO_GEN_CTOR(type_, name_, level_, ctor_) source Expansion
#define TOPO_GEN_CTOR(type_, name_, level_, ctor_) \
static inline void __topo_ctor_##level_##_##name_(typeof(type_) *inst, \
size_t node_id) { \
void (*const __typed_ctor)(typeof(type_) *, enum topology_level, \
size_t) = (ctor_); \
if (__typed_ctor != NULL) \
__typed_ctor((typeof(type_) *) inst, level_, node_id); \
} TOPO_DEFINE_3
Section titled “TOPO_DEFINE_3”#define TOPO_DEFINE_3(type_, name_, ctor_) source Expansion
#define TOPO_DEFINE_3(type_, name_, ctor_) \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_SMT, ctor_); \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_CORE, ctor_); \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_NUMA, ctor_); \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_LLC, ctor_); \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_PACKAGE, ctor_); \
TOPO_GEN_CTOR(type_, name_, TOPOLOGY_LEVEL_MACHINE, ctor_); \
PERTOPO_DEFINE(type_, name_##_SMT, TOPOLOGY_LEVEL_SMT, \
__topo_ctor_TOPOLOGY_LEVEL_SMT_##name_); \
PERTOPO_DEFINE(type_, name_##_CORE, TOPOLOGY_LEVEL_CORE, \
__topo_ctor_TOPOLOGY_LEVEL_CORE_##name_); \
PERTOPO_DEFINE(type_, name_##_NUMA, TOPOLOGY_LEVEL_NUMA, \
__topo_ctor_TOPOLOGY_LEVEL_NUMA_##name_); \
PERTOPO_DEFINE(type_, name_##_LLC, TOPOLOGY_LEVEL_LLC, \
__topo_ctor_TOPOLOGY_LEVEL_LLC_##name_); \
PERTOPO_DEFINE(type_, name_##_PACKAGE, TOPOLOGY_LEVEL_PACKAGE, \
__topo_ctor_TOPOLOGY_LEVEL_PACKAGE_##name_); \
PERTOPO_DEFINE(type_, name_##_MACHINE, TOPOLOGY_LEVEL_MACHINE, \
__topo_ctor_TOPOLOGY_LEVEL_MACHINE_##name_); \
static typeof(type_) __topo_gen_##name_ cc_unused; \
static struct topo_gen_descriptor __topo_gen_desc_##name_ cc_unused = { \
.descs = { \
[TOPOLOGY_LEVEL_SMT] = &__pertopo_desc_##name_##_SMT, \
[TOPOLOGY_LEVEL_CORE] = &__pertopo_desc_##name_##_CORE, \
[TOPOLOGY_LEVEL_NUMA] = &__pertopo_desc_##name_##_NUMA, \
[TOPOLOGY_LEVEL_LLC] = &__pertopo_desc_##name_##_LLC, \
[TOPOLOGY_LEVEL_PACKAGE] = &__pertopo_desc_##name_##_PACKAGE, \
[TOPOLOGY_LEVEL_MACHINE] = &__pertopo_desc_##name_##_MACHINE, \
}}; TOPO_DEFINE_2
Section titled “TOPO_DEFINE_2”#define TOPO_DEFINE_2(type_, name_) source Expansion
#define TOPO_DEFINE_2(type_, name_) TOPO_DEFINE_3(type_, name_, NULL) TOPO_DEFINE
Section titled “TOPO_DEFINE”#define TOPO_DEFINE(...) source Expansion
#define TOPO_DEFINE(...) PP_CALL(TOPO_DEFINE, __VA_ARGS__) topo_gen_for_each_internal_2
Section titled “topo_gen_for_each_internal_2”#define topo_gen_for_each_internal_2(var, name) source Expansion
#define topo_gen_for_each_internal_2(var, name) \
for (enum topology_level __topo_gen_level = 0; \
__topo_gen_level < TOPOLOGY_LEVEL_MAX; __topo_gen_level++) \
for (size_t __topo_gen_idx = 0; \
__topo_gen_idx < global.topology.count[__topo_gen_level]; \
__topo_gen_idx++) \
for (var = (typeof(var)) __topo_gen_desc_##name \
.descs[__topo_gen_level] \
->pertopo_ptrs[__topo_gen_idx]; \
var != NULL; var = NULL) topo_gen_for_each_internal_3
Section titled “topo_gen_for_each_internal_3”#define topo_gen_for_each_internal_3(var, level, name) source Expansion
#define topo_gen_for_each_internal_3(var, level, name) \
for (level = 0; level < TOPOLOGY_LEVEL_MAX; level++) \
for (size_t __topo_gen_idx = 0; \
__topo_gen_idx < global.topology.count[level]; __topo_gen_idx++) \
for (var = (typeof(var)) __topo_gen_desc_##name.descs[level] \
->pertopo_ptrs[__topo_gen_idx]; \
var != NULL; var = NULL) topo_gen_for_each_internal_4
Section titled “topo_gen_for_each_internal_4”#define topo_gen_for_each_internal_4(var, level, node_id, name) source Expansion
#define topo_gen_for_each_internal_4(var, level, node_id, name) \
for (level = 0; level < TOPOLOGY_LEVEL_MAX; level++) \
for (node_id = 0; node_id < global.topology.count[level]; node_id++) \
for (var = (typeof(var)) __topo_gen_desc_##name.descs[level] \
->pertopo_ptrs[node_id]; \
var != NULL; var = NULL) topo_gen_for_each
Section titled “topo_gen_for_each”#define topo_gen_for_each(...) source Expansion
#define topo_gen_for_each(...) PP_CALL(topo_gen_for_each_internal, __VA_ARGS__) topo_gen_for_each_at_3
Section titled “topo_gen_for_each_at_3”#define topo_gen_for_each_at_3(var, name, level) source Expansion
#define topo_gen_for_each_at_3(var, name, level) \
for (size_t __topo_gen_idx = 0; \
__topo_gen_idx < global.topology.count[level]; __topo_gen_idx++) \
for (var = (typeof(var)) __topo_gen_desc_##name.descs[level] \
->pertopo_ptrs[__topo_gen_idx]; \
var != NULL; var = NULL) topo_gen_for_each_at_4
Section titled “topo_gen_for_each_at_4”#define topo_gen_for_each_at_4(var, node_id, name, level) source Expansion
#define topo_gen_for_each_at_4(var, node_id, name, level) \
for (node_id = 0; node_id < global.topology.count[level]; node_id++) \
for (var = (typeof(var)) __topo_gen_desc_##name.descs[level] \
->pertopo_ptrs[node_id]; \
var != NULL; var = NULL) topo_gen_for_each_at
Section titled “topo_gen_for_each_at”#define topo_gen_for_each_at(...) source Expansion
#define topo_gen_for_each_at(...) \
PP_CALL(topo_gen_for_each_at_internal, __VA_ARGS__)