svn commit: r358923 - in head: lib/libpmcstat usr.sbin/pmcstat

Ryan Moeller freqlabs at FreeBSD.org
Thu Mar 12 23:04:41 UTC 2020


Author: freqlabs
Date: Thu Mar 12 23:04:40 2020
New Revision: 358923
URL: https://svnweb.freebsd.org/changeset/base/358923

Log:
  libpmcstat: Try /boot/modules if module not found
  
  Modules from ports/pkg are commonly installed to /boot/modules rather than to
  the same directory the kernel resides in.  Look there if a module is not found
  next to the kernel.
  
  Submitted by:	mmacy
  Reported by:	Nick Principe <nap at iXsystems.com>
  Approved by:	mmacy (mentor)
  MFC after:	2 weeks
  Sponsored by:	iXsystems, Inc.

Modified:
  head/lib/libpmcstat/libpmcstat_image.c
  head/usr.sbin/pmcstat/pmcstat.8

Modified: head/lib/libpmcstat/libpmcstat_image.c
==============================================================================
--- head/lib/libpmcstat/libpmcstat_image.c	Thu Mar 12 21:26:36 2020	(r358922)
+++ head/lib/libpmcstat/libpmcstat_image.c	Thu Mar 12 23:04:40 2020	(r358923)
@@ -278,6 +278,7 @@ pmcstat_image_get_elf_params(struct pmcstat_image *ima
 	GElf_Shdr sh;
 	enum pmcstat_image_type image_type;
 	char buffer[PATH_MAX];
+	char buffer_modules[PATH_MAX];
 
 	assert(image->pi_type == PMCSTAT_IMAGE_UNKNOWN);
 
@@ -292,23 +293,32 @@ pmcstat_image_get_elf_params(struct pmcstat_image *ima
 	assert(path != NULL);
 
 	/*
-	 * Look for kernel modules under FSROOT/KERNELPATH/NAME,
-	 * and user mode executable objects under FSROOT/PATHNAME.
+	 * Look for kernel modules under FSROOT/KERNELPATH/NAME and
+	 * FSROOT/boot/modules/NAME, and user mode executable objects
+	 * under FSROOT/PATHNAME.
 	 */
-	if (image->pi_iskernelmodule)
+	if (image->pi_iskernelmodule) {
 		(void) snprintf(buffer, sizeof(buffer), "%s%s/%s",
 		    args->pa_fsroot, args->pa_kernel, path);
-	else
+		(void) snprintf(buffer_modules, sizeof(buffer_modules),
+		    "%s/boot/modules/%s", args->pa_fsroot, path);
+	} else {
 		(void) snprintf(buffer, sizeof(buffer), "%s%s",
 		    args->pa_fsroot, path);
+	}
 
 	e = NULL;
-	if ((fd = open(buffer, O_RDONLY, 0)) < 0) {
+	fd = open(buffer, O_RDONLY, 0);
+	if (fd < 0 && !image->pi_iskernelmodule) {
 		warnx("WARNING: Cannot open \"%s\".",
 		    buffer);
 		goto done;
 	}
-
+	if (fd < 0 && (fd = open(buffer_modules, O_RDONLY, 0)) < 0) {
+		warnx("WARNING: Cannot open \"%s\" or \"%s\".",
+		    buffer, buffer_modules);
+		goto done;
+	}
 	if (elf_version(EV_CURRENT) == EV_NONE) {
 		warnx("WARNING: failed to init elf\n");
 		goto done;

Modified: head/usr.sbin/pmcstat/pmcstat.8
==============================================================================
--- head/usr.sbin/pmcstat/pmcstat.8	Thu Mar 12 21:26:36 2020	(r358922)
+++ head/usr.sbin/pmcstat/pmcstat.8	Thu Mar 12 23:04:40 2020	(r358923)
@@ -309,6 +309,8 @@ should look for the kernel and its modules.
 The default is to use the path of the running kernel obtained from the
 .Va kern.bootfile
 sysctl.
+Modules will also be searched for in /boot/modules if not found in
+.Ar kerneldir .
 .It Fl l Ar secs
 Set system-wide performance measurement duration for
 .Ar secs


More information about the svn-src-head mailing list