Avoid the "Cannot allocate memory" problem that appears on heavily
loaded systems by retrying the sysctl() with a larger buffer if it fails with ENOMEM. For good measure, allocate 10% more memory than sysctl() claims is necessary. PR: 8275 Reviewed by: David Greenman <dg@freebsd.org>
This commit is contained in:
parent
9bbd8a2498
commit
b2d3d0f097
@ -302,10 +302,16 @@ kvm_getprocs(kd, op, arg, cnt)
|
||||
_kvm_syserr(kd, kd->program, "kvm_getprocs");
|
||||
return (0);
|
||||
}
|
||||
kd->procbase = (struct kinfo_proc *)_kvm_malloc(kd, size);
|
||||
if (kd->procbase == 0)
|
||||
return (0);
|
||||
st = sysctl(mib, op == KERN_PROC_ALL ? 3 : 4, kd->procbase, &size, NULL, 0);
|
||||
kd->procbase = 0;
|
||||
do {
|
||||
size += size / 10;
|
||||
kd->procbase = (struct kinfo_proc *)
|
||||
_kvm_realloc(kd, kd->procbase, size);
|
||||
if (kd->procbase == 0)
|
||||
return (0);
|
||||
st = sysctl(mib, op == KERN_PROC_ALL ? 3 : 4,
|
||||
kd->procbase, &size, NULL, 0);
|
||||
} while (st == -1 && errno == ENOMEM);
|
||||
if (st == -1) {
|
||||
_kvm_syserr(kd, kd->program, "kvm_getprocs");
|
||||
return (0);
|
||||
|
Loading…
Reference in New Issue
Block a user