migrating proc from zone to objcache

Nicolas Thery nthery at gmail.com
Mon Mar 31 11:29:49 PDT 2008


Hello,

Now that the release is over, I'll try to get rid of zones and migrate
allocations to objcache.

Here is a 1st patch that migrate struct proc.  I'll commit it in a
couple of days if nobody objects.

I'm also implementing a way to monitor objcache statistics.  So far,
I've hacked sth similar to
sysctl vm.zone: stats are returned in one giant string, one line per
cache.  That's simple but ugly and hard to read because there are
quite a few stats per cache.

So I'm thinking about implementing a small tool, ocstat, that extracts
stats from sysctl the way ps(1) does (thru libkvm iirc) and formats it
in various ways.  What do you think?

Cheers,
Nicolas

Index: src2/sys/kern/kern_exit.c
===================================================================
--- src2.orig/sys/kern/kern_exit.c	2008-03-31 08:05:59.139796000 +0200
+++ src2/sys/kern/kern_exit.c	2008-03-31 10:31:39.000000000 +0200
@@ -834,7 +834,7 @@ loop:
 			}

 			vm_waitproc(p);
-			zfree(proc_zone, p);
+			objcache_put(proc_cache, p);
 			nprocs--;
 			return (0);
 		}
Index: src2/sys/kern/kern_proc.c
===================================================================
--- src2.orig/sys/kern/kern_proc.c	2008-03-31 08:05:59.139918000 +0200
+++ src2/sys/kern/kern_proc.c	2008-03-31 10:31:39.000000000 +0200
@@ -84,7 +84,7 @@ u_long pgrphash;
 struct proclist allproc;
 struct proclist zombproc;
 struct spinlock allproc_spin;
-vm_zone_t proc_zone;
+struct objcache* proc_cache;
 vm_zone_t lwp_zone;
 vm_zone_t thread_zone;

@@ -131,7 +131,7 @@ procinit(void)
 	spin_init(&allproc_spin);
 	pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash);
 	pgrphashtbl = hashinit(maxproc / 4, M_PROC, &pgrphash);
-	proc_zone = zinit("PROC", sizeof (struct proc), 0, 0, 5);
+	proc_cache = objcache_create_simple(M_PROC, sizeof(struct proc));
 	lwp_zone = zinit("LWP", sizeof (struct lwp), 0, 0, 5);
 	thread_zone = zinit("THREAD", sizeof (struct thread), 0, 0, 5);
 	uihashinit();
Index: src2/sys/sys/proc.h
===================================================================
--- src2.orig/sys/sys/proc.h	2008-03-31 08:05:59.140325000 +0200
+++ src2/sys/sys/proc.h	2008-03-31 10:31:39.000000000 +0200
@@ -473,7 +473,7 @@ struct proc *zpfind (pid_t);	/* Find zom
 struct vm_zone;
 struct globaldata;
 struct lwp_params;
-extern struct vm_zone *proc_zone;
+extern struct objcache *proc_cache;
 extern struct vm_zone *lwp_zone;

 int	enterpgrp (struct proc *p, pid_t pgid, int mksess);
Index: src2/sys/kern/kern_fork.c
===================================================================
--- src2.orig/sys/kern/kern_fork.c	2008-03-31 08:05:59.140042000 +0200
+++ src2/sys/kern/kern_fork.c	2008-03-31 10:31:39.000000000 +0200
@@ -332,7 +332,7 @@ fork1(struct lwp *lp1, int flags, struct
 	}

 	/* Allocate new proc. */
-	p2 = zalloc(proc_zone);
+	p2 = objcache_get(proc_cache, M_WAITOK);
 	bzero(p2, sizeof(*p2));

 	/*





More information about the Kernel mailing list