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:
parent
1dcd8d4702
commit
0df7e2b164
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user