Module Name:    src
Committed By:   jym
Date:           Thu Oct  8 21:54:45 UTC 2009

Modified Files:
        src/share/man/man9: Makefile pool_cache.9
        src/sys/kern: subr_pool.c
        src/sys/sys: pool.h

Log Message:
Add pool_cache_invalidate_local() to the pool_cache(9) API, to permit
per-CPU objects invalidation when cached in the pool cache.

See http://mail-index.netbsd.org/tech-kern/2009/10/05/msg006206.html .

Reviewed by bou...@. Thanks!


To generate a diff of this commit:
cvs rdiff -u -r1.294 -r1.295 src/share/man/man9/Makefile
cvs rdiff -u -r1.10 -r1.11 src/share/man/man9/pool_cache.9
cvs rdiff -u -r1.174 -r1.175 src/sys/kern/subr_pool.c
cvs rdiff -u -r1.65 -r1.66 src/sys/sys/pool.h

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

Modified files:

Index: src/share/man/man9/Makefile
diff -u src/share/man/man9/Makefile:1.294 src/share/man/man9/Makefile:1.295
--- src/share/man/man9/Makefile:1.294	Mon Oct  5 23:44:10 2009
+++ src/share/man/man9/Makefile	Thu Oct  8 21:54:45 2009
@@ -1,4 +1,4 @@
-#       $NetBSD: Makefile,v 1.294 2009/10/05 23:44:10 rmind Exp $
+#       $NetBSD: Makefile,v 1.295 2009/10/08 21:54:45 jym Exp $
 
 #	Makefile for section 9 (kernel function and variable) manual pages.
 
@@ -543,7 +543,8 @@
 	pool_cache.9 pool_cache_put_paddr.9 \
 	pool_cache.9 pool_cache_put.9 \
 	pool_cache.9 pool_cache_destruct_object.9 \
-	pool_cache.9 pool_cache_invalidate.9
+	pool_cache.9 pool_cache_invalidate.9 \
+	pool_cache.9 pool_cache_invalidate_local.9
 MLINKS+=powerhook_establish.9 powerhook_disestablish.9
 MLINKS+=preempt.9 yield.9
 MLINKS+=ras.9 ras_lookup.9 \

Index: src/share/man/man9/pool_cache.9
diff -u src/share/man/man9/pool_cache.9:1.10 src/share/man/man9/pool_cache.9:1.11
--- src/share/man/man9/pool_cache.9:1.10	Sun Sep  6 19:46:24 2009
+++ src/share/man/man9/pool_cache.9	Thu Oct  8 21:54:45 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: pool_cache.9,v 1.10 2009/09/06 19:46:24 jym Exp $
+.\"	$NetBSD: pool_cache.9,v 1.11 2009/10/08 21:54:45 jym Exp $
 .\"
 .\" Copyright (c)2003 YAMAMOTO Takashi,
 .\" All rights reserved.
@@ -67,6 +67,7 @@
 .Nm pool_cache_put ,
 .Nm pool_cache_destruct_object ,
 .Nm pool_cache_invalidate ,
+.Nm pool_cache_invalidate_local ,
 .Nm pool_cache_sethiwat ,
 .Nm pool_cache_setlowat
 .Nd resource-pool cache manager
@@ -108,6 +109,10 @@
 .Fn pool_cache_invalidate \
 "pool_cache_t pc"
 .Ft void
+.Fn pool_cache_invalidate_local \
+"pool_cache_t pc"
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.Ft void
 .Fn pool_cache_sethiwat \
 "pool_cache_t pc" "int nitems"
 .Ft void
@@ -280,6 +285,17 @@
 If relevant, the user must check for this condition when allocating
 items.
 .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+.It Fn pool_cache_invalidate_local "pc"
+.Pp
+Invalidate local, current CPU pool cache
+.Fa pc .
+Destruct and release all objects in the local, current CPU cache.
+Only the Per-CPU caches associated to the current CPU calling the routine
+will be invalidated, meaning that stale items can still be allocated from
+other CPUs or the global cache.
+It is the caller's responsibility to ensure that such conditions do
+not occur.
+.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 .It Fn pool_cache_sethiwat "pc" "nitems"
 .Pp
 A pool will attempt to increase its resource usage to keep up with the demand

Index: src/sys/kern/subr_pool.c
diff -u src/sys/kern/subr_pool.c:1.174 src/sys/kern/subr_pool.c:1.175
--- src/sys/kern/subr_pool.c:1.174	Sun Sep 13 18:45:11 2009
+++ src/sys/kern/subr_pool.c	Thu Oct  8 21:54:45 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_pool.c,v 1.174 2009/09/13 18:45:11 pooka Exp $	*/
+/*	$NetBSD: subr_pool.c,v 1.175 2009/10/08 21:54:45 jym Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.174 2009/09/13 18:45:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.175 2009/10/08 21:54:45 jym Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pool.h"
@@ -188,6 +188,7 @@
 				    void **, paddr_t *, int);
 static void	pool_cache_cpu_init1(struct cpu_info *, pool_cache_t);
 static void	pool_cache_invalidate_groups(pool_cache_t, pcg_t *);
+static void	pool_cache_invalidate_cpu(pool_cache_t, u_int);
 static void	pool_cache_xcall(pool_cache_t);
 
 static int	pool_catchup(struct pool *);
@@ -2122,9 +2123,7 @@
 pool_cache_destroy(pool_cache_t pc)
 {
 	struct pool *pp = &pc->pc_pool;
-	pool_cache_cpu_t *cc;
-	pcg_t *pcg;
-	int i;
+	u_int i;
 
 	/* Remove it from the global list. */
 	mutex_enter(&pool_head_lock);
@@ -2142,20 +2141,8 @@
 	mutex_exit(&pp->pr_lock);
 
 	/* Destroy per-CPU data */
-	for (i = 0; i < MAXCPUS; i++) {
-		if ((cc = pc->pc_cpus[i]) == NULL)
-			continue;
-		if ((pcg = cc->cc_current) != &pcg_dummy) {
-			pcg->pcg_next = NULL;
-			pool_cache_invalidate_groups(pc, pcg);
-		}
-		if ((pcg = cc->cc_previous) != &pcg_dummy) {
-			pcg->pcg_next = NULL;
-			pool_cache_invalidate_groups(pc, pcg);
-		}
-		if (cc != &pc->pc_cpu0)
-			pool_put(&cache_cpu_pool, cc);
-	}
+	for (i = 0; i < MAXCPUS; i++)
+		pool_cache_invalidate_cpu(pc, i);
 
 	/* Finally, destroy it. */
 	mutex_destroy(&pc->pc_lock);
@@ -2325,6 +2312,54 @@
 	pool_cache_invalidate_groups(pc, part);
 }
 
+/*
+ * pool_cache_invalidate_local:
+ *
+ *	Invalidate all local ('current CPU') cached objects in
+ *	pool cache.
+ *	It is caller's responsibility to ensure that no operation is
+ *	taking place on this pool cache while doing the local invalidation.
+ */
+void
+pool_cache_invalidate_local(pool_cache_t pc)
+{
+	pool_cache_invalidate_cpu(pc, curcpu()->ci_index);
+}
+
+/*
+ * pool_cache_invalidate_cpu:
+ *
+ *	Invalidate all CPU-bound cached objects in pool cache, the CPU being
+ *	identified by its associated index.
+ *	It is caller's responsibility to ensure that no operation is
+ *	taking place on this pool cache while doing this invalidation.
+ *	WARNING: as no inter-CPU locking is enforced, trying to invalidate
+ *	pool cached objects from a CPU different from the one currently running
+ *	may result in an undefined behaviour.
+ */
+static void
+pool_cache_invalidate_cpu(pool_cache_t pc, u_int index)
+{
+
+	pool_cache_cpu_t *cc;
+	pcg_t *pcg;
+
+	if ((cc = pc->pc_cpus[index]) == NULL)
+		return;
+
+	if ((pcg = cc->cc_current) != &pcg_dummy) {
+		pcg->pcg_next = NULL;
+		pool_cache_invalidate_groups(pc, pcg);
+	}
+	if ((pcg = cc->cc_previous) != &pcg_dummy) {
+		pcg->pcg_next = NULL;
+		pool_cache_invalidate_groups(pc, pcg);
+	}
+	if (cc != &pc->pc_cpu0)
+		pool_put(&cache_cpu_pool, cc);
+
+}
+
 void
 pool_cache_set_drain_hook(pool_cache_t pc, void (*fn)(void *, int), void *arg)
 {

Index: src/sys/sys/pool.h
diff -u src/sys/sys/pool.h:1.65 src/sys/sys/pool.h:1.66
--- src/sys/sys/pool.h:1.65	Sun Sep 13 18:45:12 2009
+++ src/sys/sys/pool.h	Thu Oct  8 21:54:45 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pool.h,v 1.65 2009/09/13 18:45:12 pooka Exp $	*/
+/*	$NetBSD: pool.h,v 1.66 2009/10/08 21:54:45 jym Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 1999, 2000, 2007 The NetBSD Foundation, Inc.
@@ -321,6 +321,7 @@
 void		pool_cache_put_paddr(pool_cache_t, void *, paddr_t);
 void		pool_cache_destruct_object(pool_cache_t, void *);
 void		pool_cache_invalidate(pool_cache_t);
+void		pool_cache_invalidate_local(pool_cache_t);
 bool		pool_cache_reclaim(pool_cache_t);
 void		pool_cache_set_drain_hook(pool_cache_t,
 		    void (*)(void *, int), void *);

Reply via email to