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        if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) > 0)
  19                goto done;
  20
  21        ncpu = sysconf(_SC_NPROCESSORS_CONF);
  22        for (cpu = 0; cpu < ncpu; cpu++) {
  23                unsigned long long siblings;
  24                char *str;
  25                size_t strlen;
  26                char fn[256];
  27
  28                snprintf(fn, sizeof fn,
  29                        "devices/system/cpu/cpu%d/topology/core_cpus", cpu);
  30                if (sysfs__read_str(fn, &str, &strlen) < 0) {
  31                        snprintf(fn, sizeof fn,
  32                                "devices/system/cpu/cpu%d/topology/thread_siblings",
  33                                cpu);
  34                        if (sysfs__read_str(fn, &str, &strlen) < 0)
  35                                continue;
  36                }
  37                /* Entry is hex, but does not have 0x, so need custom parser */
  38                siblings = strtoull(str, NULL, 16);
  39                free(str);
  40                if (hweight64(siblings) > 1) {
  41                        cached_result = 1;
  42                        cached = true;
  43                        break;
  44                }
  45        }
  46        if (!cached) {
  47                cached_result = 0;
  48done:
  49                cached = true;
  50        }
  51        return cached_result;
  52}
  53