diff options
Diffstat (limited to 'sys/dev/raidframe')
| -rw-r--r-- | sys/dev/raidframe/rf_dag.h | 4 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_dagutils.c | 58 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_dagutils.h | 5 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_netbsd.h | 3 |
4 files changed, 64 insertions, 6 deletions
diff --git a/sys/dev/raidframe/rf_dag.h b/sys/dev/raidframe/rf_dag.h index 2a6dbbaf1d7..064d7a0fb4e 100644 --- a/sys/dev/raidframe/rf_dag.h +++ b/sys/dev/raidframe/rf_dag.h @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dag.h,v 1.13 2004/03/19 15:16:18 oster Exp $ */ +/* $NetBSD: rf_dag.h,v 1.14 2004/03/19 17:01:26 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -126,6 +126,8 @@ struct RF_DagNode_s { * IT FINISHES, ALL VISITED FLAGS IN THE DAG ARE IDENTICAL */ char *name; /* debug only */ RF_DagNodeFlags_t flags;/* see below */ + RF_DagNode_t *big_dag_ptrs; /* used in cases where the cache below isn't big enough */ + RF_DagParam_t *big_dag_params; /* used when the cache below isn't big enough */ RF_DagNode_t *dag_ptrs[RF_DAG_PTRCACHESIZE]; /* cache for performance */ RF_DagParam_t dag_params[RF_DAG_PARAMCACHESIZE]; /* cache for performance */ }; diff --git a/sys/dev/raidframe/rf_dagutils.c b/sys/dev/raidframe/rf_dagutils.c index 71b06e51785..5a0c4a5cd70 100644 --- a/sys/dev/raidframe/rf_dagutils.c +++ b/sys/dev/raidframe/rf_dagutils.c @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagutils.c,v 1.39 2004/03/19 15:16:18 oster Exp $ */ +/* $NetBSD: rf_dagutils.c,v 1.40 2004/03/19 17:01:26 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ *****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_dagutils.c,v 1.39 2004/03/19 15:16:18 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagutils.c,v 1.40 2004/03/19 17:01:26 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -66,6 +66,22 @@ static void rf_ValidateBranchVisitedBits(RF_DagNode_t *, int, int); static void rf_ValidateVisitedBits(RF_DagHeader_t *); #endif /* RF_DEBUG_VALIDATE_DAG */ + +/* The maximum number of nodes in a DAG is bounded by + +(2 * raidPtr->Layout->numDataCol) + (1 * layoutPtr->numParityCol) + + (1 * 2 * layoutPtr->numParityCol) + 3 + +which is: 2*RF_MAXCOL+1*2+1*2*2+3 + +For RF_MAXCOL of 40, this works out to 89. We use this value to provide an estimate +on the maximum size needed for RF_DAGPCACHE_SIZE. For RF_MAXCOL of 40, this structure +would be 534 bytes. Too much to have on-hand in a RF_DagNode_t, but should be ok to +have a few kicking around. +*/ +#define RF_DAGPCACHE_SIZE ((2*RF_MAXCOL+1*2+1*2*2+3) *(RF_MAX(sizeof(RF_DagParam_t), sizeof(RF_DagNode_t *)))) + + /****************************************************************************** * * InitNode - initialize a dag node @@ -74,7 +90,7 @@ static void rf_ValidateVisitedBits(RF_DagHeader_t *); * successors array. * *****************************************************************************/ -void +void rf_InitNode(RF_DagNode_t *node, RF_NodeStatus_t initstatus, int commit, int (*doFunc) (RF_DagNode_t *node), int (*undoFunc) (RF_DagNode_t *node), @@ -103,6 +119,8 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeStatus_t initstatus, int commit, node->numSuccedents = nSucc; node->name = name; node->dagHdr = hdr; + node->big_dag_ptrs = NULL; + node->big_dag_params = NULL; node->visited = 0; /* allocate all the pointers with one call to malloc */ @@ -121,6 +139,9 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeStatus_t initstatus, int commit, * (wasted memory) */ ptrs = (void **) node->dag_ptrs; + } else if (nptrs <= (RF_DAGPCACHE_SIZE / sizeof(RF_DagNode_t *))) { + node->big_dag_ptrs = rf_AllocDAGPCache(); + ptrs = (void **) node->big_dag_ptrs; } else { RF_MallocAndAdd(ptrs, nptrs * sizeof(void *), (void **), alist); @@ -133,6 +154,9 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeStatus_t initstatus, int commit, if (nParam) { if (nParam <= RF_DAG_PARAMCACHESIZE) { node->params = (RF_DagParam_t *) node->dag_params; + } else if (nParam <= (RF_DAGPCACHE_SIZE / sizeof(RF_DagParam_t))) { + node->big_dag_params = rf_AllocDAGPCache(); + node->params = node->big_dag_params; } else { RF_MallocAndAdd(node->params, nParam * sizeof(RF_DagParam_t), @@ -191,6 +215,9 @@ rf_FreeDAG(RF_DagHeader_t *dag_h) #define RF_MAX_FREE_DAGLIST 128 #define RF_MIN_FREE_DAGLIST 32 +#define RF_MAX_FREE_DAGPCACHE 128 +#define RF_MIN_FREE_DAGPCACHE 8 + #define RF_MAX_FREE_FUNCLIST 128 #define RF_MIN_FREE_FUNCLIST 32 @@ -201,6 +228,7 @@ rf_ShutdownDAGs(void *ignored) pool_destroy(&rf_pools.dagh); pool_destroy(&rf_pools.dagnode); pool_destroy(&rf_pools.daglist); + pool_destroy(&rf_pools.dagpcache); pool_destroy(&rf_pools.funclist); } @@ -214,6 +242,8 @@ rf_ConfigureDAGs(RF_ShutdownList_t **listp) "rf_dagh_pl", RF_MIN_FREE_DAGH, RF_MAX_FREE_DAGH); rf_pool_init(&rf_pools.daglist, sizeof(RF_DagList_t), "rf_daglist_pl", RF_MIN_FREE_DAGLIST, RF_MAX_FREE_DAGLIST); + rf_pool_init(&rf_pools.dagpcache, RF_DAGPCACHE_SIZE, + "rf_dagpcache_pl", RF_MIN_FREE_DAGPCACHE, RF_MAX_FREE_DAGPCACHE); rf_pool_init(&rf_pools.funclist, sizeof(RF_FuncList_t), "rf_funclist_pl", RF_MIN_FREE_FUNCLIST, RF_MAX_FREE_FUNCLIST); rf_ShutdownCreate(listp, rf_ShutdownDAGs, NULL); @@ -250,6 +280,12 @@ rf_AllocDAGNode() void rf_FreeDAGNode(RF_DagNode_t *node) { + if (node->big_dag_ptrs) { + rf_FreeDAGPCache(node->big_dag_ptrs); + } + if (node->big_dag_params) { + rf_FreeDAGPCache(node->big_dag_params); + } pool_put(&rf_pools.dagnode, node); } @@ -270,6 +306,22 @@ rf_FreeDAGList(RF_DagList_t *dagList) pool_put(&rf_pools.daglist, dagList); } +void * +rf_AllocDAGPCache() +{ + void *p; + p = pool_get(&rf_pools.dagpcache, PR_WAITOK); + memset(p, 0, RF_DAGPCACHE_SIZE); + + return (p); +} + +void +rf_FreeDAGPCache(void *p) +{ + pool_put(&rf_pools.dagpcache, p); +} + RF_FuncList_t * rf_AllocFuncList() { diff --git a/sys/dev/raidframe/rf_dagutils.h b/sys/dev/raidframe/rf_dagutils.h index 95d96ebd5c5..b396a89d039 100644 --- a/sys/dev/raidframe/rf_dagutils.h +++ b/sys/dev/raidframe/rf_dagutils.h @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagutils.h,v 1.11 2004/03/18 16:40:05 oster Exp $ */ +/* $NetBSD: rf_dagutils.h,v 1.12 2004/03/19 17:01:26 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -79,6 +79,9 @@ void rf_FreeDAGNode(RF_DagNode_t *); RF_DagList_t *rf_AllocDAGList(void); void rf_FreeDAGList(RF_DagList_t *); +void *rf_AllocDAGPCache(void); +void rf_FreeDAGPCache(void *); + RF_FuncList_t *rf_AllocFuncList(void); void rf_FreeFuncList(RF_FuncList_t *); diff --git a/sys/dev/raidframe/rf_netbsd.h b/sys/dev/raidframe/rf_netbsd.h index b434e685ab4..d69695c82d0 100644 --- a/sys/dev/raidframe/rf_netbsd.h +++ b/sys/dev/raidframe/rf_netbsd.h @@ -1,4 +1,4 @@ -/* $NetBSD: rf_netbsd.h,v 1.17 2004/03/19 02:27:44 oster Exp $ */ +/* $NetBSD: rf_netbsd.h,v 1.18 2004/03/19 17:01:26 oster Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -72,6 +72,7 @@ struct RF_Pools_s { struct pool dagh; /* DAG headers */ struct pool dagnode; /* DAG nodes */ struct pool daglist; /* DAG lists */ + struct pool dagpcache; /* DAG pointer/param cache */ struct pool dqd; /* Disk Queue Data */ struct pool fss; /* Failed Stripe Structures */ struct pool funclist; /* Function Lists */ |
