Correct two libmemstat(3) bugs:

- Move memory_type_list flushing logic from memstat_mtl_free() to
  _memstat_mtl_empty(), a libmemstat-internal function that can
  be called from other parts of the library.  Invoke
  _memstat_mtl_empty() from memstat_mtl_free(), which also frees
  the containing list structure.

  Invoke _memstat_mtl_empty() instead of memstat_mtl_free() in
  various error cases in memstat_malloc.c and memstat_uma.c, which
  previously resulted in the list being freed prematurely.

- Reverse the order of updating the mt_kegfree and mt_free fields
  of the memory_type in memstat_uma.c, otherwise keg free items
  won't be counted properly for non-secondary zones.

MFC after:	3 days
This commit is contained in:
rwatson 2005-08-01 13:18:21 +00:00
parent 05cc0ffa4e
commit 5032db6d57
4 changed files with 12 additions and 4 deletions

View File

@ -88,7 +88,7 @@ memstat_mtl_next(struct memory_type *mtp)
}
void
memstat_mtl_free(struct memory_type_list *list)
_memstat_mtl_empty(struct memory_type_list *list)
{
struct memory_type *mtp;
@ -96,6 +96,13 @@ memstat_mtl_free(struct memory_type_list *list)
LIST_REMOVE(mtp, mt_list);
free(mtp);
}
}
void
memstat_mtl_free(struct memory_type_list *list)
{
_memstat_mtl_empty(list);
free(list);
}

View File

@ -116,6 +116,7 @@ struct memory_type_list {
int mtl_error;
};
void _memstat_mtl_empty(struct memory_type_list *list);
struct memory_type *_memstat_mt_allocate(struct memory_type_list *list,
int allocator, const char *name);
void _memstat_mt_reset_stats(struct memory_type *mtp);

View File

@ -175,7 +175,7 @@ memstat_sysctl_malloc(struct memory_type_list *list, int flags)
mtp = _memstat_mt_allocate(list, ALLOCATOR_MALLOC,
mthp->mth_name);
if (mtp == NULL) {
memstat_mtl_free(list);
_memstat_mtl_empty(list);
free(buffer);
list->mtl_error = MEMSTAT_ERROR_NOMEMORY;
return (-1);

View File

@ -176,7 +176,7 @@ memstat_sysctl_uma(struct memory_type_list *list, int flags)
mtp = _memstat_mt_allocate(list, ALLOCATOR_UMA,
uthp->uth_name);
if (mtp == NULL) {
memstat_mtl_free(list);
_memstat_mtl_empty(list);
free(buffer);
list->mtl_error = MEMSTAT_ERROR_NOMEMORY;
return (-1);
@ -218,8 +218,8 @@ memstat_sysctl_uma(struct memory_type_list *list, int flags)
* items only in the primary zone.
*/
if (!(uthp->uth_zone_flags & UTH_ZONE_SECONDARY)) {
mtp->mt_free += mtp->mt_kegfree;
mtp->mt_kegfree = uthp->uth_keg_free;
mtp->mt_free += mtp->mt_kegfree;
}
mtp->mt_free += mtp->mt_zonefree;
}