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));

        /*

Reply via email to