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 <[email protected]>
  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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to