svn commit: r184782 - head/usr.sbin/pmccontrol

Joseph Koshy jkoshy at FreeBSD.org
Sun Nov 9 00:36:35 PST 2008


Author: jkoshy
Date: Sun Nov  9 08:36:35 2008
New Revision: 184782
URL: http://svn.freebsd.org/changeset/base/184782

Log:
  Change the meaning of a "*" argument to option -c to mean 'all
  unhalted CPUs', instead of 'all CPUs'.  This change brings
  pmccontrol(8) in line with pmcstat(8).

Modified:
  head/usr.sbin/pmccontrol/pmccontrol.c

Modified: head/usr.sbin/pmccontrol/pmccontrol.c
==============================================================================
--- head/usr.sbin/pmccontrol/pmccontrol.c	Sun Nov  9 07:58:23 2008	(r184781)
+++ head/usr.sbin/pmccontrol/pmccontrol.c	Sun Nov  9 08:36:35 2008	(r184782)
@@ -133,21 +133,33 @@ pmcc_init_debug(void)
 static int
 pmcc_do_enable_disable(struct pmcc_op_list *op_list)
 {
-	unsigned char op;
 	int c, error, i, j, ncpu, npmc, t;
-	int cpu, pmc;
+	cpumask_t haltedcpus, cpumask;
 	struct pmcc_op *np;
 	unsigned char *map;
+	unsigned char op;
+	int cpu, pmc;
+	size_t dummy;
 
 	if ((ncpu = pmc_ncpu()) < 0)
 		err(EX_OSERR, "Unable to determine the number of cpus");
 
-	/* determine the maximum number of PMCs in any CPU */
+	/* Determine the set of active CPUs. */
+	cpumask = (1 << ncpu) - 1;
+	dummy = sizeof(int);
+	haltedcpus = (cpumask_t) 0;
+	if (ncpu > 1 && sysctlbyname("machdep.hlt_cpus", &haltedcpus,
+	    &dummy, NULL, 0) < 0)
+		err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
+		    "halted");
+	cpumask &= ~haltedcpus;
+
+	/* Determine the maximum number of PMCs in any CPU. */
 	npmc = 0;
 	for (c = 0; c < ncpu; c++) {
 		if ((t = pmc_npmc(c)) < 0)
-			err(EX_OSERR, "Unable to determine the number of PMCs in "
-			    "CPU %d", c);
+			err(EX_OSERR, "Unable to determine the number of "
+			    "PMCs in CPU %d", c);
 		npmc = t > npmc ? t : npmc;
 	}
 
@@ -187,8 +199,10 @@ pmcc_do_enable_disable(struct pmcc_op_li
 #define MAP(M,C,P)	(*((M) + (C)*npmc + (P)))
 
 		if (cpu == PMCC_CPU_ALL)
-			for (i = 0; i < ncpu; i++)
-				SET_PMCS(i, pmc, op);
+			for (i = 0; i < ncpu; i++) {
+				if ((1 << i) & cpumask)
+					SET_PMCS(i, pmc, op);
+			}
 		else
 			SET_PMCS(cpu, pmc, op);
 	}


More information about the svn-src-all mailing list