Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Aug 2018 20:06:27 +0000 (UTC)
From:      Kurt Jaeger <pi@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r476320 - in head/sysutils/turbostat: . files
Message-ID:  <201808032006.w73K6RMN053487@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pi
Date: Fri Aug  3 20:06:27 2018
New Revision: 476320
URL: https://svnweb.freebsd.org/changeset/ports/476320

Log:
  sysutils/turbostat: Fix reading topology with multiple packages
  
  Fixed a bug where core identifiers within a package would not
  count from zero. This caused a out-of-bounds array access when
  multiple packages were present.
  
  Also gracefully handle the absence of the kern.intrs sysctl (added
  in 12.0), and don't use reallocarray (added in 11.0).
  
  PR:		230066
  Reported by:	kbowling
  Submitted by:	D Scott Phillips <d.scott.phillips@intel.com> (maintainer)

Modified:
  head/sysutils/turbostat/Makefile
  head/sysutils/turbostat/files/patch-turbostat.c

Modified: head/sysutils/turbostat/Makefile
==============================================================================
--- head/sysutils/turbostat/Makefile	Fri Aug  3 19:24:44 2018	(r476319)
+++ head/sysutils/turbostat/Makefile	Fri Aug  3 20:06:27 2018	(r476320)
@@ -2,6 +2,7 @@
 
 PORTNAME=	turbostat
 PORTVERSION=	4.17 # Turbostat itself has a version, but we don't bother
+PORTREVISION=	1
 CATEGORIES=	sysutils
 MASTER_SITES=	https://raw.githubusercontent.com/torvalds/linux/v${PORTVERSION}/tools/power/x86/turbostat/ \
 		https://raw.githubusercontent.com/torvalds/linux/v${PORTVERSION}/arch/x86/include/asm/

Modified: head/sysutils/turbostat/files/patch-turbostat.c
==============================================================================
--- head/sysutils/turbostat/files/patch-turbostat.c	Fri Aug  3 19:24:44 2018	(r476319)
+++ head/sysutils/turbostat/files/patch-turbostat.c	Fri Aug  3 20:06:27 2018	(r476320)
@@ -1,11 +1,12 @@
---- turbostat.c.orig	2018-07-23 18:26:58 UTC
+--- turbostat.c.orig	2018-07-31 20:42:12 UTC
 +++ turbostat.c
-@@ -41,7 +41,30 @@
+@@ -41,7 +41,31 @@
  #include <sched.h>
  #include <time.h>
  #include <cpuid.h>
 +#ifdef __FreeBSD__
 +#include <sys/types.h>
++#include <sys/param.h>
 +#include <sys/cpuctl.h>
 +#include <sys/cpuset.h>
 +#include <sys/ioctl.h>
@@ -31,7 +32,7 @@
  #include <errno.h>
  
  char *proc_stat = "/proc/stat";
-@@ -132,7 +155,9 @@ unsigned int has_misc_feature_control;
+@@ -132,7 +156,9 @@ unsigned int has_misc_feature_control;
  #define RAPL_CORES (RAPL_CORES_ENERGY_STATUS | RAPL_CORES_POWER_LIMIT)
  #define	TJMAX_DEFAULT	100
  
@@ -41,7 +42,7 @@
  
  /*
   * buffer size used by sscanf() for added column names
-@@ -309,6 +334,7 @@ int cpu_migrate(int cpu)
+@@ -309,6 +335,7 @@ int cpu_migrate(int cpu)
  	else
  		return 0;
  }
@@ -49,7 +50,7 @@
  int get_msr_fd(int cpu)
  {
  	char pathname[32];
-@@ -319,18 +345,39 @@ int get_msr_fd(int cpu)
+@@ -319,18 +346,39 @@ int get_msr_fd(int cpu)
  	if (fd)
  		return fd;
  
@@ -90,7 +91,7 @@
  	ssize_t retval;
  
  	retval = pread(get_msr_fd(cpu), msr, sizeof(*msr), offset);
-@@ -340,6 +387,7 @@ int get_msr(int cpu, off_t offset, unsigned long long 
+@@ -340,6 +388,7 @@ int get_msr(int cpu, off_t offset, unsigned long long 
  
  	return 0;
  }
@@ -98,7 +99,7 @@
  
  /*
   * Each string in this array is compared in --show and --hide cmdline.
-@@ -2239,6 +2287,158 @@ int parse_int_file(const char *fmt, ...)
+@@ -2239,6 +2288,173 @@ int parse_int_file(const char *fmt, ...)
  	return value;
  }
  
@@ -121,7 +122,7 @@
 +	else
 +		list->cap = 2;
 +
-+	list->sets = reallocarray(list->sets, list->cap, sizeof(cpuset_t));
++	list->sets = realloc(list->sets, list->cap * sizeof(cpuset_t));
 +}
 +
 +static cpuset_t parse_cpu_mask(const char *i) {
@@ -195,10 +196,10 @@
 +		ncpus += CPU_COUNT(packages.sets + i);
 +}
 +
-+static int get_core_id(int cpu)
++static int get_physical_package_id(int cpu)
 +{
-+	for (int i = 0; i < cores.len; i++) {
-+		if (!CPU_ISSET(cpu, cores.sets + i))
++	for (int i = 0; i < packages.len; i++) {
++		if (!CPU_ISSET(cpu, packages.sets + i))
 +			continue;
 +
 +		return i;
@@ -206,42 +207,57 @@
 +	return -1;
 +}
 +
-+static int get_cpu_position_in_core(int cpu)
++static int get_core_id(int cpu)
 +{
-+	int core = get_core_id(cpu);
-+	if (core < 0)
++	int package_id = get_physical_package_id(cpu);
++	if (package_id < 0)
 +		return -1;
 +
-+	cpuset_t s;
-+	CPU_COPY(cores.sets + core, &s);
-+	for (int i = 0; !CPU_EMPTY(&s); i++) {
-+		int ffs = CPU_FFS(&s) - 1;
-+		if (ffs == cpu)
-+			return i;
-+		CPU_CLR(ffs, &s);
-+	}
++	const cpuset_t *package = packages.sets + package_id;
 +
++	for (int i = 0, j = -1; i < cores.len; i++) {
++		if (CPU_OVERLAP(package, cores.sets + i))
++			j++;
++
++		if (!CPU_ISSET(cpu, cores.sets + i))
++			continue;
++
++		return j;
++	}
 +	return -1;
 +}
 +
-+static int get_num_ht_siblings(int cpu)
++static int get_cpu_position_in_core(int cpu)
 +{
-+	int core = get_core_id(cpu);
-+	if (core < 0)
-+		return 1;
++	for (int i = 0; i < cores.len; i++) {
++		if (!CPU_ISSET(cpu, cores.sets + i))
++			continue;
 +
-+	return CPU_COUNT(cores.sets + core);
++		cpuset_t s;
++		CPU_COPY(cores.sets + i, &s);
++		for (int j = 0; !CPU_EMPTY(&s); j++) {
++			int ffs = CPU_FFS(&s) - 1;
++			if (ffs == cpu)
++				return j;
++			CPU_CLR(ffs, &s);
++		}
++
++		return -1;
++	}
++
++	return -1;
 +}
 +
-+static int get_physical_package_id(int cpu)
++static int get_num_ht_siblings(int cpu)
 +{
-+	for (int i = 0; i < packages.len; i++) {
-+		if (!CPU_ISSET(cpu, packages.sets + i))
++	for (int i = 0; i < cores.len; i++) {
++		if (!CPU_ISSET(cpu, cores.sets + i))
 +			continue;
 +
-+		return i;
++		return CPU_COUNT(cores.sets + i);
 +	}
-+	return -1;
++
++	return 1;
 +}
 +
 +static int cpu_is_first_core_in_package(int cpu)
@@ -257,7 +273,7 @@
  /*
   * get_cpu_position_in_core(cpu)
   * return the position of the CPU among its HT siblings in the core
-@@ -2326,6 +2526,7 @@ int get_num_ht_siblings(int cpu)
+@@ -2326,6 +2542,7 @@ int get_num_ht_siblings(int cpu)
  	fclose(filep);
  	return matches+1;
  }
@@ -265,7 +281,7 @@
  
  /*
   * run func(thread, core, package) in topology order
-@@ -2371,6 +2572,22 @@ int for_all_cpus_2(int (func)(struct thread_data *, st
+@@ -2371,6 +2588,22 @@ int for_all_cpus_2(int (func)(struct thread_data *, st
  	return 0;
  }
  
@@ -288,7 +304,7 @@
  /*
   * run func(cpu) on every cpu in /proc/stat
   * return max_cpu number
-@@ -2401,6 +2618,7 @@ int for_all_proc_cpus(int (func)(int))
+@@ -2401,6 +2634,7 @@ int for_all_proc_cpus(int (func)(int))
  	fclose(fp);
  	return 0;
  }
@@ -296,7 +312,7 @@
  
  void re_initialize(void)
  {
-@@ -2428,6 +2646,81 @@ int mark_cpu_present(int cpu)
+@@ -2428,6 +2662,85 @@ int mark_cpu_present(int cpu)
  	return 0;
  }
  
@@ -318,17 +334,21 @@
 +	else
 +		intr_map_cap = 2;
 +
-+	intr_map = reallocarray(intr_map, intr_map_cap, sizeof(*intr_map));
++	intr_map = realloc(intr_map, intr_map_cap * sizeof(*intr_map));
 +}
 +
 +static void init_intr_map(void)
 +{
 +	size_t sz = 0;
-+	if (sysctlbyname("hw.intrs", NULL, &sz, NULL, 0))
-+		err(1, "sysctl: hw.intrs: failed");
++	if (sysctlbyname("hw.intrs", NULL, &sz, NULL, 0)) {
++		warn("sysctl: hw.intrs: per-cpu interrupt data will be unavailable");
++		return;
++	}
 +	char *intrs = alloca(sz);
-+	if (sysctlbyname("hw.intrs", intrs, &sz, NULL, 0))
-+		err(1, "sysctl: hw.intrs: failed");
++	if (sysctlbyname("hw.intrs", intrs, &sz, NULL, 0)) {
++		warn("sysctl: hw.intrs: per-cpu interrupt data will be unavailable");
++		return;
++	}
 +
 +	char *i = intrs;
 +	char *j;
@@ -378,7 +398,7 @@
  /*
   * snapshot_proc_interrupts()
   *
-@@ -2491,6 +2784,8 @@ int snapshot_proc_interrupts(void)
+@@ -2491,6 +2804,8 @@ int snapshot_proc_interrupts(void)
  	}
  	return 0;
  }
@@ -387,7 +407,7 @@
  /*
   * snapshot_gfx_rc6_ms()
   *
-@@ -2629,6 +2924,18 @@ restart:
+@@ -2629,6 +2944,18 @@ restart:
  	}
  }
  
@@ -406,7 +426,7 @@
  void check_dev_msr()
  {
  	struct stat sb;
-@@ -2677,6 +2984,7 @@ void check_permissions()
+@@ -2677,6 +3004,7 @@ void check_permissions()
  	if (do_exit)
  		exit(-6);
  }
@@ -414,7 +434,7 @@
  
  /*
   * NHM adds support for additional MSRs:
-@@ -4520,8 +4828,21 @@ void setup_all_buffers(void)
+@@ -4520,8 +4848,21 @@ void setup_all_buffers(void)
  	for_all_proc_cpus(initialize_counters);
  }
  
@@ -436,7 +456,7 @@
  	base_cpu = sched_getcpu();
  	if (base_cpu < 0)
  		err(-ENODEV, "No valid cpus found");
-@@ -4529,6 +4850,7 @@ void set_base_cpu(void)
+@@ -4529,6 +4870,7 @@ void set_base_cpu(void)
  	if (debug > 1)
  		fprintf(outf, "base_cpu = %d\n", base_cpu);
  }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201808032006.w73K6RMN053487>