linux/tools/perf/util/smt.c
<<
>>
Prefs
   1#include <stdio.h>
   2#include <stdlib.h>
   3#include <unistd.h>
   4#include <linux/bitops.h>
   5#include "api/fs/fs.h"
   6#include "smt.h"
   7
   8int smt_on(void)
   9{
  10        static bool cached;
  11        static int cached_result;
  12        int cpu;
  13        int ncpu;
  14
  15        if (cached)
  16                return cached_result;
  17
  18        ncpu = sysconf(_SC_NPROCESSORS_CONF);
  19        for (cpu = 0; cpu < ncpu; cpu++) {
  20                unsigned long long siblings;
  21                char *str;
  22                size_t strlen;
  23                char fn[256];
  24
  25                snprintf(fn, sizeof fn,
  26                        "devices/system/cpu/cpu%d/topology/core_cpus", cpu);
  27                if (access(fn, F_OK) == -1) {
  28                        snprintf(fn, sizeof fn,
  29                                "devices/system/cpu/cpu%d/topology/thread_siblings",
  30                                cpu);
  31                }
  32                if (sysfs__read_str(fn, &str, &strlen) < 0)
  33                        continue;
  34                /* Entry is hex, but does not have 0x, so need custom parser */
  35                siblings = strtoull(str, NULL, 16);
  36                free(str);
  37                if (hweight64(siblings) > 1) {
  38                        cached_result = 1;
  39                        cached = true;
  40                        break;
  41                }
  42        }
  43        if (!cached) {
  44                cached_result = 0;
  45                cached = true;
  46        }
  47        return cached_result;
  48}
  49