summaryrefslogtreecommitdiffstats
path: root/sys/vm/uma_core.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2002-03-24 10:56:11 +0000
committerjeff <jeff@FreeBSD.org>2002-03-24 10:56:11 +0000
commita3880e122dd1dd267a3b5bc6631cb86b52f184ab (patch)
tree9e3d1f9ce54e63587400ab68abd79f9ae5d599d8 /sys/vm/uma_core.c
parent985de052a17bb4ce137b2f0c6c3e2762dba830bd (diff)
downloadFreeBSD-src-a3880e122dd1dd267a3b5bc6631cb86b52f184ab.zip
FreeBSD-src-a3880e122dd1dd267a3b5bc6631cb86b52f184ab.tar.gz
Reset the cachefree statistics after draining the cache. This fixes a bug
where a sysctl within 20 seconds of a cache_drain could yield negative "USED" counts. Also, grab the uma_mtx while in the sysctl handler. This hadn't caused problems yet because Giant is held all the time. Reported by: kkenn
Diffstat (limited to 'sys/vm/uma_core.c')
-rw-r--r--sys/vm/uma_core.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 2f1b765..359c9e8 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -483,6 +483,8 @@ cache_drain(uma_zone_t zone)
continue;
CPU_UNLOCK(zone, cpu);
}
+
+ zone->uz_cachefree = 0;
}
/*
@@ -1878,6 +1880,7 @@ sysctl_vm_zone(SYSCTL_HANDLER_ARGS)
if (error || cnt == 0)
goto out;
offset = tmpbuf;
+ mtx_lock(&uma_mtx);
LIST_FOREACH(z, &uma_zones, uz_link) {
if (cnt == 0) /* list may have changed size */
break;
@@ -1897,6 +1900,7 @@ sysctl_vm_zone(SYSCTL_HANDLER_ARGS)
cnt--;
offset += len;
}
+ mtx_unlock(&uma_mtx);
*offset++ = '\0';
error = SYSCTL_OUT(req, tmpbuf, offset - tmpbuf);
out:
OpenPOWER on IntegriCloud