Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/raidframe Bye-bye to the memchunk files.
details: https://anonhg.NetBSD.org/src/rev/a57242e10000
branches: trunk
changeset: 534723:a57242e10000
user: oster <oster%NetBSD.org@localhost>
date: Fri Aug 02 03:48:14 2002 +0000
description:
Bye-bye to the memchunk files.
diffstat:
sys/dev/raidframe/rf_memchunk.c | 213 ----------------------------------------
sys/dev/raidframe/rf_memchunk.h | 47 --------
2 files changed, 0 insertions(+), 260 deletions(-)
diffs (268 lines):
diff -r c0bd91ae14a6 -r a57242e10000 sys/dev/raidframe/rf_memchunk.c
--- a/sys/dev/raidframe/rf_memchunk.c Fri Aug 02 03:47:48 2002 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,213 +0,0 @@
-/* $NetBSD: rf_memchunk.c,v 1.8 2002/07/14 03:16:06 oster Exp $ */
-/*
- * Copyright (c) 1995 Carnegie-Mellon University.
- * All rights reserved.
- *
- * Author: Mark Holland
- *
- * Permission to use, copy, modify and distribute this software and
- * its documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
- * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution%CS.CMU.EDU@localhost
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- */
-
-/*********************************************************************************
- * rf_memchunk.c
- *
- * experimental code. I've found that the malloc and free calls in the DAG
- * creation code are very expensive. Since for any given workload the DAGs
- * created for different accesses are likely to be similar to each other, the
- * amount of memory used for any given DAG data structure is likely to be one
- * of a small number of values. For example, in UNIX, all reads and writes will
- * be less than 8k and will not span stripe unit boundaries. Thus in the absence
- * of failure, the only DAGs that will ever get created are single-node reads
- * and single-stripe-unit atomic read-modify-writes. So, I'm very likely to
- * be continually asking for chunks of memory equal to the sizes of these two
- * DAGs.
- *
- * This leads to the idea of holding on to these chunks of memory when the DAG is
- * freed and then, when a new DAG is created, trying to find such a chunk before
- * calling malloc.
- *
- * the "chunk list" is a list of lists. Each header node contains a size value
- * and a pointer to a list of chunk descriptors, each of which holds a pointer
- * to a chunk of memory of the indicated size.
- *
- * There is currently no way to purge memory out of the chunk list. My
- * initial thought on this is to have a low-priority thread that wakes up every
- * 1 or 2 seconds, purges all the chunks with low reuse counts, and sets all
- * the reuse counts to zero.
- *
- * This whole idea may be bad, since malloc may be able to do this more efficiently.
- * It's worth a try, though, and it can be turned off by setting useMemChunks to 0.
- *
- ********************************************************************************/
-
-#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_memchunk.c,v 1.8 2002/07/14 03:16:06 oster Exp $");
-
-#include <dev/raidframe/raidframevar.h>
-
-#include "rf_debugMem.h"
-#include "rf_memchunk.h"
-#include "rf_general.h"
-#include "rf_options.h"
-#include "rf_shutdown.h"
-
-typedef struct RF_ChunkHdr_s RF_ChunkHdr_t;
-struct RF_ChunkHdr_s {
- int size;
- RF_ChunkDesc_t *list;
- RF_ChunkHdr_t *next;
-};
-
-static RF_ChunkHdr_t *chunklist, *chunk_hdr_free_list;
-static RF_ChunkDesc_t *chunk_desc_free_list;
-RF_DECLARE_STATIC_MUTEX(chunkmutex)
- static void rf_ShutdownMemChunk(void *);
- static RF_ChunkDesc_t *NewMemChunk(int, char *);
-
-
- static void rf_ShutdownMemChunk(ignored)
- void *ignored;
-{
- RF_ChunkDesc_t *pt, *p;
- RF_ChunkHdr_t *hdr, *ht;
-
- if (rf_memChunkDebug)
- printf("Chunklist:\n");
- for (hdr = chunklist; hdr;) {
- for (p = hdr->list; p;) {
- if (rf_memChunkDebug)
- printf("Size %d reuse count %d\n", p->size, p->reuse_count);
- pt = p;
- p = p->next;
- RF_Free(pt->buf, pt->size);
- RF_Free(pt, sizeof(*pt));
- }
- ht = hdr;
- hdr = hdr->next;
- RF_Free(ht, sizeof(*ht));
- }
-
- rf_mutex_destroy(&chunkmutex);
-}
-
-int
-rf_ConfigureMemChunk(listp)
- RF_ShutdownList_t **listp;
-{
- int rc;
-
- chunklist = NULL;
- chunk_hdr_free_list = NULL;
- chunk_desc_free_list = NULL;
- rc = rf_mutex_init(&chunkmutex);
- if (rc) {
- RF_ERRORMSG3("Unable to init mutex file %s line %d rc=%d\n", __FILE__,
- __LINE__, rc);
- }
- rc = rf_ShutdownCreate(listp, rf_ShutdownMemChunk, NULL);
- if (rc) {
- RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n", __FILE__,
- __LINE__, rc);
- rf_mutex_destroy(&chunkmutex);
- }
- return (rc);
-}
-/* called to get a chunk descriptor for a newly-allocated chunk of memory
- * MUTEX MUST BE LOCKED
- *
- * free list is not currently used
- */
-static RF_ChunkDesc_t *
-NewMemChunk(size, buf)
- int size;
- char *buf;
-{
- RF_ChunkDesc_t *p;
-
- if (chunk_desc_free_list) {
- p = chunk_desc_free_list;
- chunk_desc_free_list = p->next;
- } else
- RF_Malloc(p, sizeof(RF_ChunkDesc_t), (RF_ChunkDesc_t *));
- p->size = size;
- p->buf = buf;
- p->next = NULL;
- p->reuse_count = 0;
- return (p);
-}
-/* looks for a chunk of memory of acceptable size. If none, allocates one and returns
- * a chunk descriptor for it, but does not install anything in the list. This is done
- * when the chunk is released.
- */
-RF_ChunkDesc_t *
-rf_GetMemChunk(size)
- int size;
-{
- RF_ChunkHdr_t *hdr = chunklist;
- RF_ChunkDesc_t *p = NULL;
- char *buf;
-
- RF_LOCK_MUTEX(chunkmutex);
- for (hdr = chunklist; hdr; hdr = hdr->next)
- if (hdr->size >= size) {
- p = hdr->list;
- if (p) {
- hdr->list = p->next;
- p->next = NULL;
- p->reuse_count++;
- }
- break;
- }
- if (!p) {
- RF_Malloc(buf, size, (char *));
- p = NewMemChunk(size, buf);
- }
- RF_UNLOCK_MUTEX(chunkmutex);
- (void) memset(p->buf, 0, size);
- return (p);
-}
-
-void
-rf_ReleaseMemChunk(chunk)
- RF_ChunkDesc_t *chunk;
-{
- RF_ChunkHdr_t *hdr, *ht = NULL, *new;
-
- RF_LOCK_MUTEX(chunkmutex);
- for (hdr = chunklist; hdr && hdr->size < chunk->size; ht = hdr, hdr = hdr->next);
- if (hdr && hdr->size == chunk->size) {
- chunk->next = hdr->list;
- hdr->list = chunk;
- } else {
- RF_Malloc(new, sizeof(RF_ChunkHdr_t), (RF_ChunkHdr_t *));
- new->size = chunk->size;
- new->list = chunk;
- chunk->next = NULL;
- if (ht) {
- new->next = ht->next;
- ht->next = new;
- } else {
- new->next = hdr;
- chunklist = new;
- }
- }
- RF_UNLOCK_MUTEX(chunkmutex);
-}
diff -r c0bd91ae14a6 -r a57242e10000 sys/dev/raidframe/rf_memchunk.h
--- a/sys/dev/raidframe/rf_memchunk.h Fri Aug 02 03:47:48 2002 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/* $NetBSD: rf_memchunk.h,v 1.4 2001/10/04 15:58:54 oster Exp $ */
-/*
- * Copyright (c) 1995 Carnegie-Mellon University.
- * All rights reserved.
- *
- * Author: Mark Holland
- *
- * Permission to use, copy, modify and distribute this software and
- * its documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
- * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution%CS.CMU.EDU@localhost
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- */
-
-/* header file for rf_memchunk.c. See comments there */
-
-#ifndef _RF__RF_MEMCHUNK_H_
-#define _RF__RF_MEMCHUNK_H_
-
-#include <dev/raidframe/raidframevar.h>
-
-struct RF_ChunkDesc_s {
- int size;
- int reuse_count;
- char *buf;
- RF_ChunkDesc_t *next;
-};
-
-int rf_ConfigureMemChunk(RF_ShutdownList_t ** listp);
-RF_ChunkDesc_t *rf_GetMemChunk(int size);
-void rf_ReleaseMemChunk(RF_ChunkDesc_t * chunk);
-
-#endif /* !_RF__RF_MEMCHUNK_H_ */
Home |
Main Index |
Thread Index |
Old Index