Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 May 2015 16:02:32 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282643 - head/usr.sbin/pmcstat
Message-ID:  <201505081602.t48G2WUW047879@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri May  8 16:02:31 2015
New Revision: 282643
URL: https://svnweb.freebsd.org/changeset/base/282643

Log:
  Use the kern.bootfile sysctl to set the default kernel path rather than
  hardcoding /boot/kernel. This allows pmcstat(8) to work without -k when
  using nextboot -k or 'boot foo' at the loader to boot alternate kernels.
  
  Differential Revision:	https://reviews.freebsd.org/D2425
  Reviewed by:	adrian, emaste, gnn
  MFC after:	2 weeks
  Sponsored by:	Norse Corp, Inc.

Modified:
  head/usr.sbin/pmcstat/pmcstat.8
  head/usr.sbin/pmcstat/pmcstat.c

Modified: head/usr.sbin/pmcstat/pmcstat.8
==============================================================================
--- head/usr.sbin/pmcstat/pmcstat.8	Fri May  8 16:00:06 2015	(r282642)
+++ head/usr.sbin/pmcstat/pmcstat.8	Fri May  8 16:02:31 2015	(r282643)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 27, 2015
+.Dd May 8, 2015
 .Dt PMCSTAT 8
 .Os
 .Sh NAME
@@ -279,8 +279,9 @@ Set the pathname of the kernel directory
 This directory specifies where
 .Nm
 should look for the kernel and its modules.
-The default is
-.Pa /boot/kernel .
+The default is to use the path of the running kernel obtained from the
+.Va kern.bootfile
+sysctl.
 .It Fl l Ar secs
 Set system-wide performance measurement duration for
 .Ar secs

Modified: head/usr.sbin/pmcstat/pmcstat.c
==============================================================================
--- head/usr.sbin/pmcstat/pmcstat.c	Fri May  8 16:00:06 2015	(r282642)
+++ head/usr.sbin/pmcstat/pmcstat.c	Fri May  8 16:02:31 2015	(r282643)
@@ -557,7 +557,7 @@ main(int argc, char **argv)
 	int c, check_driver_stats, current_sampling_count;
 	int do_callchain, do_descendants, do_logproccsw, do_logprocexit;
 	int do_print, do_read;
-	size_t dummy;
+	size_t len;
 	int graphdepth;
 	int pipefd[2], rfd;
 	int use_cumulative_counts;
@@ -586,7 +586,6 @@ main(int argc, char **argv)
 	args.pa_verbosity	= 1;
 	args.pa_logfd		= -1;
 	args.pa_fsroot		= "";
-	args.pa_kernel		= strdup("/boot/kernel");
 	args.pa_samplesdir	= ".";
 	args.pa_printfile	= stderr;
 	args.pa_graphdepth	= DEFAULT_CALLGRAPH_DEPTH;
@@ -610,12 +609,20 @@ main(int argc, char **argv)
 	ev = NULL;
 	CPU_ZERO(&cpumask);
 
+	/* Default to using the running system kernel. */
+	len = 0;
+	if (sysctlbyname("kern.bootfile", NULL, &len, NULL, 0) == -1)
+		err(EX_OSERR, "ERROR: Cannot determine path of running kernel");
+	args.pa_kernel = malloc(len + 1);
+	if (sysctlbyname("kern.bootfile", args.pa_kernel, &len, NULL, 0) == -1)
+		err(EX_OSERR, "ERROR: Cannot determine path of running kernel");
+
 	/*
 	 * The initial CPU mask specifies all non-halted CPUS in the
 	 * system.
 	 */
-	dummy = sizeof(int);
-	if (sysctlbyname("hw.ncpu", &ncpu, &dummy, NULL, 0) < 0)
+	len = sizeof(int);
+	if (sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0) < 0)
 		err(EX_OSERR, "ERROR: Cannot determine the number of CPUs");
 	for (hcpu = 0; hcpu < ncpu; hcpu++)
 		CPU_SET(hcpu, &cpumask);
@@ -1061,33 +1068,31 @@ main(int argc, char **argv)
 		    );
 
 	/*
-	 * Check if "-k kerneldir" was specified, and if whether
-	 * 'kerneldir' actually refers to a file.  If so, use
-	 * `dirname path` to determine the kernel directory.
-	 */
-	if (args.pa_flags & FLAG_HAS_KERNELPATH) {
-		(void) snprintf(buffer, sizeof(buffer), "%s%s", args.pa_fsroot,
-		    args.pa_kernel);
+	 * Check if 'kerneldir' refers to a file rather than a
+	 * directory.  If so, use `dirname path` to determine the
+	 * kernel directory.
+	 */
+	(void) snprintf(buffer, sizeof(buffer), "%s%s", args.pa_fsroot,
+	    args.pa_kernel);
+	if (stat(buffer, &sb) < 0)
+		err(EX_OSERR, "ERROR: Cannot locate kernel \"%s\"",
+		    buffer);
+	if (!S_ISREG(sb.st_mode) && !S_ISDIR(sb.st_mode))
+		errx(EX_USAGE, "ERROR: \"%s\": Unsupported file type.",
+		    buffer);
+	if (!S_ISDIR(sb.st_mode)) {
+		tmp = args.pa_kernel;
+		args.pa_kernel = strdup(dirname(args.pa_kernel));
+		free(tmp);
+		(void) snprintf(buffer, sizeof(buffer), "%s%s",
+		    args.pa_fsroot, args.pa_kernel);
 		if (stat(buffer, &sb) < 0)
-			err(EX_OSERR, "ERROR: Cannot locate kernel \"%s\"",
+			err(EX_OSERR, "ERROR: Cannot stat \"%s\"",
 			    buffer);
-		if (!S_ISREG(sb.st_mode) && !S_ISDIR(sb.st_mode))
-			errx(EX_USAGE, "ERROR: \"%s\": Unsupported file type.",
+		if (!S_ISDIR(sb.st_mode))
+			errx(EX_USAGE,
+			    "ERROR: \"%s\" is not a directory.",
 			    buffer);
-		if (!S_ISDIR(sb.st_mode)) {
-			tmp = args.pa_kernel;
-			args.pa_kernel = strdup(dirname(args.pa_kernel));
-			free(tmp);
-			(void) snprintf(buffer, sizeof(buffer), "%s%s",
-			    args.pa_fsroot, args.pa_kernel);
-			if (stat(buffer, &sb) < 0)
-				err(EX_OSERR, "ERROR: Cannot stat \"%s\"",
-				    buffer);
-			if (!S_ISDIR(sb.st_mode))
-				errx(EX_USAGE,
-				    "ERROR: \"%s\" is not a directory.",
-				    buffer);
-		}
 	}
 
 	/*



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