Module Name:    src
Committed By:   mlelstv
Date:           Fri Jan  3 07:14:21 UTC 2014

Modified Files:
        src/sys/arch/amiga/amiga: cc.c cc.h
        src/sys/arch/atari/atari: stalloc.c stalloc.h

Log Message:
Fix allocator routines. Instead of abusing CIRCLEQ pointers, add an explicit
type field to tag memory nodes that are or are not on the free list.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amiga/amiga/cc.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/amiga/amiga/cc.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/atari/atari/stalloc.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/atari/atari/stalloc.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amiga/amiga/cc.c
diff -u src/sys/arch/amiga/amiga/cc.c:1.24 src/sys/arch/amiga/amiga/cc.c:1.25
--- src/sys/arch/amiga/amiga/cc.c:1.24	Wed Nov 27 17:24:43 2013
+++ src/sys/arch/amiga/amiga/cc.c	Fri Jan  3 07:14:20 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: cc.c,v 1.24 2013/11/27 17:24:43 christos Exp $	*/
+/*	$NetBSD: cc.c,v 1.25 2014/01/03 07:14:20 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1994 Christian E. Hopps
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cc.c,v 1.24 2013/11/27 17:24:43 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cc.c,v 1.25 2014/01/03 07:14:20 mlelstv Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -513,7 +513,7 @@ alloc_chipmem(u_long size)
 		 * for a new node in between.
 		 */
 		TAILQ_REMOVE(&free_list, mn, free_link);
-		TAILQ_NEXT(mn, free_link) = NULL;
+		mn->type = MNODE_USED;
 		size = mn->size;	 /* increase size. (or same) */
 		chip_total -= mn->size;
 		splx(s);
@@ -533,7 +533,7 @@ alloc_chipmem(u_long size)
 	 * and mark as not on free list
 	 */
 	TAILQ_INSERT_AFTER(&chip_list, new, mn, link);
-	TAILQ_NEXT(mn, free_link) = NULL;
+	mn->type = MNODE_USED;
 
 	chip_total -= size + sizeof(struct mem_node);
 	splx(s);
@@ -557,52 +557,53 @@ free_chipmem(void *mem)
 	/*
 	 * check ahead of us.
 	 */
-	if (TAILQ_NEXT(next, link) != NULL &&
-	    TAILQ_NEXT(next, free_link) != NULL) {
+	if (next->type == MNODE_FREE) {
 		/*
 		 * if next is: a valid node and a free node. ==> merge
 		 */
 		TAILQ_INSERT_BEFORE(next, mn, free_link);
+		mn->type = MNODE_FREE;
 		TAILQ_REMOVE(&chip_list, next, link);
-		TAILQ_REMOVE(&chip_list, next, free_link);
+		TAILQ_REMOVE(&free_list, next, free_link);
 		chip_total += mn->size + sizeof(struct mem_node);
 		mn->size += next->size + sizeof(struct mem_node);
 	}
-	if (TAILQ_PREV(prev, chiplist, link) != NULL &&
-	    TAILQ_PREV(prev, freelist, free_link) != NULL) {
+	if (prev->type == MNODE_FREE) {
 		/*
 		 * if prev is: a valid node and a free node. ==> merge
 		 */
-		if (TAILQ_NEXT(mn, free_link) == NULL)
+		if (mn->type != MNODE_FREE)
 			chip_total += mn->size + sizeof(struct mem_node);
 		else {
 			/* already on free list */
 			TAILQ_REMOVE(&free_list, mn, free_link);
+			mn->type = MNODE_USED;
 			chip_total += sizeof(struct mem_node);
 		}
 		TAILQ_REMOVE(&chip_list, mn, link);
 		prev->size += mn->size + sizeof(struct mem_node);
-	} else if (TAILQ_NEXT(mn, free_link) == NULL) {
+	} else if (mn->type != MNODE_FREE) {
 		/*
 		 * we still are not on free list and we need to be.
 		 * <-- | -->
 		 */
-		while (TAILQ_NEXT(next, link) != NULL &&
-		    TAILQ_PREV(prev, chiplist, link) != NULL) {
-			if (TAILQ_NEXT(next, free_link) != NULL) {
+		while (next != NULL && prev != NULL) {
+			if (next->type == MNODE_FREE) {
 				TAILQ_INSERT_BEFORE(next, mn, free_link);
+				mn->type = MNODE_FREE;
 				break;
 			}
-			if (TAILQ_NEXT(prev, free_link) != NULL) {
+			if (prev->type == MNODE_FREE) {
 				TAILQ_INSERT_AFTER(&free_list, prev, mn,
 				    free_link);
+				mn->type = MNODE_FREE;
 				break;
 			}
 			prev = TAILQ_PREV(prev, chiplist, link);
 			next = TAILQ_NEXT(next, link);
 		}
-		if (TAILQ_NEXT(mn, free_link) == NULL) {
-			if (TAILQ_NEXT(next, link) == NULL) {
+		if (mn->type != MNODE_FREE) {
+			if (next == NULL) {
 				/*
 				 * we are not on list so we can add
 				 * ourselves to the tail. (we walked to it.)
@@ -611,6 +612,7 @@ free_chipmem(void *mem)
 			} else {
 				TAILQ_INSERT_HEAD(&free_list,mn,free_link);
 			}
+			mn->type = MNODE_FREE;
 		}
 		chip_total += mn->size;	/* add our helpings to the pool. */
 	}

Index: src/sys/arch/amiga/amiga/cc.h
diff -u src/sys/arch/amiga/amiga/cc.h:1.17 src/sys/arch/amiga/amiga/cc.h:1.18
--- src/sys/arch/amiga/amiga/cc.h:1.17	Sat Nov 23 22:48:00 2013
+++ src/sys/arch/amiga/amiga/cc.h	Fri Jan  3 07:14:20 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: cc.h,v 1.17 2013/11/23 22:48:00 christos Exp $	*/
+/*	$NetBSD: cc.h,v 1.18 2014/01/03 07:14:20 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1994 Christian E. Hopps
@@ -160,7 +160,10 @@ struct mem_node {
 	TAILQ_ENTRY(mem_node) link; 
 	TAILQ_ENTRY(mem_node) free_link;
 	u_long size;		/* size of memory following node. */
+	u_char type;		/* free, used */
 };
+#define MNODE_FREE 0
+#define MNODE_USED 1
 
 #define CM_BLOCKSIZE 0x4
 #define CM_BLOCKMASK (~(CM_BLOCKSIZE - 1))

Index: src/sys/arch/atari/atari/stalloc.c
diff -u src/sys/arch/atari/atari/stalloc.c:1.15 src/sys/arch/atari/atari/stalloc.c:1.16
--- src/sys/arch/atari/atari/stalloc.c:1.15	Wed Nov 27 17:24:43 2013
+++ src/sys/arch/atari/atari/stalloc.c	Fri Jan  3 07:14:20 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: stalloc.c,v 1.15 2013/11/27 17:24:43 christos Exp $	*/
+/*	$NetBSD: stalloc.c,v 1.16 2014/01/03 07:14:20 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman (Atari modifications)
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: stalloc.c,v 1.15 2013/11/27 17:24:43 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: stalloc.c,v 1.16 2014/01/03 07:14:20 mlelstv Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -117,7 +117,7 @@ alloc_stmem(u_long size, void **phys_add
 		 * for a new node in between.
 		 */
 		TAILQ_REMOVE(&free_list, mn, free_link);
-		TAILQ_NEXT(mn, free_link) = NULL;
+		mn->type = MNODE_USED;
 		size = mn->size;	 /* increase size. (or same) */
 		stmem_total -= mn->size;
 		splx(s);
@@ -138,7 +138,7 @@ alloc_stmem(u_long size, void **phys_add
 	 * and mark as not on free list
 	 */
 	TAILQ_INSERT_AFTER(&st_list, new, mn, link);
-	TAILQ_NEXT(mn, free_link) = NULL;
+	mn->type = MNODE_USED;
 
 	stmem_total -= size + sizeof(struct mem_node);
 	splx(s);
@@ -150,7 +150,7 @@ void
 free_stmem(void *mem)
 {
 	struct mem_node *mn, *next, *prev;
-	int		s;
+	int s;
 
 	if (mem == NULL)
 		return;
@@ -163,48 +163,52 @@ free_stmem(void *mem)
 	/*
 	 * check ahead of us.
 	 */
-	if (next != NULL && TAILQ_NEXT(next, free_link) != NULL) {
+	if (next->type == MNODE_FREE) {
 		/*
 		 * if next is: a valid node and a free node. ==> merge
 		 */
 		TAILQ_INSERT_BEFORE(next, mn, free_link);
+		mn->type = MNODE_FREE;
 		TAILQ_REMOVE(&st_list, next, link);
-		TAILQ_REMOVE(&st_list, next, free_link);
+		TAILQ_REMOVE(&free_list, next, free_link);
 		stmem_total += mn->size + sizeof(struct mem_node);
 		mn->size += next->size + sizeof(struct mem_node);
 	}
-	if (prev != NULL && TAILQ_PREV(prev, freelist, free_link) != NULL) {
+	if (prev->type == MNODE_FREE) {
 		/*
 		 * if prev is: a valid node and a free node. ==> merge
 		 */
-		if (TAILQ_NEXT(mn, free_link) == NULL)
+		if (mn->type != MNODE_FREE)
 			stmem_total += mn->size + sizeof(struct mem_node);
 		else {
 			/* already on free list */
 			TAILQ_REMOVE(&free_list, mn, free_link);
+			mn->type = MNODE_USED;
 			stmem_total += sizeof(struct mem_node);
 		}
 		TAILQ_REMOVE(&st_list, mn, link);
 		prev->size += mn->size + sizeof(struct mem_node);
-	} else if (TAILQ_NEXT(mn, free_link) == NULL) {
+	} else if (mn->type != MNODE_FREE) {
 		/*
 		 * we still are not on free list and we need to be.
 		 * <-- | -->
 		 */
 		while (next != NULL && prev != NULL) {
-			if (TAILQ_NEXT(next, free_link) != NULL) {
+			if (next->type == MNODE_FREE) {
 				TAILQ_INSERT_BEFORE(next, mn, free_link);
+				mn->type = MNODE_FREE;
 				break;
 			}
-			if (TAILQ_NEXT(prev, free_link) != NULL) {
+			if (prev->type == MNODE_FREE) {
 				TAILQ_INSERT_AFTER(&free_list, prev, mn,
 				    free_link);
+				mn->type = MNODE_FREE;
 				break;
 			}
 			prev = TAILQ_PREV(prev, stlist, link);
 			next = TAILQ_NEXT(next, link);
 		}
-		if (TAILQ_NEXT(mn, free_link) == NULL) {
+		if (mn->type != MNODE_FREE) {
 			if (next == NULL) {
 				/*
 				 * we are not on list so we can add
@@ -214,6 +218,7 @@ free_stmem(void *mem)
 			} else {
 				TAILQ_INSERT_HEAD(&free_list,mn,free_link);
 			}
+				mn->type = MNODE_FREE;
 		}
 		stmem_total += mn->size;/* add our helpings to the pool. */
 	}

Index: src/sys/arch/atari/atari/stalloc.h
diff -u src/sys/arch/atari/atari/stalloc.h:1.5 src/sys/arch/atari/atari/stalloc.h:1.6
--- src/sys/arch/atari/atari/stalloc.h:1.5	Sat Nov 23 22:52:40 2013
+++ src/sys/arch/atari/atari/stalloc.h	Fri Jan  3 07:14:20 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: stalloc.h,v 1.5 2013/11/23 22:52:40 christos Exp $	*/
+/*	$NetBSD: stalloc.h,v 1.6 2014/01/03 07:14:20 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1994 Christian E. Hopps (allocator stuff)
@@ -42,7 +42,10 @@ struct mem_node {
 	TAILQ_ENTRY(mem_node) link; 	
 	TAILQ_ENTRY(mem_node) free_link;
 	u_long size;		/* size of memory following node. */
+	u_char type;		/* free, used */
 };
+#define MNODE_FREE 0
+#define MNODE_USED 1
 
 #define ST_BLOCKSIZE	(sizeof(long))
 #define ST_BLOCKMASK	(~(ST_BLOCKSIZE - 1))

Reply via email to