diff options
author | Andriy Gapon <avg@FreeBSD.org> | 2017-10-01 16:34:16 +0000 |
---|---|---|
committer | Andriy Gapon <avg@FreeBSD.org> | 2017-10-01 16:34:16 +0000 |
commit | 7d5c6491f0665f36741c82effc23c9dd684d4041 (patch) | |
tree | 1c7e3c7b33bdb14780b7a3ce64fdae4e509bc191 /sys/kern/kern_linker.c | |
parent | 437e74ba036557c240a499f1de692a43a131f6a2 (diff) | |
parent | dd976ed5e4fe72161fb0afb3653ea0338bfa2e85 (diff) | |
download | src-7d5c6491f0665f36741c82effc23c9dd684d4041.tar.gz src-7d5c6491f0665f36741c82effc23c9dd684d4041.zip |
MFV r323531: 8521 nvlist memory leak in get_clones_stat() and spa_load_best()
illumos/illumos-gate@7d3000f774e20097a1ee45cbd06d0e38065ddd5a
https://github.com/illumos/illumos-gate/commit/7d3000f774e20097a1ee45cbd06d0e38065ddd5a
https://www.illumos.org/issues/8521
Yuri reported this to the mailing list:
doing a `reboot -d` on current illumos-gate HEAD gives the following "::
findleaks -dv" output:
findleaks: maximum buffers => 301061
findleaks: actual buffers => 297587
findleaks:
findleaks: potential pointers => 29289774
findleaks: dismissals => 26242305 (89.5%)
findleaks: misses => 331153 ( 1.1%)
findleaks: dups => 2419681 ( 8.2%)
findleaks: follows => 296635 ( 1.0%)
findleaks:
findleaks: peak memory usage => 7353 kB
findleaks: elapsed CPU time => 1.5 seconds
findleaks: elapsed wall time => 2.0 seconds
findleaks:
CACHE LEAKED BUFCTL CALLER
ffffff03d222b008 120 ffffff03ef7ceb78 nv_alloc_sys+0x1f
ffffff03d222a448 123 ffffff03f4150cc8 nv_alloc_sys+0x1f
ffffff03d222b448 5 ffffff03f28bd598 nv_alloc_sys+0x1f
ffffff03d222b888 87 ffffff03f28c10f0 nv_alloc_sys+0x1f
ffffff03d222c008 21 ffffff03f4139310 nv_alloc_sys+0x1f
ffffff03d222b888 43 ffffff040ef3f3e8 nv_alloc_sys+0x1f
ffffff03d222c008 120 ffffff03f4591e58 nv_alloc_sys+0x1f
ffffff03d222b008 121 ffffff03f352c068 nv_alloc_sys+0x1f
ffffff03d222a448 112 ffffff03f414e5f8 nv_alloc_sys+0x1f
ffffff03d222b008 119 ffffff03ee92fdc0 nv_alloc_sys+0x1f
ffffff03d222b888 46 ffffff03f28c1378 nv_alloc_sys+0x1f
ffffff03d222b448 4 ffffff03f28c7708 nv_alloc_sys+0x1f
ffffff03d222c008 20 ffffff03f2a6e7e8 nv_alloc_sys+0x1f
Reviewed by: Steve Gonczi <steve.gonczi@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Pavel Zakharov <pavel.zakharov@delphix.com>
MFC after: 5 weeks
X-MFC after: r324163
Notes
Notes:
svn path=/head/; revision=324166
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r-- | sys/kern/kern_linker.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 06cd3c0a5750..fc9c8fb33cd7 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -288,7 +288,7 @@ linker_file_sysuninit(linker_file_t lf) } static void -linker_file_register_sysctls(linker_file_t lf) +linker_file_register_sysctls(linker_file_t lf, bool enable) { struct sysctl_oid **start, **stop, **oidp; @@ -303,8 +303,34 @@ linker_file_register_sysctls(linker_file_t lf) sx_xunlock(&kld_sx); sysctl_wlock(); + for (oidp = start; oidp < stop; oidp++) { + if (enable) + sysctl_register_oid(*oidp); + else + sysctl_register_disabled_oid(*oidp); + } + sysctl_wunlock(); + sx_xlock(&kld_sx); +} + +static void +linker_file_enable_sysctls(linker_file_t lf) +{ + struct sysctl_oid **start, **stop, **oidp; + + KLD_DPF(FILE, + ("linker_file_enable_sysctls: enable SYSCTLs for %s\n", + lf->filename)); + + sx_assert(&kld_sx, SA_XLOCKED); + + if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0) + return; + + sx_xunlock(&kld_sx); + sysctl_wlock(); for (oidp = start; oidp < stop; oidp++) - sysctl_register_oid(*oidp); + sysctl_enable_oid(*oidp); sysctl_wunlock(); sx_xlock(&kld_sx); } @@ -430,8 +456,9 @@ linker_load_file(const char *filename, linker_file_t *result) return (error); } modules = !TAILQ_EMPTY(&lf->modules); - linker_file_register_sysctls(lf); + linker_file_register_sysctls(lf, false); linker_file_sysinit(lf); + linker_file_enable_sysctls(lf); lf->flags |= LINKER_FILE_LINKED; /* @@ -692,8 +719,8 @@ linker_file_unload(linker_file_t file, int flags) */ if (file->flags & LINKER_FILE_LINKED) { file->flags &= ~LINKER_FILE_LINKED; - linker_file_sysuninit(file); linker_file_unregister_sysctls(file); + linker_file_sysuninit(file); } TAILQ_REMOVE(&linker_files, file, link); @@ -1642,7 +1669,7 @@ restart: if (linker_file_lookup_set(lf, "sysinit_set", &si_start, &si_stop, NULL) == 0) sysinit_add(si_start, si_stop); - linker_file_register_sysctls(lf); + linker_file_register_sysctls(lf, true); lf->flags |= LINKER_FILE_LINKED; continue; fail: |