summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authormdf <mdf@FreeBSD.org>2010-09-09 18:33:46 +0000
committermdf <mdf@FreeBSD.org>2010-09-09 18:33:46 +0000
commitbc5468425338dbee3cd3da7d6bc2a1290ba8d2ce (patch)
treefb245e2e8ce30565e64963b84e00c3b93d9bc280 /sys/vm
parenta7b4070f1f143143442a97cffdf24fc59814851f (diff)
downloadFreeBSD-src-bc5468425338dbee3cd3da7d6bc2a1290ba8d2ce.zip
FreeBSD-src-bc5468425338dbee3cd3da7d6bc2a1290ba8d2ce.tar.gz
Add a drain function for struct sysctl_req, and use it for a variety of
handlers, some of which had to do awkward things to get a large enough FIXEDLEN buffer. Note that some sysctl handlers were explicitly outputting a trailing NUL byte. This behaviour was preserved, though it should not be necessary. Reviewed by: phk
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma_core.c54
-rw-r--r--sys/vm/vm_phys.c27
-rw-r--r--sys/vm/vm_reserv.c9
3 files changed, 17 insertions, 73 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 558b4c7..23b88ee 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -3175,36 +3175,16 @@ sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS)
uma_keg_t kz;
uma_zone_t z;
uma_keg_t k;
- char *buffer;
- int buflen, count, error, i;
+ int count, error, i;
- mtx_lock(&uma_mtx);
-restart:
- mtx_assert(&uma_mtx, MA_OWNED);
- count = 0;
- LIST_FOREACH(kz, &uma_kegs, uk_link) {
- LIST_FOREACH(z, &kz->uk_zones, uz_link)
- count++;
- }
- mtx_unlock(&uma_mtx);
-
- buflen = sizeof(ush) + count * (sizeof(uth) + sizeof(ups) *
- (mp_maxid + 1)) + 1;
- buffer = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
+ count = 0;
mtx_lock(&uma_mtx);
- i = 0;
LIST_FOREACH(kz, &uma_kegs, uk_link) {
LIST_FOREACH(z, &kz->uk_zones, uz_link)
- i++;
- }
- if (i > count) {
- free(buffer, M_TEMP);
- goto restart;
+ count++;
}
- count = i;
-
- sbuf_new(&sbuf, buffer, buflen, SBUF_FIXEDLEN);
/*
* Insert stream header.
@@ -3213,11 +3193,7 @@ restart:
ush.ush_version = UMA_STREAM_VERSION;
ush.ush_maxcpus = (mp_maxid + 1);
ush.ush_count = count;
- if (sbuf_bcat(&sbuf, &ush, sizeof(ush)) < 0) {
- mtx_unlock(&uma_mtx);
- error = ENOMEM;
- goto out;
- }
+ (void)sbuf_bcat(&sbuf, &ush, sizeof(ush));
LIST_FOREACH(kz, &uma_kegs, uk_link) {
LIST_FOREACH(z, &kz->uk_zones, uz_link) {
@@ -3250,12 +3226,7 @@ restart:
uth.uth_frees = z->uz_frees;
uth.uth_fails = z->uz_fails;
uth.uth_sleeps = z->uz_sleeps;
- if (sbuf_bcat(&sbuf, &uth, sizeof(uth)) < 0) {
- ZONE_UNLOCK(z);
- mtx_unlock(&uma_mtx);
- error = ENOMEM;
- goto out;
- }
+ (void)sbuf_bcat(&sbuf, &uth, sizeof(uth));
/*
* While it is not normally safe to access the cache
* bucket pointers while not on the CPU that owns the
@@ -3280,21 +3251,14 @@ restart:
ups.ups_allocs = cache->uc_allocs;
ups.ups_frees = cache->uc_frees;
skip:
- if (sbuf_bcat(&sbuf, &ups, sizeof(ups)) < 0) {
- ZONE_UNLOCK(z);
- mtx_unlock(&uma_mtx);
- error = ENOMEM;
- goto out;
- }
+ (void)sbuf_bcat(&sbuf, &ups, sizeof(ups));
}
ZONE_UNLOCK(z);
}
}
mtx_unlock(&uma_mtx);
- sbuf_finish(&sbuf);
- error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
-out:
- free(buffer, M_TEMP);
+ error = sbuf_finish(&sbuf);
+ sbuf_delete(&sbuf);
return (error);
}
diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c
index e75c340..26e4981 100644
--- a/sys/vm/vm_phys.c
+++ b/sys/vm/vm_phys.c
@@ -123,12 +123,9 @@ sysctl_vm_phys_free(SYSCTL_HANDLER_ARGS)
{
struct sbuf sbuf;
struct vm_freelist *fl;
- char *cbuf;
- const int cbufsize = vm_nfreelists*(VM_NFREEORDER + 1)*81;
int error, flind, oind, pind;
- cbuf = malloc(cbufsize, M_TEMP, M_WAITOK | M_ZERO);
- sbuf_new(&sbuf, cbuf, cbufsize, SBUF_FIXEDLEN);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
for (flind = 0; flind < vm_nfreelists; flind++) {
sbuf_printf(&sbuf, "\nFREE LIST %d:\n"
"\n ORDER (SIZE) | NUMBER"
@@ -149,10 +146,8 @@ sysctl_vm_phys_free(SYSCTL_HANDLER_ARGS)
sbuf_printf(&sbuf, "\n");
}
}
- sbuf_finish(&sbuf);
- error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+ error = sbuf_finish(&sbuf);
sbuf_delete(&sbuf);
- free(cbuf, M_TEMP);
return (error);
}
@@ -164,12 +159,9 @@ sysctl_vm_phys_segs(SYSCTL_HANDLER_ARGS)
{
struct sbuf sbuf;
struct vm_phys_seg *seg;
- char *cbuf;
- const int cbufsize = VM_PHYSSEG_MAX*(VM_NFREEORDER + 1)*81;
int error, segind;
- cbuf = malloc(cbufsize, M_TEMP, M_WAITOK | M_ZERO);
- sbuf_new(&sbuf, cbuf, cbufsize, SBUF_FIXEDLEN);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
for (segind = 0; segind < vm_phys_nsegs; segind++) {
sbuf_printf(&sbuf, "\nSEGMENT %d:\n\n", segind);
seg = &vm_phys_segs[segind];
@@ -180,10 +172,8 @@ sysctl_vm_phys_segs(SYSCTL_HANDLER_ARGS)
sbuf_printf(&sbuf, "domain: %d\n", seg->domain);
sbuf_printf(&sbuf, "free list: %p\n", seg->free_queues);
}
- sbuf_finish(&sbuf);
- error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+ error = sbuf_finish(&sbuf);
sbuf_delete(&sbuf);
- free(cbuf, M_TEMP);
return (error);
}
@@ -195,23 +185,18 @@ static int
sysctl_vm_phys_lookup_lists(SYSCTL_HANDLER_ARGS)
{
struct sbuf sbuf;
- char *cbuf;
- const int cbufsize = (vm_nfreelists + 1) * VM_NDOMAIN * 81;
int domain, error, flind, ndomains;
ndomains = vm_nfreelists - VM_NFREELIST + 1;
- cbuf = malloc(cbufsize, M_TEMP, M_WAITOK | M_ZERO);
- sbuf_new(&sbuf, cbuf, cbufsize, SBUF_FIXEDLEN);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
for (domain = 0; domain < ndomains; domain++) {
sbuf_printf(&sbuf, "\nDOMAIN %d:\n\n", domain);
for (flind = 0; flind < vm_nfreelists; flind++)
sbuf_printf(&sbuf, " [%d]:\t%p\n", flind,
vm_phys_lookup_lists[domain][flind]);
}
- sbuf_finish(&sbuf);
- error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+ error = sbuf_finish(&sbuf);
sbuf_delete(&sbuf);
- free(cbuf, M_TEMP);
return (error);
}
#endif
diff --git a/sys/vm/vm_reserv.c b/sys/vm/vm_reserv.c
index d9e908f..aa8e80f 100644
--- a/sys/vm/vm_reserv.c
+++ b/sys/vm/vm_reserv.c
@@ -180,12 +180,9 @@ sysctl_vm_reserv_partpopq(SYSCTL_HANDLER_ARGS)
{
struct sbuf sbuf;
vm_reserv_t rv;
- char *cbuf;
- const int cbufsize = (VM_NRESERVLEVEL + 1) * 81;
int counter, error, level, unused_pages;
- cbuf = malloc(cbufsize, M_TEMP, M_WAITOK | M_ZERO);
- sbuf_new(&sbuf, cbuf, cbufsize, SBUF_FIXEDLEN);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
sbuf_printf(&sbuf, "\nLEVEL SIZE NUMBER\n\n");
for (level = -1; level <= VM_NRESERVLEVEL - 2; level++) {
counter = 0;
@@ -199,10 +196,8 @@ sysctl_vm_reserv_partpopq(SYSCTL_HANDLER_ARGS)
sbuf_printf(&sbuf, "%5.5d: %6.6dK, %6.6d\n", level,
unused_pages * (PAGE_SIZE / 1024), counter);
}
- sbuf_finish(&sbuf);
- error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+ error = sbuf_finish(&sbuf);
sbuf_delete(&sbuf);
- free(cbuf, M_TEMP);
return (error);
}
OpenPOWER on IntegriCloud