Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Add pool_cache_invalidate_local() to the pool_cache(9) API, ...
details: https://anonhg.NetBSD.org/src/rev/de691ec04c1d
branches: trunk
changeset: 748003:de691ec04c1d
user: jym <jym%NetBSD.org@localhost>
date: Thu Oct 08 21:54:45 2009 +0000
description:
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 bouyer@. Thanks!
diffstat:
share/man/man9/Makefile | 5 +-
share/man/man9/pool_cache.9 | 18 ++++++++++-
sys/kern/subr_pool.c | 73 +++++++++++++++++++++++++++++++++-----------
sys/sys/pool.h | 3 +-
4 files changed, 76 insertions(+), 23 deletions(-)
diffs (197 lines):
diff -r 4087061b24e1 -r de691ec04c1d share/man/man9/Makefile
--- a/share/man/man9/Makefile Thu Oct 08 20:36:41 2009 +0000
+++ b/share/man/man9/Makefile Thu Oct 08 21:54:45 2009 +0000
@@ -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 \
diff -r 4087061b24e1 -r de691ec04c1d share/man/man9/pool_cache.9
--- a/share/man/man9/pool_cache.9 Thu Oct 08 20:36:41 2009 +0000
+++ b/share/man/man9/pool_cache.9 Thu Oct 08 21:54:45 2009 +0000
@@ -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
diff -r 4087061b24e1 -r de691ec04c1d sys/kern/subr_pool.c
--- a/sys/kern/subr_pool.c Thu Oct 08 20:36:41 2009 +0000
+++ b/sys/kern/subr_pool.c Thu Oct 08 21:54:45 2009 +0000
@@ -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)
{
diff -r 4087061b24e1 -r de691ec04c1d sys/sys/pool.h
--- a/sys/sys/pool.h Thu Oct 08 20:36:41 2009 +0000
+++ b/sys/sys/pool.h Thu Oct 08 21:54:45 2009 +0000
@@ -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 *);
Home |
Main Index |
Thread Index |
Old Index