diff -ur uClinux-2.4.6.0pre0/mmnommu/slab.c uClinux-2.4.6.0pre0.actiontec/mmnommu/slab.c
--- uClinux-2.4.6.0pre0/mmnommu/slab.c	2004-12-12 20:06:43.000000000 +0100
+++ uClinux-2.4.6.0pre0.actiontec/mmnommu/slab.c	2004-12-15 17:58:10.000000000 +0100
@@ -72,6 +72,7 @@
 #include	<linux/slab.h>
 #include	<linux/interrupt.h>
 #include	<linux/init.h>
+#include	<linux/kernel.h>
 #include	<asm/uaccess.h>
 
 /*
@@ -92,8 +93,8 @@
 /*
  * Parameters for kmem_cache_reap
  */
-#define REAP_SCANLEN	10
-#define REAP_PERFECT	10
+#define REAP_SCANLEN	100
+#define REAP_PERFECT	100
 
 /* Shouldn't this be in a header file somewhere? */
 #if defined(CONFIG_UCSIMM) && !DEBUG
@@ -1854,34 +1855,54 @@
 				"\n");
 	FIXUP(got_data);
 
-	down(&cache_chain_sem);
-	p = &cache_cache.next;
-	do {
+#if STATS
+	len += sprintf(page+len, "Name                 Act  Total   Size   Act Total Pages/  High     Num Pages Pages  Num\n" ) ;
+	FIXUP(got_data);
+	len += sprintf(page+len, "                                       Pages Pages  Slab  Water  Allocs Added Remvd Errs\n" ) ;
+	FIXUP(got_data);
+	len += sprintf(page+len, "----------------------------------------------------------------------------------------\n" ) ;
+	FIXUP(got_data);
+#else
+	len += sprintf(page+len, "Name                 Act  Total   Size   Act Total Pages\n" ) ;
+	FIXUP(got_data);
+	len += sprintf(page+len, "                                       Pages Pages  Slab\n" ) ;
+	FIXUP(got_data);
+	len += sprintf(page+len, "--------------------------------------------------------\n" ) ;
+	FIXUP(got_data);
+#endif
+	{
 		kmem_cache_t	*cachep;
-		struct list_head *q;
-		slab_t		*slabp;
-		unsigned long	active_objs;
-		unsigned long	num_objs;
-		unsigned long	active_slabs = 0;
-		unsigned long	num_slabs;
-		cachep = list_entry(p, kmem_cache_t, next);
 
-		spin_lock_irq(&cachep->spinlock);
-		active_objs = 0;
-		num_slabs = 0;
-		list_for_each(q,&cachep->slabs) {
-			slabp = list_entry(q, slab_t, list);
-			active_objs += slabp->inuse;
-			num_objs += cachep->num;
-			if (slabp->inuse)
-				active_slabs++;
-			else
-				num_slabs++;
-		}
-		num_slabs+=active_slabs;
-		num_objs = num_slabs*cachep->num;
+		down(&cache_chain_sem);
+		p = &cache_cache.next;
+		do {
+			struct list_head *q;
+			slab_t		*slabp;
+			unsigned long	active_objs;
+			unsigned long	num_objs;
+			unsigned long	active_slabs = 0;
+			unsigned long	num_slabs;
+			cachep = list_entry(p, kmem_cache_t, next);
+#ifdef NO_MM
+			if (strpbrk(cachep->name, "DMA"))
+				continue;
+#endif
+			spin_lock_irq(&cachep->spinlock);
+			active_objs = 0;
+			num_slabs = 0;
+			list_for_each(q,&cachep->slabs) {
+				slabp = list_entry(q, slab_t, list);
+				active_objs += slabp->inuse;
+				num_objs += cachep->num;
+				if (slabp->inuse)
+					active_slabs++;
+				else
+					num_slabs++;
+			}
+			num_slabs+=active_slabs;
+			num_objs = num_slabs*cachep->num;
 
-		len += sprintf(page+len, "%-17s %6lu %6lu %6u %4lu %4lu %4u",
+		len += sprintf(page+len, "%-17s %6lu %6lu %7u %4lu %4lu %4u",
 			cachep->name, active_objs, num_objs, cachep->objsize,
 			active_slabs, num_slabs, (1<<cachep->gfporder));
 
@@ -1920,14 +1941,13 @@
 					allochit, allocmiss, freehit, freemiss);
 		}
 #endif
-		len += sprintf(page+len,"\n");
-		spin_unlock_irq(&cachep->spinlock);
-		FIXUP(got_data_up);
-		p = cachep->next.next;
-	} while (p != &cache_cache.next);
+			len += sprintf(page+len,"\n");
+			spin_unlock_irq(&cachep->spinlock);
+			FIXUP(got_data_up);
+		} while ( (p = cachep->next.next) != &cache_cache.next);
 got_data_up:
-	up(&cache_chain_sem);
-
+		up(&cache_chain_sem);
+	}
 got_data:
 	*start = page+off;
 	return len;
@@ -1975,13 +1995,55 @@
 int slabinfo_write_proc (struct file *file, const char *buffer,
 				unsigned long count, void *data)
 {
+	char *tmp;
 #ifdef CONFIG_SMP
-	char kbuf[MAX_SLABINFO_WRITE+1], *tmp;
+	char kbuf[MAX_SLABINFO_WRITE+1] ;
 	int limit, batchcount, res;
 	struct list_head *p;
+#endif
 	
 	if (count > MAX_SLABINFO_WRITE)
 		return -EINVAL;
+
+
+	{
+		int i ;
+		struct
+		{
+			const char *pname ;
+			int *pvar ;
+		} vartbl [] =
+		{
+			{NULL,		NULL}
+		} ;
+		
+		if (buffer[0]!='\n')
+		{
+			for (i=0; vartbl[i].pname!=NULL ;i++ )
+			{
+				if ( ( strncmp(buffer, vartbl[i].pname, strlen(vartbl[i].pname)) == 0)
+				  && ( buffer[strlen(vartbl[i].pname)] =='=' ))
+				{
+					tmp = strchr(buffer, '=');
+					if (!tmp)
+						return -EINVAL;
+					tmp++;
+					*(vartbl[i].pvar) = simple_strtol(tmp, &tmp, 10);
+					printk ( "%s set to %d\n", vartbl[i].pname, *(vartbl[i].pvar) ) ;
+					return count ;
+				}
+			}
+			printk ( "\"%s\" is unrecognized\n", buffer ) ;
+			printk ( "Format is: \"var=n\"\n" ) ;
+			printk ( "Recoginized variables are:\n" ) ;
+			for (i=0; vartbl[i].pname!=NULL ;i++ )
+			{
+				printk ( "  %s\n", vartbl[i].pname ) ;
+			}
+		}
+	}
+
+#ifdef CONFIG_SMP
 	if (copy_from_user(&kbuf, buffer, count))
 		return -EFAULT;
 	kbuf[MAX_SLABINFO_WRITE] = '\0'; 

