diff options
Diffstat (limited to 'sys/dev/raidframe')
| -rw-r--r-- | sys/dev/raidframe/rf_aselect.c | 35 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_dag.h | 3 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_dagutils.c | 37 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_dagutils.h | 5 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_desc.h | 4 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_driver.c | 16 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_states.c | 76 |
7 files changed, 127 insertions, 49 deletions
diff --git a/sys/dev/raidframe/rf_aselect.c b/sys/dev/raidframe/rf_aselect.c index cb44df9b1aa..d62ab82f889 100644 --- a/sys/dev/raidframe/rf_aselect.c +++ b/sys/dev/raidframe/rf_aselect.c @@ -1,4 +1,4 @@ -/* $NetBSD: rf_aselect.c,v 1.11 2004/01/02 21:41:08 oster Exp $ */ +/* $NetBSD: rf_aselect.c,v 1.12 2004/02/27 02:55:18 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ *****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_aselect.c,v 1.11 2004/01/02 21:41:08 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_aselect.c,v 1.12 2004/02/27 02:55:18 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -82,8 +82,8 @@ InitHdrNode(RF_DagHeader_t **hdr, RF_Raid_t *raidPtr) * * Create a DAG to do a read or write operation. * - * create an array of dagLists, one list per parity stripe. - * return the lists in the array desc->dagArray. + * create a list of dagLists, one list per parity stripe. + * return the lists in the desc->dagList (which is a list of lists). * * Normally, each list contains one dag for the entire stripe. In some * tricky cases, we break this into multiple dags, either one per stripe @@ -123,6 +123,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) RF_AccessStripeMap_t *asmap = asm_h->stripeMap; RF_AccessStripeMap_t *asm_p; RF_DagHeader_t *dag_h = NULL, *tempdag_h, *lastdag_h; + RF_DagList_t *dagList, *dagListend; int i, j, k; RF_VoidFuncPtr *stripeFuncs, normalStripeFuncs[MAXNSTRIPES]; RF_AccessStripeMap_t *asm_up, *asm_bp; @@ -273,13 +274,25 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) stripeNum = 0; stripeUnitNum = 0; - /* create an array of dagLists and fill them in */ - RF_MallocAndAdd(desc->dagArray, desc->numStripes * sizeof(RF_DagList_t), (RF_DagList_t *), desc->cleanupList); + /* create a list of dagLists and fill them in */ + + dagListend = NULL; for (i = 0, asm_p = asmap; asm_p; asm_p = asm_p->next, i++) { /* grab dag header for this stripe */ dag_h = NULL; - desc->dagArray[i].desc = desc; + + dagList = rf_AllocDAGList(); + + /* always tack the new dagList onto the end of the list... */ + if (dagListend == NULL) { + desc->dagList = dagList; + } else { + dagListend->next = dagList; + } + dagListend = dagList; + + dagList->desc = desc; if (stripeFuncs[i] == (RF_VoidFuncPtr) NULL) { /* use bailout functions for this stripe */ @@ -292,7 +305,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) /* create a dag for * this block */ InitHdrNode(&tempdag_h, raidPtr); - desc->dagArray[i].numDags++; + dagList->numDags++; if (dag_h == NULL) { dag_h = tempdag_h; } else { @@ -309,7 +322,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) } else { /* create a dag for this unit */ InitHdrNode(&tempdag_h, raidPtr); - desc->dagArray[i].numDags++; + dagList->numDags++; if (dag_h == NULL) { dag_h = tempdag_h; } else { @@ -328,7 +341,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) } else { /* Create a dag for this parity stripe */ InitHdrNode(&tempdag_h, raidPtr); - desc->dagArray[i].numDags++; + dagList->numDags++; if (dag_h == NULL) { dag_h = tempdag_h; } else { @@ -338,7 +351,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t *desc, RF_RaidAccessFlags_t flags) (stripeFuncs[i]) (raidPtr, asm_p, tempdag_h, bp, flags, tempdag_h->allocList); } - desc->dagArray[i].dags = dag_h; + dagList->dags = dag_h; } RF_ASSERT(i == desc->numStripes); diff --git a/sys/dev/raidframe/rf_dag.h b/sys/dev/raidframe/rf_dag.h index 7a3c2014a32..9f830748b93 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.7 2002/09/23 23:53:54 oster Exp $ */ +/* $NetBSD: rf_dag.h,v 1.8 2004/02/27 02:55:17 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -190,6 +190,7 @@ struct RF_DagList_s { RF_RaidAccessDesc_t *desc; /* ptr to descriptor for this access */ RF_AccTraceEntry_t tracerec; /* perf mon info for dags (not user * info) */ + struct RF_DagList_s *next; /* next DagList, if any */ }; /* convience macro for declaring a create dag function */ diff --git a/sys/dev/raidframe/rf_dagutils.c b/sys/dev/raidframe/rf_dagutils.c index 584990b4821..4234a0d6e26 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.24 2004/01/10 17:04:44 oster Exp $ */ +/* $NetBSD: rf_dagutils.c,v 1.25 2004/02/27 02:55:17 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.24 2004/01/10 17:04:44 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagutils.c,v 1.25 2004/02/27 02:55:17 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -172,6 +172,12 @@ static struct pool rf_dagh_pool; #define RF_DAGH_INC 16 #define RF_DAGH_INITIAL 32 +static struct pool rf_daglist_pool; +#define RF_MAX_FREE_DAGLIST 128 +#define RF_DAGLIST_INITIAL 32 + + + static void rf_ShutdownDAGs(void *); static void rf_ShutdownDAGs(void *ignored) @@ -188,6 +194,12 @@ rf_ConfigureDAGs(RF_ShutdownList_t **listp) "rf_dagh_pl", NULL); pool_sethiwat(&rf_dagh_pool, RF_MAX_FREE_DAGH); pool_prime(&rf_dagh_pool, RF_DAGH_INITIAL); + + pool_init(&rf_daglist_pool, sizeof(RF_DagList_t), 0, 0, 0, + "rf_daglist_pl", NULL); + pool_sethiwat(&rf_daglist_pool, RF_MAX_FREE_DAGLIST); + pool_prime(&rf_daglist_pool, RF_DAGLIST_INITIAL); + rc = rf_ShutdownCreate(listp, rf_ShutdownDAGs, NULL); if (rc) { rf_print_unable_to_add_shutdown(__FILE__, __LINE__, rc); @@ -214,6 +226,27 @@ rf_FreeDAGHeader(RF_DagHeader_t * dh) { pool_put(&rf_dagh_pool, dh); } + +RF_DagList_t * +rf_AllocDAGList() +{ + RF_DagList_t *dagList; + + dagList = pool_get(&rf_daglist_pool, PR_WAITOK); + memset(dagList, 0, sizeof(RF_DagList_t)); + + return (dagList); +} + +void +rf_FreeDAGList(RF_DagList_t *dagList) +{ + pool_put(&rf_daglist_pool, dagList); +} + + + + /* allocates a buffer big enough to hold the data described by pda */ void * rf_AllocBuffer(RF_Raid_t *raidPtr, RF_DagHeader_t *dag_h, diff --git a/sys/dev/raidframe/rf_dagutils.h b/sys/dev/raidframe/rf_dagutils.h index 62b7c6e5453..605918b71b2 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.7 2003/02/09 10:04:33 jdolecek Exp $ */ +/* $NetBSD: rf_dagutils.h,v 1.8 2004/02/27 02:55:17 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -68,6 +68,9 @@ RF_DagHeader_t *rf_AllocDAGHeader(void); void rf_FreeDAGHeader(RF_DagHeader_t * dh); +RF_DagList_t *rf_AllocDAGList(void); +void rf_FreeDAGList(RF_DagList_t *); + void *rf_AllocBuffer(RF_Raid_t * raidPtr, RF_DagHeader_t * dag_h, RF_PhysDiskAddr_t * pda, RF_AllocListElem_t * allocList); diff --git a/sys/dev/raidframe/rf_desc.h b/sys/dev/raidframe/rf_desc.h index e7021c5388b..9e9aa3cfd64 100644 --- a/sys/dev/raidframe/rf_desc.h +++ b/sys/dev/raidframe/rf_desc.h @@ -1,4 +1,4 @@ -/* $NetBSD: rf_desc.h,v 1.9 2004/01/01 19:27:35 oster Exp $ */ +/* $NetBSD: rf_desc.h,v 1.10 2004/02/27 02:55:17 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -77,7 +77,7 @@ struct RF_RaidAccessDesc_s { * RAID operation has gotten */ RF_AccessState_t *states; /* array of states to be run */ int status; /* pass/fail status of the last operation */ - RF_DagList_t *dagArray; /* array of dag lists, one list per stripe */ + RF_DagList_t *dagList; /* list of dag lists, one list per stripe */ RF_AccessStripeMapHeader_t *asmap; /* the asm for this I/O */ void *bp; /* buf pointer for this RAID acc. ignored * outside the kernel */ diff --git a/sys/dev/raidframe/rf_driver.c b/sys/dev/raidframe/rf_driver.c index acaf0118c80..3b3f730b8b7 100644 --- a/sys/dev/raidframe/rf_driver.c +++ b/sys/dev/raidframe/rf_driver.c @@ -1,4 +1,4 @@ -/* $NetBSD: rf_driver.c,v 1.84 2004/01/15 20:27:27 oster Exp $ */ +/* $NetBSD: rf_driver.c,v 1.85 2004/02/27 02:55:17 oster Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. * All rights reserved. @@ -73,7 +73,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.84 2004/01/15 20:27:27 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.85 2004/02/27 02:55:17 oster Exp $"); #include "opt_raid_diagnostic.h" @@ -209,7 +209,6 @@ rf_UnconfigureArray() int rf_Shutdown(RF_Raid_t *raidPtr) { - if (!raidPtr->valid) { RF_ERRORMSG("Attempt to shut down unconfigured RAIDframe driver. Aborting shutdown\n"); return (EINVAL); @@ -288,7 +287,7 @@ int rf_Configure(RF_Raid_t *raidPtr, RF_Config_t *cfgPtr, RF_AutoConfig_t *ac) { RF_RowCol_t col; - int rc; + int rc; RF_LOCK_LKMGR_MUTEX(configureMutex); configureCount++; @@ -503,9 +502,18 @@ void rf_FreeRaidAccDesc(RF_RaidAccessDesc_t *desc) { RF_Raid_t *raidPtr = desc->raidPtr; + RF_DagList_t *dagList, *temp; RF_ASSERT(desc); + /* Cleanup the dagList(s) */ + dagList = desc->dagList; + while(dagList != NULL) { + temp = dagList; + dagList = dagList->next; + rf_FreeDAGList(temp); + } + rf_FreeAllocList(desc->cleanupList); pool_put(&rf_rad_pool, desc); RF_LOCK_MUTEX(rf_rad_pool_lock); diff --git a/sys/dev/raidframe/rf_states.c b/sys/dev/raidframe/rf_states.c index 108711c57b4..01814a26e48 100644 --- a/sys/dev/raidframe/rf_states.c +++ b/sys/dev/raidframe/rf_states.c @@ -1,4 +1,4 @@ -/* $NetBSD: rf_states.c,v 1.25 2004/01/02 21:41:08 oster Exp $ */ +/* $NetBSD: rf_states.c,v 1.26 2004/02/27 02:55:18 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_states.c,v 1.25 2004/01/02 21:41:08 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_states.c,v 1.26 2004/02/27 02:55:18 oster Exp $"); #include <sys/errno.h> @@ -440,6 +440,7 @@ rf_State_CreateDAG(RF_RaidAccessDesc_t *desc) RF_AccTraceEntry_t *tracerec = &desc->tracerec; RF_Etimer_t timer; RF_DagHeader_t *dag_h; + RF_DagList_t *dagList; struct buf *bp; int i, selectStatus; @@ -449,9 +450,13 @@ rf_State_CreateDAG(RF_RaidAccessDesc_t *desc) /* SelectAlgorithm returns one or more dags */ selectStatus = rf_SelectAlgorithm(desc, desc->flags | RF_DAG_SUPPRESS_LOCKS); #if RF_DEBUG_VALIDATE_DAG - if (rf_printDAGsDebug) - for (i = 0; i < desc->numStripes; i++) - rf_PrintDAGList(desc->dagArray[i].dags); + if (rf_printDAGsDebug) { + dagList = desc->dagList; + for (i = 0; i < desc->numStripes; i++) { + rf_PrintDAGList(dagList.dags); + dagList = dagList->next; + } + } #endif /* RF_DEBUG_VALIDATE_DAG */ RF_ETIMER_STOP(timer); RF_ETIMER_EVAL(timer); @@ -476,13 +481,15 @@ rf_State_CreateDAG(RF_RaidAccessDesc_t *desc) bp->b_error = EIO; } else { /* bind dags to desc */ + dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { - dag_h = desc->dagArray[i].dags; + dag_h = dagList->dags; while (dag_h) { dag_h->bp = (struct buf *) desc->bp; dag_h->tracerec = tracerec; dag_h = dag_h->next; } + dagList = dagList->next; } desc->flags |= RF_DAG_DISPATCH_RETURNED; desc->state++; /* next state should be rf_State_ExecuteDAG */ @@ -492,7 +499,7 @@ rf_State_CreateDAG(RF_RaidAccessDesc_t *desc) -/* the access has an array of dagLists, one dagList per parity stripe. +/* the access has an list of dagLists, one dagList per parity stripe. * fire the first dag in each parity stripe (dagList). * dags within a stripe (dagList) must be executed sequentially * - this preserves atomic parity update @@ -503,7 +510,7 @@ rf_State_ExecuteDAG(RF_RaidAccessDesc_t *desc) { int i; RF_DagHeader_t *dag_h; - RF_DagList_t *dagArray = desc->dagArray; + RF_DagList_t *dagList; /* next state is always rf_State_ProcessDAG important to do * this before firing the first dag (it may finish before we @@ -512,16 +519,18 @@ rf_State_ExecuteDAG(RF_RaidAccessDesc_t *desc) /* sweep dag array, a stripe at a time, firing the first dag * in each stripe */ + dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { - RF_ASSERT(dagArray[i].numDags > 0); - RF_ASSERT(dagArray[i].numDagsDone == 0); - RF_ASSERT(dagArray[i].numDagsFired == 0); - RF_ETIMER_START(dagArray[i].tracerec.timer); + RF_ASSERT(dagList->numDags > 0); + RF_ASSERT(dagList->numDagsDone == 0); + RF_ASSERT(dagList->numDagsFired == 0); + RF_ETIMER_START(dagList->tracerec.timer); /* fire first dag in this stripe */ - dag_h = dagArray[i].dags; + dag_h = dagList->dags; RF_ASSERT(dag_h); - dagArray[i].numDagsFired++; - rf_DispatchDAG(dag_h, (void (*) (void *)) rf_ContinueDagAccess, &dagArray[i]); + dagList->numDagsFired++; + rf_DispatchDAG(dag_h, (void (*) (void *)) rf_ContinueDagAccess, dagList); + dagList = dagList->next; } /* the DAG will always call the callback, even if there was no @@ -542,21 +551,27 @@ rf_State_ProcessDAG(RF_RaidAccessDesc_t *desc) RF_Raid_t *raidPtr = desc->raidPtr; RF_DagHeader_t *dag_h; int i, j, done = RF_TRUE; - RF_DagList_t *dagArray = desc->dagArray; + RF_DagList_t *dagList, *temp; RF_Etimer_t timer; /* check to see if this is the last dag */ - for (i = 0; i < desc->numStripes; i++) - if (dagArray[i].numDags != dagArray[i].numDagsDone) + dagList = desc->dagList; + for (i = 0; i < desc->numStripes; i++) { + if (dagList->numDags != dagList->numDagsDone) done = RF_FALSE; + dagList = dagList->next; + } if (done) { if (desc->status) { /* a dag failed, retry */ RF_ETIMER_START(timer); /* free all dags */ + dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { - rf_FreeDAG(desc->dagArray[i].dags); + rf_FreeDAG(dagList->dags); + temp = dagList; + dagList = dagList->next; } rf_MarkFailuresInASMList(raidPtr, asmh); /* back up to rf_State_CreateDAG */ @@ -572,20 +587,22 @@ rf_State_ProcessDAG(RF_RaidAccessDesc_t *desc) /* see if any are ready to be fired. if so, fire them */ /* don't fire the initial dag in a list, it's fired in * rf_State_ExecuteDAG */ + dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { - if ((dagArray[i].numDagsDone < dagArray[i].numDags) - && (dagArray[i].numDagsDone == dagArray[i].numDagsFired) - && (dagArray[i].numDagsFired > 0)) { - RF_ETIMER_START(dagArray[i].tracerec.timer); + if ((dagList->numDagsDone < dagList->numDags) + && (dagList->numDagsDone == dagList->numDagsFired) + && (dagList->numDagsFired > 0)) { + RF_ETIMER_START(dagList->tracerec.timer); /* fire next dag in this stripe */ /* first, skip to next dag awaiting execution */ - dag_h = dagArray[i].dags; - for (j = 0; j < dagArray[i].numDagsDone; j++) + dag_h = dagList->dags; + for (j = 0; j < dagList->numDagsDone; j++) dag_h = dag_h->next; - dagArray[i].numDagsFired++; + dagList->numDagsFired++; rf_DispatchDAG(dag_h, (void (*) (void *)) rf_ContinueDagAccess, - &dagArray[i]); + dagList); } + dagList = dagList->next; } return RF_TRUE; } @@ -598,6 +615,7 @@ rf_State_Cleanup(RF_RaidAccessDesc_t *desc) RF_AccessStripeMapHeader_t *asmh = desc->asmap; RF_Raid_t *raidPtr = desc->raidPtr; RF_AccessStripeMap_t *asm_p; + RF_DagList_t *dagList; RF_Etimer_t timer; int i; @@ -613,8 +631,10 @@ rf_State_Cleanup(RF_RaidAccessDesc_t *desc) RF_ETIMER_START(timer); /* free all dags */ + dagList = desc->dagList; for (i = 0; i < desc->numStripes; i++) { - rf_FreeDAG(desc->dagArray[i].dags); + rf_FreeDAG(dagList->dags); + dagList = dagList->next; } RF_ETIMER_STOP(timer); RF_ETIMER_EVAL(timer); |
