summaryrefslogtreecommitdiff
path: root/usr.sbin/acpidump/aml/aml_memman.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/acpidump/aml/aml_memman.c')
-rw-r--r--usr.sbin/acpidump/aml/aml_memman.c477
1 files changed, 0 insertions, 477 deletions
diff --git a/usr.sbin/acpidump/aml/aml_memman.c b/usr.sbin/acpidump/aml/aml_memman.c
deleted file mode 100644
index ea14ab34da7..00000000000
--- a/usr.sbin/acpidump/aml/aml_memman.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/* $OpenBSD: aml_memman.c,v 1.3 2008/09/10 14:59:53 miod Exp $ */
-/*-
- * Copyright (c) 1999, 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: aml_memman.c,v 1.3 2008/09/10 14:59:53 miod Exp $
- * $FreeBSD: src/usr.sbin/acpi/amldb/aml/aml_memman.c,v 1.2 2000/11/09 06:24:45 iwasaki Exp $
- */
-
-/*
- * Generic Memory Management
- */
-#include <sys/types.h>
-#include <aml/aml_memman.h>
-#ifndef roundup
-#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */
-#endif
-#ifndef _KERNEL
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#else /* _KERNEL */
-#include <sys/kernel.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-MALLOC_DEFINE(M_MEMMAN, "memman", "Generic and Simple Memory Management");
-#endif /* !_KERNEL */
-
-unsigned int memid_unknown = 255;
-
-static int manage_block(struct memman *memman, unsigned int id,
- void *block, unsigned static_mem,
- unsigned entries);
-static int blockman_init(struct memman *memman, unsigned int id);
-static void memman_flexsize_add_histogram(struct memman *memman,
- size_t size,
- int tolerance);
-static int memman_comp_histogram_size(const void *a,
- const void *b);
-static void memman_sort_histogram_by_size(struct memman *memman);
-static unsigned int memman_guess_memid(struct memman *memman, void *chunk);
-static void memman_statistics_fixedsize(struct memman *memman);
-static void memman_statistics_flexsize(struct memman *memman);
-
-static int
-manage_block(struct memman *memman, unsigned int id, void *block,
- unsigned static_mem, unsigned entries)
-{
- unsigned int i;
- size_t alloc_size;
- void *tmp, *realblock;
- struct memman_blockman *bmp;
- struct memman_block *memblock;
- struct memman_node *memnodes;
-
- bmp = &memman->blockman[id];
- alloc_size = MEMMAN_BLOCKNODE_SIZE(entries);
-
- if (static_mem) {
- tmp = (void *)block;
- realblock = (char *)block + alloc_size;
- } else {
- tmp = MEMMAN_SYSMALLOC(alloc_size);
- if (!tmp) {
- return (-1);
- }
- realblock = block;
-
- memman->allocated_mem += alloc_size;
- memman->salloc_called++;
- }
-
- memblock = (struct memman_block *)tmp;
- memnodes = (struct memman_node *)((char *)tmp + sizeof(struct memman_block));
-
- memblock->block = realblock;
- memblock->static_mem = static_mem;
- memblock->allocated = entries;
- memblock->available = entries;
- if (!static_mem) {
- alloc_size += roundup(bmp->size * entries, ROUNDUP_UNIT);
- }
- memblock->allocated_mem = alloc_size;
- LIST_INSERT_HEAD(&bmp->block_list, memblock, links);
-
- for (i = 0; i < entries; ++i) {
- memnodes[i].node = ((char *)realblock + (i * (bmp->size)));
- memnodes[i].memblock = memblock;
- LIST_INSERT_HEAD(&bmp->free_node_list, &memnodes[i], links);
- }
- bmp->available = entries;
-
- return (0);
-}
-
-static int
-blockman_init(struct memman *memman, unsigned int id)
-{
- int status;
- struct memman_blockman *bmp;
-
- bmp = &memman->blockman[id];
- bmp->initialized = 1;
- LIST_INIT(&bmp->block_list);
- LIST_INIT(&bmp->free_node_list);
- LIST_INIT(&bmp->occupied_node_list);
- status = manage_block(memman, id, bmp->initial_block,
- 1, MEMMAN_INITIAL_SIZE);
- return (status);
-}
-
-void *
-memman_alloc(struct memman *memman, unsigned int id)
-{
- size_t alloc_size;
- void *chunk, *block;
- struct memman_blockman *bmp;
- struct memman_node *memnode;
-
- if (memman->max_memid <= id) {
- printf("memman_alloc: invalid memory type id\n");
- return (NULL);
- }
- bmp = &memman->blockman[id];
- if (!bmp->initialized) {
- if (blockman_init(memman, id)) {
- goto malloc_fail;
- }
- }
- memman->alloc_called++;
-
- if (bmp->available == 0) {
- alloc_size = roundup(bmp->size * MEMMAN_INCR_SIZE,
- ROUNDUP_UNIT);
- block = MEMMAN_SYSMALLOC(alloc_size);
- if (!block) {
- goto malloc_fail;
- }
- memman->required_mem += bmp->size * MEMMAN_INCR_SIZE;
- memman->allocated_mem += alloc_size;
- memman->salloc_called++;
-
- if (manage_block(memman, id, block, 0, MEMMAN_INCR_SIZE)) {
- goto malloc_fail;
- }
- }
- memnode = LIST_FIRST(&bmp->free_node_list);
- LIST_REMOVE(memnode, links);
- chunk = memnode->node;
- LIST_INSERT_HEAD(&bmp->occupied_node_list, memnode, links);
- memnode->memblock->available--;
- bmp->available--;
-
- return (chunk);
-
-malloc_fail:
- printf("memman_alloc: could not allocate memory\n");
- return (NULL);
-}
-
-static void
-memman_flexsize_add_histogram(struct memman *memman, size_t size,
- int tolerance)
-{
- int i;
- int gap;
-
- if (size == 0) {
- return;
- }
- for (i = 0; i < memman->flex_mem_histogram_ptr; i++) {
- gap = memman->flex_mem_histogram[i].mem_size - size;
- if (gap >= (tolerance * -1) && gap <= tolerance) {
- memman->flex_mem_histogram[i].count++;
- if (memman->flex_mem_histogram[i].mem_size < size) {
- memman->flex_mem_histogram[i].mem_size = size;
- }
- return;
- }
- }
-
- if (memman->flex_mem_histogram_ptr == MEMMAN_HISTOGRAM_SIZE) {
- memman_flexsize_add_histogram(memman, size, tolerance + 1);
- return;
- }
- i = memman->flex_mem_histogram_ptr;
- memman->flex_mem_histogram[i].mem_size = size;
- memman->flex_mem_histogram[i].count = 1;
- memman->flex_mem_histogram_ptr++;
-}
-
-static int
-memman_comp_histogram_size(const void *a, const void *b)
-{
- int delta;
-
- delta = ((const struct memman_histogram *)a)->mem_size -
- ((const struct memman_histogram *)b)->mem_size;
- return (delta);
-}
-
-static void
-memman_sort_histogram_by_size(struct memman *memman)
-{
- qsort(memman->flex_mem_histogram, memman->flex_mem_histogram_ptr,
- sizeof(struct memman_histogram), memman_comp_histogram_size);
-}
-
-void *
-memman_alloc_flexsize(struct memman *memman, size_t size)
-{
- void *mem;
- struct memman_flexmem_info *info;
-
- if (size == 0) {
- return (NULL);
- }
- if ((mem = MEMMAN_SYSMALLOC(size)) != NULL) { /* XXX */
-
- info = MEMMAN_SYSMALLOC(sizeof(struct memman_flexmem_info));
- if (info) {
- if (!memman->flex_mem_initialized) {
- LIST_INIT(&memman->flexmem_info_list);
- bzero(memman->flex_mem_histogram,
- sizeof(struct memman_histogram));
- memman->flex_mem_initialized = 1;
- }
- info->addr = mem;
- info->mem_size = size;
- LIST_INSERT_HEAD(&memman->flexmem_info_list, info, links);
- }
- memman->flex_alloc_called++;
- memman->flex_salloc_called++;
- memman->flex_required_mem += size;
- memman->flex_allocated_mem += size;
- if (memman->flex_mem_size_min == 0 ||
- memman->flex_mem_size_min > size) {
- memman->flex_mem_size_min = size;
- }
- if (memman->flex_mem_size_max < size) {
- memman->flex_mem_size_max = size;
- }
- if (memman->flex_peak_mem_usage <
- (memman->flex_allocated_mem - memman->flex_reclaimed_mem)) {
- memman->flex_peak_mem_usage =
- (memman->flex_allocated_mem - memman->flex_reclaimed_mem);
- }
- memman_flexsize_add_histogram(memman, size,
- memman->flex_mem_histogram_initial_tolerance);
- }
- return (mem);
-}
-
-static unsigned int
-memman_guess_memid(struct memman *memman, void *chunk)
-{
- unsigned int id;
- struct memman_blockman *bmp;
- struct memman_node *memnode;
-
- for (id = 0; id < memman->max_memid; id++) {
- bmp = &memman->blockman[id];
- if (!bmp->initialized) {
- if (blockman_init(memman, id)) {
- printf("memman_free: could not initialized\n");
- }
- }
- LIST_FOREACH(memnode, &bmp->occupied_node_list, links) {
- if (memnode->node == chunk) {
- return (id); /* got it! */
- }
- }
- }
- return (memid_unknown); /* gave up */
-}
-
-void
-memman_free(struct memman *memman, unsigned int memid, void *chunk)
-{
- unsigned int id;
- unsigned found;
- void *block;
- struct memman_blockman *bmp;
- struct memman_block *memblock;
- struct memman_node *memnode;
-
- id = memid;
- if (memid == memid_unknown) {
- id = memman_guess_memid(memman, chunk);
- }
- if (memman->max_memid <= id) {
- printf("memman_free: invalid memory type id\n");
- MEMMAN_SYSABORT();
- return;
- }
- bmp = &memman->blockman[id];
- if (!bmp->initialized) {
- if (blockman_init(memman, id)) {
- printf("memman_free: could not initialized\n");
- }
- }
- found = 0;
- LIST_FOREACH(memnode, &bmp->occupied_node_list, links) {
- if (memnode->node == chunk) {
- found = 1;
- break;
- }
- }
- if (!found) {
- printf("memman_free: invalid address\n");
- return;
- }
- memman->free_called++;
-
- LIST_REMOVE(memnode, links);
- memblock = memnode->memblock;
- memblock->available++;
- LIST_INSERT_HEAD(&bmp->free_node_list, memnode, links);
- bmp->available++;
-
- if (!memblock->static_mem &&
- memblock->available == memblock->allocated) {
- LIST_FOREACH(memnode, &bmp->free_node_list, links) {
- if (memnode->memblock != memblock) {
- continue;
- }
- LIST_REMOVE(memnode, links);
- bmp->available--;
- }
- block = memblock->block;
- MEMMAN_SYSFREE(block);
- memman->sfree_called++;
-
- LIST_REMOVE(memblock, links);
- memman->sfree_called++;
- memman->reclaimed_mem += memblock->allocated_mem;
- MEMMAN_SYSFREE(memblock);
- }
-}
-
-void
-memman_free_flexsize(struct memman *memman, void *chunk)
-{
- struct memman_flexmem_info *info;
-
- LIST_FOREACH(info, &memman->flexmem_info_list, links) {
- if (info->addr == chunk) {
- memman->flex_reclaimed_mem += info->mem_size;
- LIST_REMOVE(info, links);
- MEMMAN_SYSFREE(info);
- break;
- }
- }
- /* XXX */
- memman->flex_free_called++;
- memman->flex_sfree_called++;
- MEMMAN_SYSFREE(chunk);
-}
-
-void
-memman_freeall(struct memman *memman)
-{
- int id;
- void *chunk;
- struct memman_blockman *bmp;
- struct memman_node *memnode;
- struct memman_block *memblock;
- struct memman_flexmem_info *info;
-
- for (id = 0; id < memman->max_memid; id++) {
- bmp = &memman->blockman[id];
-
- while ((memnode = LIST_FIRST(&bmp->occupied_node_list))) {
- chunk = memnode->node;
- printf("memman_freeall: fixed size (id = %d)\n", id);
- memman_free(memman, id, chunk);
- }
- while ((memblock = LIST_FIRST(&bmp->block_list))) {
- LIST_REMOVE(memblock, links);
- if (!memblock->static_mem) {
- memman->sfree_called++;
- memman->reclaimed_mem += memblock->allocated_mem;
- MEMMAN_SYSFREE(memblock);
- }
- }
- bmp->initialized = 0;
- }
-
- LIST_FOREACH(info, &memman->flexmem_info_list, links) {
- printf("memman_freeall: flex size (size = %zu, addr = %p)\n",
- info->mem_size, info->addr);
- memman_free_flexsize(memman, info->addr);
- }
-}
-
-static void
-memman_statistics_fixedsize(struct memman *memman)
-{
- printf(" fixed size memory blocks\n");
- printf(" alloc(): %d times\n", memman->alloc_called);
- printf(" system malloc(): %d times\n", memman->salloc_called);
- printf(" free(): %d times\n", memman->free_called);
- printf(" system free(): %d times\n", memman->sfree_called);
- printf(" required memory: %zu bytes\n", memman->required_mem);
- printf(" allocated memory: %zu bytes\n", memman->allocated_mem);
- printf(" reclaimed memory: %zu bytes\n", memman->reclaimed_mem);
-}
-
-static void
-memman_statistics_flexsize(struct memman *memman)
-{
- int i;
-
- printf(" flexible size memory blocks\n");
- printf(" alloc(): %d times\n", memman->flex_alloc_called);
- printf(" system malloc(): %d times\n", memman->flex_salloc_called);
- printf(" free(): %d times\n", memman->flex_free_called);
- printf(" system free(): %d times\n", memman->flex_sfree_called);
- printf(" required memory: %zu bytes\n", memman->flex_required_mem);
- printf(" allocated memory: %zu bytes\n", memman->flex_allocated_mem);
- printf(" reclaimed memory: %zu bytes\n", memman->flex_reclaimed_mem);
- printf(" peak memory usage: %zu bytes\n", memman->flex_peak_mem_usage);
- printf(" min memory size: %zu bytes\n", memman->flex_mem_size_min);
- printf(" max memory size: %zu bytes\n", memman->flex_mem_size_max);
- printf(" avg memory size: %zu bytes\n",
- (memman->flex_alloc_called) ?
- memman->flex_allocated_mem / memman->flex_alloc_called : 0);
-
- printf(" memory size histogram (%d entries):\n",
- memman->flex_mem_histogram_ptr);
- printf(" size count\n");
- memman_sort_histogram_by_size(memman);
- for (i = 0; i < memman->flex_mem_histogram_ptr; i++) {
- printf(" %d %d\n",
- memman->flex_mem_histogram[i].mem_size,
- memman->flex_mem_histogram[i].count);
- }
-}
-
-void
-memman_statistics(struct memman *memman)
-{
- printf("memman: reporting statistics\n");
- memman_statistics_fixedsize(memman);
- memman_statistics_flexsize(memman);
-}
-
-size_t
-memman_memid2size(struct memman *memman, unsigned int id)
-{
- if (memman->max_memid <= id) {
- printf("memman_alloc: invalid memory type id\n");
- return (0);
- }
- return (memman->blockman[id].size);
-}