26 #include <sys/types.h> 28 #include <sys/syscall.h> 31 #include <linux/limits.h> 34 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_OTHER 71 #define PROCESSORS_INFO_ENV "M0_PROCESSORS_INFO_DIR" 73 #define PROCESSORS_SYSFS_DIR "/sys/devices/system" 74 #define PROCESSORS_CPU_DIR "cpu/" 75 #define PROCESSORS_NODE_DIR "node/" 77 #define PROCESSORS_MAX_FILE "cpu/kernel_max" 78 #define PROCESSORS_POSS_FILE "cpu/possible" 79 #define PROCESSORS_PRESENT_FILE "cpu/present" 80 #define PROCESSORS_ONLINE_FILE "cpu/online" 82 #define PROCESSORS_CACHE1_LEVEL_FILE "cache/index0/level" 83 #define PROCESSORS_CACHE2_LEVEL_FILE "cache/index1/level" 84 #define PROCESSORS_CACHE3_LEVEL_FILE "cache/index2/level" 86 #define PROCESSORS_CACHE1_SHCPUMAP_FILE "cache/index0/shared_cpu_map" 87 #define PROCESSORS_CACHE2_SHCPUMAP_FILE "cache/index1/shared_cpu_map" 88 #define PROCESSORS_CACHE3_SHCPUMAP_FILE "cache/index2/shared_cpu_map" 90 #define PROCESSORS_CACHE1_SIZE_FILE "cache/index0/size" 91 #define PROCESSORS_CACHE2_SIZE_FILE "cache/index1/size" 92 #define PROCESSORS_CACHE3_SIZE_FILE "cache/index2/size" 94 #define PROCESSORS_COREID_FILE "topology/core_id" 95 #define PROCESSORS_PHYSID_FILE "topology/physical_package_id" 97 #define PROCESSORS_CPU_DIR_PREFIX "cpu/cpu" 99 #define PROCESSORS_NODE_STR "node" 100 #define PROCESSORS_CPU_STR "cpu" 206 for (; mapstr !=
NULL && *mapstr != 0; mapstr =
ptr) {
210 id = strtoul(mapstr, &
ptr, 0);
212 to_id = strtoul(
ptr + 1, &
ptr, 0);
242 static const char *fname[] = {
334 uint32_t numa_node_id = 0;
337 char dirname[PATH_MAX];
340 struct dirent *fname;
343 dirp = opendir(dirname);
350 while ((fname = readdir(dirp)) !=
NULL) {
353 sscanf(fname->d_name,
372 while ((fname = readdir(dirp)) !=
NULL) {
375 sprintf(dirname,
"%s%s/%s%u",
378 rc =
stat(dirname, &statbuf);
380 sscanf(fname->d_name,
405 char filebuf[PATH_MAX];
423 char filebuf[PATH_MAX];
446 for (; mapstr !=
NULL && *mapstr != 0; mapstr =
ptr) {
450 for (
num = strtoul(mapstr, &
ptr, 16);
num != 0;
num >>= 1)
451 shared_cpus +=
num & 1;
465 return shared_cpus > 1;
505 rc = fscanf(
fp,
"%uK", &sz);
510 size = (size_t) sz * 1024;
565 rc = fscanf(
fp,
"%uK", &sz);
570 size = (size_t)(sz * 1024);
630 l1_id = physid << 16 | coreid;
652 bool l3_cache_present =
false;
674 l3_cache_present =
true;
707 if (l3_cache_present) {
709 l2_id = physid << 16 | coreid;
831 str = getcwd(cwd,
sizeof(cwd) - 1);
859 int rc2 = chdir(cwd);
947 data->ptd_success = idx ==
data->ptd_idx;
985 for (
i = 0, j = 0;
i < map_online.
b_nr; ++
i) {
998 &
tdata[j],
"m0_getcpu_check");
1007 for (
i = 0;
i < j; ++
i) {
1010 result = rc2 == 0 && result &&
tdata[
i].ptd_success;
1032 if (
rc == 0 && !success) {
1034 "values, fall back to syscall getcpu(2).");
1037 if (
rc == 0 && !success)
1050 #ifdef CONFIG_X86_64 1051 static void processor_cpuid_reg_get(
unsigned opc,
unsigned *
r)
1053 __asm__ __volatile__ (
"cpuid\n\t" 1054 :
"=a" (
r[0]),
"=b" (
r[1]),
1055 "=c" (
r[2]),
"=d" (
r[3])
1056 :
"0" (opc),
"1" (0),
"2" (0));
1130 if (
pinfo->pn_info.pd_id ==
id) {
1131 *pd =
pinfo->pn_info;
1152 rc = sched_getcpu();
1162 #ifdef CONFIG_X86_64 1165 unsigned reg[4] = {};
1167 processor_cpuid_reg_get(0x1, reg);
1168 return (reg[2] & (1U << 31)) != 0;
1178 #undef M0_TRACE_SUBSYSTEM struct m0_bitmap pss_poss_map
#define PROCESSORS_PRESENT_FILE
static void ptr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
static uint32_t number_read(const char *filename)
#define PROCESSORS_NODE_DIR
#define PROCESSORS_CACHE3_LEVEL_FILE
#define M0_PROCESSORS_INVALID_ID
M0_INTERNAL void m0_list_add(struct m0_list *head, struct m0_list_link *new)
#define M0_ALLOC_ARR(arr, nr)
M0_INTERNAL int m0_bitmap_init(struct m0_bitmap *map, size_t nr)
M0_INTERNAL int struct dentry struct kstat * stat
M0_INTERNAL int m0_thread_confine(struct m0_thread *q, const struct m0_bitmap *processors)
#define PROCESSORS_CACHE2_LEVEL_FILE
M0_INTERNAL void m0_bitmap_fini(struct m0_bitmap *map)
#define PROCESSORS_CACHE1_SIZE_FILE
m0_processor_nr_t ptd_idx
M0_INTERNAL void m0_processors_possible(struct m0_bitmap *map)
int m0_thread_join(struct m0_thread *q)
M0_INTERNAL void m0_list_init(struct m0_list *head)
#define PROCESSORS_CACHE2_SHCPUMAP_FILE
#define M0_LOG(level,...)
enum m0_trace_level level
struct m0_thread ptd_thread
M0_INTERNAL m0_processor_nr_t m0_processor_nr_max(void)
static struct net_test_cmd_node * node
static void getcpu_thr_func(struct getcpu_thr_data *data)
#define PROCESSORS_POSS_FILE
M0_INTERNAL void m0_list_fini(struct m0_list *head)
M0_INTERNAL void m0_list_del(struct m0_list_link *old)
M0_INTERNAL void m0_processors_fini(void)
struct m0_processor_descr pn_info
struct m0_bitmap pss_onln_map
M0_INTERNAL size_t m0_bitmap_set_nr(const struct m0_bitmap *map)
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
M0_INTERNAL struct m0 * m0_get(void)
struct m0_bitmap pss_avail_map
M0_INTERNAL m0_processor_nr_t m0_processor_id_get(void)
bool pg_getcpu_workaround
#define PROCESSORS_COREID_FILE
#define PROCESSORS_CACHE3_SHCPUMAP_FILE
#define PROCESSORS_ONLINE_FILE
#define PROCESSORS_NODE_STR
static void processor_getcpu_fini(void)
#define PROCESSORS_INFO_ENV
return M0_ERR(-EOPNOTSUPP)
struct m0_list_link pn_link
uint32_t m0_processor_nr_t
static int processor_map_type_set(enum map map_type)
#define PROCESSORS_CPU_STR
m0_processor_nr_t pss_max
static struct processor_sys_summary sys_cpus
struct m0_list_link * l_head
static size_t processor_l2_size_get(m0_processor_nr_t id)
#define m0_list_for_each_entry(head, pos, type, member)
static void processors_m0bitmap_copy(struct m0_bitmap *dst, const struct m0_bitmap *src)
static uint32_t processor_l2_cacheid_get(m0_processor_nr_t id)
static void processor_maxsz_get()
#define PROCESSORS_MAX_FILE
M0_INTERNAL int m0_processors_init(void)
static int getcpu_thr_init(struct getcpu_thr_data *data)
static uint32_t processor_pipelineid_get(m0_processor_nr_t id)
void m0_thread_fini(struct m0_thread *q)
#define PROCESSORS_CACHE1_LEVEL_FILE
static uint32_t processor_numanodeid_get(m0_processor_nr_t id)
static int processor_info_get(m0_processor_nr_t id, struct processor_node *pn)
M0_INTERNAL void m0_processors_online(struct m0_bitmap *map)
static bool processor_init
#define PROCESSORS_CACHE2_SIZE_FILE
M0_INTERNAL void m0_bitmap_set(struct m0_bitmap *map, size_t idx, bool val)
M0_INTERNAL bool m0_list_is_empty(const struct m0_list *head)
static int processor_getcpu_check(bool *success)
static size_t processor_l1_size_get(m0_processor_nr_t id)
static uint32_t processor_physid_get(m0_processor_nr_t id)
M0_INTERNAL void m0_bitmap_copy(struct m0_bitmap *dst, const struct m0_bitmap *src)
static void processor_cache_destroy(void)
static uint32_t processor_coreid_get(m0_processor_nr_t id)
#define PROCESSORS_CPU_DIR_PREFIX
#define M0_ALLOC_PTR(ptr)
void * i_moddata[M0_MODULE_NR]
M0_INTERNAL int m0_processor_describe(m0_processor_nr_t id, struct m0_processor_descr *pd)
M0_INTERNAL bool m0_bitmap_get(const struct m0_bitmap *map, size_t idx)
static void processor_map_set(struct m0_bitmap *map, const char *mapstr)
#define PROCESSORS_CACHE3_SIZE_FILE
static int processors_summary_get()
struct m0_bitmap ptd_cpu_map
static int processor_getcpu_init(void)
M0_INTERNAL bool m0_processor_is_vm(void)
static uint32_t processor_l1_cacheid_get(m0_processor_nr_t id)
#define PROCESSORS_SYSFS_DIR
struct m0_pdclust_src_addr src
#define m0_list_entry(link, type, member)
static bool processor_is_cache_shared(const char *mapstr)
M0_INTERNAL void m0_processors_available(struct m0_bitmap *map)
#define PROCESSORS_CACHE1_SHCPUMAP_FILE
#define PROCESSORS_PHYSID_FILE
#define M0_IMPOSSIBLE(fmt,...)