summaryrefslogtreecommitdiffstats
path: root/lib/libmemstat/memstat.c
diff options
context:
space:
mode:
authorpluknet <pluknet@FreeBSD.org>2011-08-01 09:43:35 +0000
committerpluknet <pluknet@FreeBSD.org>2011-08-01 09:43:35 +0000
commit3ec0e5bcb615c53ffe8e8df5fdc901c825d4340b (patch)
tree829890d9bb95a570210dfefdba99b9b908745a9d /lib/libmemstat/memstat.c
parent664d9b6f472f84aaf204aa60f801dac357b5224c (diff)
downloadFreeBSD-src-3ec0e5bcb615c53ffe8e8df5fdc901c825d4340b.zip
FreeBSD-src-3ec0e5bcb615c53ffe8e8df5fdc901c825d4340b.tar.gz
Get rid of MAXCPU knowledge used for internal needs only. Switch to
dynamic memory allocation to hold per-CPU memory types data (sized to mp_maxid for UMA, and to mp_maxcpus for malloc to match the kernel). That fixes libmemstat with arbitrary large MAXCPU values and therefore eliminates MEMSTAT_ERROR_TOOMANYCPUS error type. Reviewed by: jhb Approved by: re (kib)
Diffstat (limited to 'lib/libmemstat/memstat.c')
-rw-r--r--lib/libmemstat/memstat.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/libmemstat/memstat.c b/lib/libmemstat/memstat.c
index 1a08d3f..c7957c8 100644
--- a/lib/libmemstat/memstat.c
+++ b/lib/libmemstat/memstat.c
@@ -49,8 +49,6 @@ memstat_strerror(int error)
return ("Version mismatch");
case MEMSTAT_ERROR_PERMISSION:
return ("Permission denied");
- case MEMSTAT_ERROR_TOOMANYCPUS:
- return ("Too many CPUs");
case MEMSTAT_ERROR_DATAERROR:
return ("Data format error");
case MEMSTAT_ERROR_KVM:
@@ -99,6 +97,8 @@ _memstat_mtl_empty(struct memory_type_list *list)
struct memory_type *mtp;
while ((mtp = LIST_FIRST(&list->mtl_list))) {
+ free(mtp->mt_percpu_alloc);
+ free(mtp->mt_percpu_cache);
LIST_REMOVE(mtp, mt_list);
free(mtp);
}
@@ -147,7 +147,7 @@ memstat_mtl_find(struct memory_type_list *list, int allocator,
*/
struct memory_type *
_memstat_mt_allocate(struct memory_type_list *list, int allocator,
- const char *name)
+ const char *name, int maxcpus)
{
struct memory_type *mtp;
@@ -158,6 +158,10 @@ _memstat_mt_allocate(struct memory_type_list *list, int allocator,
bzero(mtp, sizeof(*mtp));
mtp->mt_allocator = allocator;
+ mtp->mt_percpu_alloc = malloc(sizeof(struct mt_percpu_alloc_s) *
+ maxcpus);
+ mtp->mt_percpu_cache = malloc(sizeof(struct mt_percpu_cache_s) *
+ maxcpus);
strlcpy(mtp->mt_name, name, MEMTYPE_MAXNAME);
LIST_INSERT_HEAD(&list->mtl_list, mtp, mt_list);
return (mtp);
@@ -171,7 +175,7 @@ _memstat_mt_allocate(struct memory_type_list *list, int allocator,
* libmemstat(3) internal function.
*/
void
-_memstat_mt_reset_stats(struct memory_type *mtp)
+_memstat_mt_reset_stats(struct memory_type *mtp, int maxcpus)
{
int i;
@@ -193,7 +197,7 @@ _memstat_mt_reset_stats(struct memory_type *mtp)
mtp->mt_zonefree = 0;
mtp->mt_kegfree = 0;
- for (i = 0; i < MEMSTAT_MAXCPU; i++) {
+ for (i = 0; i < maxcpus; i++) {
mtp->mt_percpu_alloc[i].mtp_memalloced = 0;
mtp->mt_percpu_alloc[i].mtp_memfreed = 0;
mtp->mt_percpu_alloc[i].mtp_numallocs = 0;
OpenPOWER on IntegriCloud