objcache depot not used?

Nicolas Thery nthery at gmail.com
Wed Jan 30 13:16:23 PST 2008


2008/1/29, Matthew Dillon <dillon at apollo.backplane.com>:
>     Ok.  Well, I think your fix is correct.  Go ahead and spuce it up and
>     post it.

Here is it with your suggested calculation:

Index: src2/sys/kern/kern_objcache.c
===================================================================
--- src2.orig/sys/kern/kern_objcache.c	2008-01-23 07:30:38.000000000 +0100
+++ src2/sys/kern/kern_objcache.c	2008-01-23 08:39:44.000000000 +0100
@@ -186,6 +186,8 @@ objcache_create(const char *name, int cl
 	int cpuid;
 	int need;
 	int factor;
+	int nmagdepot;
+	int i;

 	/* allocate object cache structure */
 	oc = kmalloc(__offsetof(struct objcache, cache_percpu[ncpus]),
@@ -250,6 +252,29 @@ objcache_create(const char *name, int cl
 		cache_percpu->loaded_magazine = mag_alloc(mag_capacity);
 		cache_percpu->previous_magazine = mag_alloc(mag_capacity);
 	}
+
+	/* compute initial number of empty magazines in depot */
+	nmagdepot = 0;
+	if (cluster_limit > 0) {
+		/* max number of magazines in depot */
+		nmagdepot = (cluster_limit - ncpus * 2 * mag_capacity) /
+				mag_capacity;
+
+		/* retain at most 50% of the limit */
+		nmagdepot /= 2;
+	}
+	/* bound result to acceptable range */
+	if (nmagdepot < 2)
+		nmagdepot = 2;
+	if (nmagdepot > 10)
+		nmagdepot = 10;
+
+	/* put empty magazines in depot */
+	for (i = 0; i < nmagdepot; i++) {
+		struct magazine *mag = mag_alloc(mag_capacity);
+		SLIST_INSERT_HEAD(&depot->emptymagazines, mag, nextmagazine);
+	}
+
 	spin_lock_wr(&objcachelist_spin);
 	LIST_INSERT_HEAD(&allobjcaches, oc, oc_next);
 	spin_unlock_wr(&objcachelist_spin);

I intend to test it a bit more and submit it in a couple of days if
everybody is fine with it.





More information about the Kernel mailing list