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@iXsystems.com>
Approved by:	mmacy (mentor)
MFC after:	2 weeks
Sponsored by:	iXsystems, Inc.
This commit is contained in:
freqlabs 2020-03-12 23:04:40 +00:00
parent 1dcd8d4702
commit 0df7e2b164
2 changed files with 18 additions and 6 deletions

View File

@ -278,6 +278,7 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image,
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 *image,
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;

View File

@ -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