Module Name: src Committed By: oster Date: Fri Jul 23 00:54:45 UTC 2021
Modified Files: src/sys/dev/raidframe: rf_alloclist.c rf_aselect.c rf_callback.c rf_callback.h rf_copyback.c rf_dagdegrd.c rf_dagdegwr.c rf_dagffrd.c rf_dagffwr.c rf_dagutils.c rf_dagutils.h rf_diskqueue.c rf_diskqueue.h rf_driver.c rf_evenodd.c rf_map.c rf_map.h rf_mcpair.c rf_mcpair.h rf_netbsd.h rf_netbsdkintf.c rf_paritylogDiskMgr.c rf_parityscan.c rf_psstatus.c rf_psstatus.h rf_raid.h rf_raid1.c rf_reconbuffer.c rf_reconstruct.c rf_reconstruct.h rf_reconutil.c rf_revent.c rf_revent.h rf_states.c rf_stripelocks.c rf_stripelocks.h Log Message: Extensive mechanical changes to the pools used in RAIDframe. Alloclist remains not per-RAID, so initialize that pool separately/differently than the rest. The remainder of pools in RF_Pools_s are now per-RAID pools. Mostly mechanical changes to functions to allocate/destroy per-RAID pools. Needed to make raidPtr available in certain cases to be able to find the per-RAID pools. Extend rf_pool_init() to now populate a per-RAID wchan value that is unique to each pool for a given RAID device. TODO: Complete the analysis of the minimum number of items that are required for each pool to allow IO to progress (i.e. so that a request for pool resources can always be satisfied), and dynamically scale minimum pool sizes based on RAID configuration. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/dev/raidframe/rf_alloclist.c \ src/sys/dev/raidframe/rf_revent.c cvs rdiff -u -r1.29 -r1.30 src/sys/dev/raidframe/rf_aselect.c \ src/sys/dev/raidframe/rf_reconstruct.h cvs rdiff -u -r1.24 -r1.25 src/sys/dev/raidframe/rf_callback.c \ src/sys/dev/raidframe/rf_mcpair.c cvs rdiff -u -r1.7 -r1.8 src/sys/dev/raidframe/rf_callback.h cvs rdiff -u -r1.53 -r1.54 src/sys/dev/raidframe/rf_copyback.c cvs rdiff -u -r1.31 -r1.32 src/sys/dev/raidframe/rf_dagdegrd.c cvs rdiff -u -r1.35 -r1.36 src/sys/dev/raidframe/rf_dagdegwr.c cvs rdiff -u -r1.21 -r1.22 src/sys/dev/raidframe/rf_dagffrd.c \ src/sys/dev/raidframe/rf_dagutils.h cvs rdiff -u -r1.36 -r1.37 src/sys/dev/raidframe/rf_dagffwr.c \ src/sys/dev/raidframe/rf_netbsd.h src/sys/dev/raidframe/rf_parityscan.c cvs rdiff -u -r1.57 -r1.58 src/sys/dev/raidframe/rf_dagutils.c cvs rdiff -u -r1.59 -r1.60 src/sys/dev/raidframe/rf_diskqueue.c cvs rdiff -u -r1.26 -r1.27 src/sys/dev/raidframe/rf_diskqueue.h \ src/sys/dev/raidframe/rf_reconbuffer.c cvs rdiff -u -r1.137 -r1.138 src/sys/dev/raidframe/rf_driver.c cvs rdiff -u -r1.22 -r1.23 src/sys/dev/raidframe/rf_evenodd.c cvs rdiff -u -r1.50 -r1.51 src/sys/dev/raidframe/rf_map.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/raidframe/rf_map.h cvs rdiff -u -r1.10 -r1.11 src/sys/dev/raidframe/rf_mcpair.h \ src/sys/dev/raidframe/rf_revent.h cvs rdiff -u -r1.394 -r1.395 src/sys/dev/raidframe/rf_netbsdkintf.c cvs rdiff -u -r1.30 -r1.31 src/sys/dev/raidframe/rf_paritylogDiskMgr.c cvs rdiff -u -r1.37 -r1.38 src/sys/dev/raidframe/rf_psstatus.c \ src/sys/dev/raidframe/rf_raid1.c src/sys/dev/raidframe/rf_reconutil.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/raidframe/rf_psstatus.h cvs rdiff -u -r1.48 -r1.49 src/sys/dev/raidframe/rf_raid.h cvs rdiff -u -r1.125 -r1.126 src/sys/dev/raidframe/rf_reconstruct.c cvs rdiff -u -r1.51 -r1.52 src/sys/dev/raidframe/rf_states.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/raidframe/rf_stripelocks.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/raidframe/rf_stripelocks.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/raidframe/rf_alloclist.c diff -u src/sys/dev/raidframe/rf_alloclist.c:1.28 src/sys/dev/raidframe/rf_alloclist.c:1.29 --- src/sys/dev/raidframe/rf_alloclist.c:1.28 Sun Feb 10 17:13:33 2019 +++ src/sys/dev/raidframe/rf_alloclist.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_alloclist.c,v 1.28 2019/02/10 17:13:33 christos Exp $ */ +/* $NetBSD: rf_alloclist.c,v 1.29 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -37,7 +37,7 @@ ***************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_alloclist.c,v 1.28 2019/02/10 17:13:33 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_alloclist.c,v 1.29 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -59,15 +59,17 @@ static void rf_ShutdownAllocList(void *) static void rf_ShutdownAllocList(void *ignored) { - pool_destroy(&rf_pools.alloclist); + pool_destroy(&rf_alloclist_pool); } int rf_ConfigureAllocList(RF_ShutdownList_t **listp) { - rf_pool_init(&rf_pools.alloclist, sizeof(RF_AllocListElem_t), - "rf_alloclist_pl", RF_AL_FREELIST_MIN, RF_AL_FREELIST_MAX); + pool_init(&rf_alloclist_pool, sizeof(RF_AllocListElem_t), 0, 0, 0, "rf_alloclist_pl", NULL, IPL_BIO); + pool_sethiwat(&rf_alloclist_pool, RF_AL_FREELIST_MAX); + pool_prime(&rf_alloclist_pool, RF_AL_FREELIST_MIN); + rf_ShutdownCreate(listp, rf_ShutdownAllocList, NULL); return (0); @@ -115,12 +117,12 @@ rf_FreeAllocList(RF_AllocListElem_t *l) while (l) { temp = l; l = l->next; - pool_put(&rf_pools.alloclist, temp); + pool_put(&rf_alloclist_pool, temp); } } RF_AllocListElem_t * rf_real_MakeAllocList(void) { - return pool_get(&rf_pools.alloclist, PR_WAITOK | PR_ZERO); + return pool_get(&rf_alloclist_pool, PR_WAITOK | PR_ZERO); } Index: src/sys/dev/raidframe/rf_revent.c diff -u src/sys/dev/raidframe/rf_revent.c:1.28 src/sys/dev/raidframe/rf_revent.c:1.29 --- src/sys/dev/raidframe/rf_revent.c:1.28 Mon May 2 01:07:24 2011 +++ src/sys/dev/raidframe/rf_revent.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_revent.c,v 1.28 2011/05/02 01:07:24 mrg Exp $ */ +/* $NetBSD: rf_revent.c,v 1.29 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_revent.c,v 1.28 2011/05/02 01:07:24 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_revent.c,v 1.29 2021/07/23 00:54:45 oster Exp $"); #include <sys/errno.h> @@ -51,20 +51,25 @@ __KERNEL_RCSID(0, "$NetBSD: rf_revent.c, static void rf_ShutdownReconEvent(void *); static RF_ReconEvent_t * -GetReconEventDesc(RF_RowCol_t col, void *arg, RF_Revent_t type); +GetReconEventDesc(RF_Raid_t *raidPtr, RF_RowCol_t col, void *arg, RF_Revent_t type); -static void rf_ShutdownReconEvent(void *ignored) +static void rf_ShutdownReconEvent(void *arg) { - pool_destroy(&rf_pools.revent); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.revent); } int -rf_ConfigureReconEvent(RF_ShutdownList_t **listp) +rf_ConfigureReconEvent(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.revent, sizeof(RF_ReconEvent_t), - "rf_revent_pl", RF_MIN_FREE_REVENT, RF_MAX_FREE_REVENT); - rf_ShutdownCreate(listp, rf_ShutdownReconEvent, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.revent, &raidPtr->pools.revent, sizeof(RF_ReconEvent_t), + "revent", RF_MIN_FREE_REVENT, RF_MAX_FREE_REVENT); + rf_ShutdownCreate(listp, rf_ShutdownReconEvent, raidPtr); return (0); } @@ -163,7 +168,7 @@ rf_CauseReconEvent(RF_Raid_t *raidPtr, R RF_Revent_t type) { RF_ReconCtrl_t *rctrl = raidPtr->reconControl; - RF_ReconEvent_t *event = GetReconEventDesc(col, arg, type); + RF_ReconEvent_t *event = GetReconEventDesc(raidPtr, col, arg, type); if (type == RF_REVENT_BUFCLEAR) { RF_ASSERT(col != rctrl->fcol); @@ -180,11 +185,11 @@ rf_CauseReconEvent(RF_Raid_t *raidPtr, R } /* allocates and initializes a recon event descriptor */ static RF_ReconEvent_t * -GetReconEventDesc(RF_RowCol_t col, void *arg, RF_Revent_t type) +GetReconEventDesc(RF_Raid_t *raidPtr, RF_RowCol_t col, void *arg, RF_Revent_t type) { RF_ReconEvent_t *t; - t = pool_get(&rf_pools.revent, PR_WAITOK); + t = pool_get(&raidPtr->pools.revent, PR_WAITOK); t->col = col; t->arg = arg; t->type = type; @@ -212,13 +217,13 @@ rf_DrainReconEventQueue(RF_RaidReconDesc event->next = NULL; rctrl->eq_count--; /* dump it */ - rf_FreeReconEventDesc(event); + rf_FreeReconEventDesc(reconDesc->raidPtr, event); } rf_unlock_mutex2(rctrl->eq_mutex); } void -rf_FreeReconEventDesc(RF_ReconEvent_t *event) +rf_FreeReconEventDesc(RF_Raid_t *raidPtr, RF_ReconEvent_t *event) { - pool_put(&rf_pools.revent, event); + pool_put(&raidPtr->pools.revent, event); } Index: src/sys/dev/raidframe/rf_aselect.c diff -u src/sys/dev/raidframe/rf_aselect.c:1.29 src/sys/dev/raidframe/rf_aselect.c:1.30 --- src/sys/dev/raidframe/rf_aselect.c:1.29 Wed Jan 4 15:50:34 2017 +++ src/sys/dev/raidframe/rf_aselect.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_aselect.c,v 1.29 2017/01/04 15:50:34 christos Exp $ */ +/* $NetBSD: rf_aselect.c,v 1.30 2021/07/23 00:54:45 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.29 2017/01/04 15:50:34 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_aselect.c,v 1.30 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -58,7 +58,7 @@ static void InitHdrNode(RF_DagHeader_t **hdr, RF_Raid_t *raidPtr, RF_RaidAccessDesc_t *desc) { /* create and initialize dag hdr */ - *hdr = rf_AllocDAGHeader(); + *hdr = rf_AllocDAGHeader(raidPtr); rf_MakeAllocList((*hdr)->allocList); (*hdr)->status = rf_enable; (*hdr)->numSuccedents = 0; @@ -149,7 +149,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * desc->numStripes = 0; for (i = 0, asm_p = asmap; asm_p; asm_p = asm_p->next, i++) { desc->numStripes++; - stripeFuncs = rf_AllocFuncList(); + stripeFuncs = rf_AllocFuncList(raidPtr); if (stripeFuncsEnd == NULL) { stripeFuncsList = stripeFuncs; @@ -166,7 +166,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * * unit in the stripe */ /* create a failed stripe structure to attempt to deal with the failure */ - failed_stripe = rf_AllocFailedStripeStruct(); + failed_stripe = rf_AllocFailedStripeStruct(raidPtr); if (failed_stripes_list == NULL) { failed_stripes_list = failed_stripe; failed_stripes_list_end = failed_stripe; @@ -189,7 +189,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * length = physPtr->numSector; buffer = physPtr->bufPtr; - asmhle = rf_AllocASMHeaderListElem(); + asmhle = rf_AllocASMHeaderListElem(raidPtr); if (failed_stripe->asmh_u == NULL) { failed_stripe->asmh_u = asmhle; /* we're the head... */ failed_stripes_asmh_u_end = asmhle; /* and the tail */ @@ -203,7 +203,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * asmhle->asmh = rf_MapAccess(raidPtr, address, length, buffer, RF_DONT_REMAP); asm_up = asmhle->asmh->stripeMap; - vfple = rf_AllocVFPListElem(); + vfple = rf_AllocVFPListElem(raidPtr); if (failed_stripe->vfple == NULL) { failed_stripe->vfple = vfple; failed_stripes_vfple_end = vfple; @@ -236,7 +236,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * length = 1; buffer = (char *)physPtr->bufPtr + (k * (1 << raidPtr->logBytesPerSector)); - asmhle = rf_AllocASMHeaderListElem(); + asmhle = rf_AllocASMHeaderListElem(raidPtr); if (failed_stripe->asmh_b == NULL) { failed_stripe->asmh_b = asmhle; failed_stripes_asmh_b_end = asmhle; @@ -248,7 +248,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * asmhle->asmh = rf_MapAccess(raidPtr, address, length, buffer, RF_DONT_REMAP); asm_bp = asmhle->asmh->stripeMap; - vfple = rf_AllocVFPListElem(); + vfple = rf_AllocVFPListElem(raidPtr); if (failed_stripe->bvfple == NULL) { failed_stripe->bvfple = vfple; failed_stripes_bvfple_end = vfple; @@ -286,37 +286,37 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * while (asmhle) { tmpasmhle= asmhle; asmhle = tmpasmhle->next; - rf_FreeAccessStripeMap(tmpasmhle->asmh); - rf_FreeASMHeaderListElem(tmpasmhle); + rf_FreeAccessStripeMap(raidPtr, tmpasmhle->asmh); + rf_FreeASMHeaderListElem(raidPtr, tmpasmhle); } asmhle = failed_stripe->asmh_b; while (asmhle) { tmpasmhle= asmhle; asmhle = tmpasmhle->next; - rf_FreeAccessStripeMap(tmpasmhle->asmh); - rf_FreeASMHeaderListElem(tmpasmhle); + rf_FreeAccessStripeMap(raidPtr, tmpasmhle->asmh); + rf_FreeASMHeaderListElem(raidPtr, tmpasmhle); } vfple = failed_stripe->vfple; while (vfple) { tmpvfple = vfple; vfple = tmpvfple->next; - rf_FreeVFPListElem(tmpvfple); + rf_FreeVFPListElem(raidPtr, tmpvfple); } vfple = failed_stripe->bvfple; while (vfple) { tmpvfple = vfple; vfple = tmpvfple->next; - rf_FreeVFPListElem(tmpvfple); + rf_FreeVFPListElem(raidPtr, tmpvfple); } stripeNum++; /* only move to the next failed stripe slot if the current one was used */ tmpfailed_stripe = failed_stripe; failed_stripe = failed_stripe->next; - rf_FreeFailedStripeStruct(tmpfailed_stripe); + rf_FreeFailedStripeStruct(raidPtr, tmpfailed_stripe); } stripeFuncs = stripeFuncs->next; } @@ -325,7 +325,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * while (stripeFuncsList != NULL) { temp = stripeFuncsList; stripeFuncsList = stripeFuncsList->next; - rf_FreeFuncList(temp); + rf_FreeFuncList(raidPtr, temp); } desc->numStripes = 0; return (1); @@ -344,7 +344,7 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * /* grab dag header for this stripe */ dag_h = NULL; - dagList = rf_AllocDAGList(); + dagList = rf_AllocDAGList(raidPtr); /* always tack the new dagList onto the end of the list... */ if (dagListend == NULL) { @@ -505,38 +505,38 @@ rf_SelectAlgorithm(RF_RaidAccessDesc_t * while (asmhle) { tmpasmhle= asmhle; asmhle = tmpasmhle->next; - rf_FreeASMHeaderListElem(tmpasmhle); + rf_FreeASMHeaderListElem(raidPtr, tmpasmhle); } asmhle = failed_stripe->asmh_b; while (asmhle) { tmpasmhle= asmhle; asmhle = tmpasmhle->next; - rf_FreeASMHeaderListElem(tmpasmhle); + rf_FreeASMHeaderListElem(raidPtr, tmpasmhle); } vfple = failed_stripe->vfple; while (vfple) { tmpvfple = vfple; vfple = tmpvfple->next; - rf_FreeVFPListElem(tmpvfple); + rf_FreeVFPListElem(raidPtr, tmpvfple); } vfple = failed_stripe->bvfple; while (vfple) { tmpvfple = vfple; vfple = tmpvfple->next; - rf_FreeVFPListElem(tmpvfple); + rf_FreeVFPListElem(raidPtr, tmpvfple); } tmpfailed_stripe = failed_stripe; failed_stripe = tmpfailed_stripe->next; - rf_FreeFailedStripeStruct(tmpfailed_stripe); + rf_FreeFailedStripeStruct(raidPtr, tmpfailed_stripe); } } while (stripeFuncsList != NULL) { temp = stripeFuncsList; stripeFuncsList = stripeFuncsList->next; - rf_FreeFuncList(temp); + rf_FreeFuncList(raidPtr, temp); } return (0); } Index: src/sys/dev/raidframe/rf_reconstruct.h diff -u src/sys/dev/raidframe/rf_reconstruct.h:1.29 src/sys/dev/raidframe/rf_reconstruct.h:1.30 --- src/sys/dev/raidframe/rf_reconstruct.h:1.29 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_reconstruct.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_reconstruct.h,v 1.29 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_reconstruct.h,v 1.30 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -175,7 +175,7 @@ struct RF_ReconCtrl_s { /* the default priority for reconstruction accesses */ #define RF_IO_RECON_PRIORITY RF_IO_LOW_PRIORITY -int rf_ConfigureReconstruction(RF_ShutdownList_t **); +int rf_ConfigureReconstruction(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); int rf_ReconstructFailedDisk(RF_Raid_t *, RF_RowCol_t); int rf_ReconstructFailedDiskBasic(RF_Raid_t *, RF_RowCol_t); int rf_ReconstructInPlace(RF_Raid_t *, RF_RowCol_t); Index: src/sys/dev/raidframe/rf_callback.c diff -u src/sys/dev/raidframe/rf_callback.c:1.24 src/sys/dev/raidframe/rf_callback.c:1.25 --- src/sys/dev/raidframe/rf_callback.c:1.24 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_callback.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_callback.c,v 1.24 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_callback.c,v 1.25 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_callback.c,v 1.24 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_callback.c,v 1.25 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> #include <sys/pool.h> @@ -46,51 +46,57 @@ __KERNEL_RCSID(0, "$NetBSD: rf_callback. #include "rf_general.h" #include "rf_shutdown.h" #include "rf_netbsd.h" +#include "rf_raid.h" #define RF_MAX_FREE_CALLBACK 64 #define RF_MIN_FREE_CALLBACK 32 static void rf_ShutdownCallback(void *); static void -rf_ShutdownCallback(void *ignored) +rf_ShutdownCallback(void *arg) { - pool_destroy(&rf_pools.callbackf); - pool_destroy(&rf_pools.callbackv); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.callbackf); + pool_destroy(&raidPtr->pools.callbackv); } int -rf_ConfigureCallback(RF_ShutdownList_t **listp) +rf_ConfigureCallback(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.callbackf, sizeof(RF_CallbackFuncDesc_t), - "rf_callbackfpl", RF_MIN_FREE_CALLBACK, RF_MAX_FREE_CALLBACK); - rf_pool_init(&rf_pools.callbackv, sizeof(RF_CallbackValueDesc_t), - "rf_callbackvpl", RF_MIN_FREE_CALLBACK, RF_MAX_FREE_CALLBACK); - rf_ShutdownCreate(listp, rf_ShutdownCallback, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.callbackf, &raidPtr->pools.callbackf, sizeof(RF_CallbackFuncDesc_t), + "callbackf", RF_MIN_FREE_CALLBACK, RF_MAX_FREE_CALLBACK); + rf_pool_init(raidPtr, raidPtr->poolNames.callbackv, &raidPtr->pools.callbackv, sizeof(RF_CallbackValueDesc_t), + "callbackv", RF_MIN_FREE_CALLBACK, RF_MAX_FREE_CALLBACK); + rf_ShutdownCreate(listp, rf_ShutdownCallback, raidPtr); return (0); } RF_CallbackFuncDesc_t * -rf_AllocCallbackFuncDesc(void) +rf_AllocCallbackFuncDesc(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.callbackf, PR_WAITOK); + return pool_get(&raidPtr->pools.callbackf, PR_WAITOK); } void -rf_FreeCallbackFuncDesc(RF_CallbackFuncDesc_t *p) +rf_FreeCallbackFuncDesc(RF_Raid_t *raidPtr, RF_CallbackFuncDesc_t *p) { - pool_put(&rf_pools.callbackf, p); + pool_put(&raidPtr->pools.callbackf, p); } RF_CallbackValueDesc_t * -rf_AllocCallbackValueDesc(void) +rf_AllocCallbackValueDesc(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.callbackv, PR_WAITOK); + return pool_get(&raidPtr->pools.callbackv, PR_WAITOK); } void -rf_FreeCallbackValueDesc(RF_CallbackValueDesc_t *p) +rf_FreeCallbackValueDesc(RF_Raid_t *raidPtr, RF_CallbackValueDesc_t *p) { - pool_put(&rf_pools.callbackv, p); + pool_put(&raidPtr->pools.callbackv, p); } Index: src/sys/dev/raidframe/rf_mcpair.c diff -u src/sys/dev/raidframe/rf_mcpair.c:1.24 src/sys/dev/raidframe/rf_mcpair.c:1.25 --- src/sys/dev/raidframe/rf_mcpair.c:1.24 Sun May 1 01:09:05 2011 +++ src/sys/dev/raidframe/rf_mcpair.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_mcpair.c,v 1.24 2011/05/01 01:09:05 mrg Exp $ */ +/* $NetBSD: rf_mcpair.c,v 1.25 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_mcpair.c,v 1.24 2011/05/01 01:09:05 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_mcpair.c,v 1.25 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: rf_mcpair.c, #include "rf_general.h" #include "rf_shutdown.h" #include "rf_netbsd.h" +#include "rf_raid.h" #include <sys/pool.h> #include <sys/proc.h> @@ -53,28 +54,33 @@ __KERNEL_RCSID(0, "$NetBSD: rf_mcpair.c, static void rf_ShutdownMCPair(void *); static void -rf_ShutdownMCPair(void *ignored) +rf_ShutdownMCPair(void *arg) { - pool_destroy(&rf_pools.mcpair); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.mcpair); } int -rf_ConfigureMCPair(RF_ShutdownList_t **listp) +rf_ConfigureMCPair(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.mcpair, sizeof(RF_MCPair_t), - "rf_mcpair_pl", RF_MIN_FREE_MCPAIR, RF_MAX_FREE_MCPAIR); - rf_ShutdownCreate(listp, rf_ShutdownMCPair, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.mcpair, &raidPtr->pools.mcpair, sizeof(RF_MCPair_t), + "mcpair", RF_MIN_FREE_MCPAIR, RF_MAX_FREE_MCPAIR); + rf_ShutdownCreate(listp, rf_ShutdownMCPair, raidPtr); return (0); } RF_MCPair_t * -rf_AllocMCPair(void) +rf_AllocMCPair(RF_Raid_t *raidPtr) { RF_MCPair_t *t; - t = pool_get(&rf_pools.mcpair, PR_WAITOK); + t = pool_get(&raidPtr->pools.mcpair, PR_WAITOK); rf_init_mutex2(t->mutex, IPL_VM); rf_init_cond2(t->cond, "mcpair"); t->flag = 0; @@ -83,11 +89,11 @@ rf_AllocMCPair(void) } void -rf_FreeMCPair(RF_MCPair_t *t) +rf_FreeMCPair(RF_Raid_t *raidPtr, RF_MCPair_t *t) { rf_destroy_cond2(t->cond); rf_destroy_mutex2(t->mutex); - pool_put(&rf_pools.mcpair, t); + pool_put(&raidPtr->pools.mcpair, t); } /* the callback function used to wake you up when you use an mcpair to Index: src/sys/dev/raidframe/rf_callback.h diff -u src/sys/dev/raidframe/rf_callback.h:1.7 src/sys/dev/raidframe/rf_callback.h:1.8 --- src/sys/dev/raidframe/rf_callback.h:1.7 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_callback.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_callback.h,v 1.7 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_callback.h,v 1.8 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -59,10 +59,11 @@ struct RF_CallbackValueDesc_s { RF_CallbackValueDesc_t *next;/* next entry in list */ }; -int rf_ConfigureCallback(RF_ShutdownList_t ** listp); -RF_CallbackFuncDesc_t *rf_AllocCallbackFuncDesc(void); -void rf_FreeCallbackFuncDesc(RF_CallbackFuncDesc_t * p); -RF_CallbackValueDesc_t *rf_AllocCallbackValueDesc(void); -void rf_FreeCallbackValueDesc(RF_CallbackValueDesc_t * p); +int rf_ConfigureCallback(RF_ShutdownList_t ** listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr); +RF_CallbackFuncDesc_t *rf_AllocCallbackFuncDesc(RF_Raid_t *raidPtr); +void rf_FreeCallbackFuncDesc(RF_Raid_t *raidPtr, RF_CallbackFuncDesc_t * p); +RF_CallbackValueDesc_t *rf_AllocCallbackValueDesc(RF_Raid_t *raidPtr); +void rf_FreeCallbackValueDesc(RF_Raid_t *raidPtr, RF_CallbackValueDesc_t * p); #endif /* !_RF__RF_CALLBACK_H_ */ Index: src/sys/dev/raidframe/rf_copyback.c diff -u src/sys/dev/raidframe/rf_copyback.c:1.53 src/sys/dev/raidframe/rf_copyback.c:1.54 --- src/sys/dev/raidframe/rf_copyback.c:1.53 Sun Dec 8 12:14:40 2019 +++ src/sys/dev/raidframe/rf_copyback.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_copyback.c,v 1.53 2019/12/08 12:14:40 mlelstv Exp $ */ +/* $NetBSD: rf_copyback.c,v 1.54 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -38,7 +38,7 @@ ****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.53 2019/12/08 12:14:40 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.54 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -198,7 +198,7 @@ rf_CopybackReconstructedData(RF_Raid_t * desc->sectPerSU = raidPtr->Layout.sectorsPerStripeUnit; desc->sectPerStripe = raidPtr->Layout.sectorsPerStripeUnit * raidPtr->Layout.numDataCol; desc->databuf = databuf; - desc->mcpair = rf_AllocMCPair(); + desc->mcpair = rf_AllocMCPair(raidPtr); /* quiesce the array, since we don't want to code support for user * accs here */ @@ -422,7 +422,7 @@ rf_CopybackComplete(RF_CopybackDesc_t *d raidPtr->raidid, status); RF_Free(desc->databuf, rf_RaidAddressToByte(raidPtr, desc->sectPerSU)); - rf_FreeMCPair(desc->mcpair); + rf_FreeMCPair(raidPtr, desc->mcpair); RF_Free(desc, sizeof(*desc)); rf_copyback_in_progress = 0; Index: src/sys/dev/raidframe/rf_dagdegrd.c diff -u src/sys/dev/raidframe/rf_dagdegrd.c:1.31 src/sys/dev/raidframe/rf_dagdegrd.c:1.32 --- src/sys/dev/raidframe/rf_dagdegrd.c:1.31 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagdegrd.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagdegrd.c,v 1.31 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagdegrd.c,v 1.32 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_dagdegrd.c,v 1.31 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagdegrd.c,v 1.32 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -141,19 +141,19 @@ rf_CreateRaidOneDegradedReadDAG(RF_Raid_ /* total number of nodes = 1 + (block + commit + terminator) */ - rdNode = rf_AllocDAGNode(); + rdNode = rf_AllocDAGNode(raidPtr); rdNode->list_next = dag_h->nodes; dag_h->nodes = rdNode; - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; @@ -315,35 +315,35 @@ rf_CreateDegradedReadDAG(RF_Raid_t *raid nRrdNodes = ((new_asm_h[0]) ? new_asm_h[0]->stripeMap->numStripeUnitsAccessed : 0) + ((new_asm_h[1]) ? new_asm_h[1]->stripeMap->numStripeUnitsAccessed : 0); - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - xorNode = rf_AllocDAGNode(); + xorNode = rf_AllocDAGNode(raidPtr); xorNode->list_next = dag_h->nodes; dag_h->nodes = xorNode; - rpNode = rf_AllocDAGNode(); + rpNode = rf_AllocDAGNode(raidPtr); rpNode->list_next = dag_h->nodes; dag_h->nodes = rpNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; for (i = 0; i < nRudNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } rudNodes = dag_h->nodes; for (i = 0; i < nRrdNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } @@ -420,7 +420,7 @@ rf_CreateDegradedReadDAG(RF_Raid_t *raid } } /* make a PDA for the parity unit */ - parityPDA = rf_AllocPhysDiskAddr(); + parityPDA = rf_AllocPhysDiskAddr(raidPtr); parityPDA->next = dag_h->pda_cleanup_list; dag_h->pda_cleanup_list = parityPDA; parityPDA->col = asmap->parityInfo->col; @@ -453,7 +453,7 @@ rf_CreateDegradedReadDAG(RF_Raid_t *raid /* any Rud nodes that overlap the failed access need to be * xored in */ if (overlappingPDAs[i]) { - pda = rf_AllocPhysDiskAddr(); + pda = rf_AllocPhysDiskAddr(raidPtr); memcpy((char *) pda, (char *) tmprudNode->params[0].p, sizeof(RF_PhysDiskAddr_t)); /* add it into the pda_cleanup_list *after* the copy, TYVM */ pda->next = dag_h->pda_cleanup_list; Index: src/sys/dev/raidframe/rf_dagdegwr.c diff -u src/sys/dev/raidframe/rf_dagdegwr.c:1.35 src/sys/dev/raidframe/rf_dagdegwr.c:1.36 --- src/sys/dev/raidframe/rf_dagdegwr.c:1.35 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagdegwr.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagdegwr.c,v 1.35 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagdegwr.c,v 1.36 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_dagdegwr.c,v 1.35 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagdegwr.c,v 1.36 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -232,39 +232,39 @@ rf_CommonCreateSimpleDegradedWriteDAG(RF rdnodesFaked = 0; } - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - unblockNode = rf_AllocDAGNode(); + unblockNode = rf_AllocDAGNode(raidPtr); unblockNode->list_next = dag_h->nodes; dag_h->nodes = unblockNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; - xorNode = rf_AllocDAGNode(); + xorNode = rf_AllocDAGNode(raidPtr); xorNode->list_next = dag_h->nodes; dag_h->nodes = xorNode; - wnpNode = rf_AllocDAGNode(); + wnpNode = rf_AllocDAGNode(raidPtr); wnpNode->list_next = dag_h->nodes; dag_h->nodes = wnpNode; for (i = 0; i < nWndNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } wndNodes = dag_h->nodes; for (i = 0; i < nRrdNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } @@ -272,7 +272,7 @@ rf_CommonCreateSimpleDegradedWriteDAG(RF #if (RF_INCLUDE_DECL_PQ > 0) || (RF_INCLUDE_RAID6 > 0) if (nfaults == 2) { - wnqNode = rf_AllocDAGNode(); + wnqNode = rf_AllocDAGNode(raidPtr); wnqNode->list_next = dag_h->nodes; dag_h->nodes = wnqNode; } else { @@ -359,7 +359,7 @@ rf_CommonCreateSimpleDegradedWriteDAG(RF * asmap->parityInfo describes the failed unit and the copy can also * be avoided. */ - parityPDA = rf_AllocPhysDiskAddr(); + parityPDA = rf_AllocPhysDiskAddr(raidPtr); parityPDA->next = dag_h->pda_cleanup_list; dag_h->pda_cleanup_list = parityPDA; parityPDA->col = asmap->parityInfo->col; @@ -436,7 +436,7 @@ rf_CommonCreateSimpleDegradedWriteDAG(RF /* any Wnd nodes that overlap the failed access need to be * xored in */ if (overlappingPDAs[i]) { - pda = rf_AllocPhysDiskAddr(); + pda = rf_AllocPhysDiskAddr(raidPtr); memcpy((char *) pda, (char *) tmpwndNode->params[0].p, sizeof(RF_PhysDiskAddr_t)); /* add it into the pda_cleanup_list *after* the copy, TYVM */ pda->next = dag_h->pda_cleanup_list; Index: src/sys/dev/raidframe/rf_dagffrd.c diff -u src/sys/dev/raidframe/rf_dagffrd.c:1.21 src/sys/dev/raidframe/rf_dagffrd.c:1.22 --- src/sys/dev/raidframe/rf_dagffrd.c:1.21 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagffrd.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagffrd.c,v 1.21 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagffrd.c,v 1.22 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_dagffrd.c,v 1.21 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagffrd.c,v 1.22 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -185,21 +185,21 @@ rf_CreateNonredundantDAG(RF_Raid_t *raid RF_ASSERT(n > 0); for (i = 0; i < n; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } diskNodes = dag_h->nodes; - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; @@ -356,21 +356,21 @@ CreateMirrorReadDAG(RF_Raid_t *raidPtr, RF_ASSERT(n > 0); for (i = 0; i < n; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } readNodes = dag_h->nodes; - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; Index: src/sys/dev/raidframe/rf_dagutils.h diff -u src/sys/dev/raidframe/rf_dagutils.h:1.21 src/sys/dev/raidframe/rf_dagutils.h:1.22 --- src/sys/dev/raidframe/rf_dagutils.h:1.21 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagutils.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagutils.h,v 1.21 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagutils.h,v 1.22 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -64,22 +64,22 @@ void rf_InitNode(RF_DagNode_t *, RF_Node const char *, RF_AllocListElem_t *); void rf_FreeDAG(RF_DagHeader_t *); -int rf_ConfigureDAGs(RF_ShutdownList_t **); +int rf_ConfigureDAGs(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); -RF_DagHeader_t *rf_AllocDAGHeader(void); -void rf_FreeDAGHeader(RF_DagHeader_t * dh); +RF_DagHeader_t *rf_AllocDAGHeader(RF_Raid_t *); +void rf_FreeDAGHeader(RF_Raid_t *raidPtr, RF_DagHeader_t * dh); -RF_DagNode_t *rf_AllocDAGNode(void); -void rf_FreeDAGNode(RF_DagNode_t *); +RF_DagNode_t *rf_AllocDAGNode(RF_Raid_t *); +void rf_FreeDAGNode(RF_Raid_t *, RF_DagNode_t *); -RF_DagList_t *rf_AllocDAGList(void); -void rf_FreeDAGList(RF_DagList_t *); +RF_DagList_t *rf_AllocDAGList(RF_Raid_t *); +void rf_FreeDAGList(RF_Raid_t *, RF_DagList_t *); -void *rf_AllocDAGPCache(void); -void rf_FreeDAGPCache(void *); +void *rf_AllocDAGPCache(RF_Raid_t *); +void rf_FreeDAGPCache(RF_Raid_t *, void *); -RF_FuncList_t *rf_AllocFuncList(void); -void rf_FreeFuncList(RF_FuncList_t *); +RF_FuncList_t *rf_AllocFuncList(RF_Raid_t *); +void rf_FreeFuncList(RF_Raid_t *, RF_FuncList_t *); void *rf_AllocBuffer(RF_Raid_t *, RF_DagHeader_t *, int); void *rf_AllocIOBuffer(RF_Raid_t *, int); Index: src/sys/dev/raidframe/rf_dagffwr.c diff -u src/sys/dev/raidframe/rf_dagffwr.c:1.36 src/sys/dev/raidframe/rf_dagffwr.c:1.37 --- src/sys/dev/raidframe/rf_dagffwr.c:1.36 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagffwr.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagffwr.c,v 1.36 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagffwr.c,v 1.37 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_dagffwr.c,v 1.36 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagffwr.c,v 1.37 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -201,29 +201,29 @@ rf_CommonCreateLargeWriteDAG(RF_Raid_t * nWndNodes = asmap->numStripeUnitsAccessed; for (i = 0; i < nWndNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } wndNodes = dag_h->nodes; - xorNode = rf_AllocDAGNode(); + xorNode = rf_AllocDAGNode(raidPtr); xorNode->list_next = dag_h->nodes; dag_h->nodes = xorNode; - wnpNode = rf_AllocDAGNode(); + wnpNode = rf_AllocDAGNode(raidPtr); wnpNode->list_next = dag_h->nodes; dag_h->nodes = wnpNode; - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; @@ -239,7 +239,7 @@ rf_CommonCreateLargeWriteDAG(RF_Raid_t * &eosBuffer, allocList); if (nRodNodes > 0) { for (i = 0; i < nRodNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } @@ -591,71 +591,71 @@ rf_CommonCreateSmallWriteDAG(RF_Raid_t * * Step 2. create the nodes */ - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; for (i = 0; i < numDataNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } readDataNodes = dag_h->nodes; for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } readParityNodes = dag_h->nodes; for (i = 0; i < numDataNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } writeDataNodes = dag_h->nodes; for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } writeParityNodes = dag_h->nodes; for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } xorNodes = dag_h->nodes; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; #if (RF_INCLUDE_DECL_PQ > 0) || (RF_INCLUDE_RAID6 > 0) if (nfaults == 2) { for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } readQNodes = dag_h->nodes; for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } writeQNodes = dag_h->nodes; for (i = 0; i < numParityNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } @@ -1230,28 +1230,28 @@ rf_CreateRaidOneWriteDAG(RF_Raid_t *raid /* total number of nodes = nWndNodes + nWmirNodes + (commit + unblock * + terminator) */ for (i = 0; i < nWndNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } wndNode = dag_h->nodes; for (i = 0; i < nWmirNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } wmirNode = dag_h->nodes; - commitNode = rf_AllocDAGNode(); + commitNode = rf_AllocDAGNode(raidPtr); commitNode->list_next = dag_h->nodes; dag_h->nodes = commitNode; - unblockNode = rf_AllocDAGNode(); + unblockNode = rf_AllocDAGNode(raidPtr); unblockNode->list_next = dag_h->nodes; dag_h->nodes = unblockNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; Index: src/sys/dev/raidframe/rf_netbsd.h diff -u src/sys/dev/raidframe/rf_netbsd.h:1.36 src/sys/dev/raidframe/rf_netbsd.h:1.37 --- src/sys/dev/raidframe/rf_netbsd.h:1.36 Fri Jul 23 00:26:19 2021 +++ src/sys/dev/raidframe/rf_netbsd.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_netbsd.h,v 1.36 2021/07/23 00:26:19 oster Exp $ */ +/* $NetBSD: rf_netbsd.h,v 1.37 2021/07/23 00:54:45 oster Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -54,10 +54,9 @@ struct raidcinfo { /* a little structure to serve as a container for all the various - global pools used in RAIDframe */ + per-device pools used in RAIDframe */ struct RF_Pools_s { - struct pool alloclist; /* AllocList */ struct pool asm_hdr; /* Access Stripe Map Header */ struct pool asmap; /* Access Stripe Map */ struct pool asmhle; /* Access Stripe Map Header List Elements */ @@ -83,8 +82,35 @@ struct RF_Pools_s { struct pool vple; /* VoidPointer List Elements */ }; -extern struct RF_Pools_s rf_pools; -void rf_pool_init(struct pool *, size_t, const char *, size_t, size_t); +#define RF_MAX_POOLNAMELEN 30 +struct RF_PoolNames_s { + char asm_hdr[RF_MAX_POOLNAMELEN]; /* Access Stripe Map Header */ + char asmap[RF_MAX_POOLNAMELEN]; /* Access Stripe Map */ + char asmhle[RF_MAX_POOLNAMELEN]; /* Access Stripe Map Header List Elements */ + char bufio[RF_MAX_POOLNAMELEN]; /* Buffer IO Pool */ + char callbackf[RF_MAX_POOLNAMELEN]; /* Callback function descriptors */ + char callbackv[RF_MAX_POOLNAMELEN]; /* Callback value descriptors */ + char dagh[RF_MAX_POOLNAMELEN]; /* DAG headers */ + char dagnode[RF_MAX_POOLNAMELEN]; /* DAG nodes */ + char daglist[RF_MAX_POOLNAMELEN]; /* DAG lists */ + char dagpcache[RF_MAX_POOLNAMELEN]; /* DAG pointer/param cache */ + char dqd[RF_MAX_POOLNAMELEN]; /* Disk Queue Data */ + char fss[RF_MAX_POOLNAMELEN]; /* Failed Stripe Structures */ + char funclist[RF_MAX_POOLNAMELEN]; /* Function Lists */ + char mcpair[RF_MAX_POOLNAMELEN]; /* Mutex/Cond Pairs */ + char pda[RF_MAX_POOLNAMELEN]; /* Physical Disk Access structures */ + char pss[RF_MAX_POOLNAMELEN]; /* Parity Stripe Status */ + char pss_issued[RF_MAX_POOLNAMELEN]; /* Parity Stripe Status Issued */ + char rad[RF_MAX_POOLNAMELEN]; /* Raid Access Descriptors */ + char reconbuffer[RF_MAX_POOLNAMELEN]; /* reconstruction buffer (header) pool */ + char revent[RF_MAX_POOLNAMELEN]; /* reconstruct events */ + char stripelock[RF_MAX_POOLNAMELEN]; /* StripeLock */ + char vfple[RF_MAX_POOLNAMELEN]; /* VoidFunctionPtr List Elements */ + char vple[RF_MAX_POOLNAMELEN]; /* VoidPointer List Elements */ +}; + +extern struct pool rf_alloclist_pool; /* AllocList */ +void rf_pool_init(RF_Raid_t *, char *, struct pool *, size_t, const char *, size_t, size_t); int rf_buf_queue_check(RF_Raid_t *); /* XXX probably belongs in a different .h file. */ Index: src/sys/dev/raidframe/rf_parityscan.c diff -u src/sys/dev/raidframe/rf_parityscan.c:1.36 src/sys/dev/raidframe/rf_parityscan.c:1.37 --- src/sys/dev/raidframe/rf_parityscan.c:1.36 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_parityscan.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_parityscan.c,v 1.36 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_parityscan.c,v 1.37 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ ****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_parityscan.c,v 1.36 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_parityscan.c,v 1.37 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -136,7 +136,7 @@ rf_RewriteParityRange(RF_Raid_t *raidPtr printf("Bad rc=%d from VerifyParity in RewriteParity\n", rc); ret_val = 1; } - rf_FreeAccessStripeMap(asm_h); + rf_FreeAccessStripeMap(raidPtr, asm_h); } return (ret_val); } @@ -218,7 +218,7 @@ rf_VerifyParityBasic(RF_Raid_t *raidPtr, retcode = RF_PARITY_OKAY; - mcpair = rf_AllocMCPair(); + mcpair = rf_AllocMCPair(raidPtr); rf_MakeAllocList(alloclist); bf = RF_MallocAndAdd(numbytes * (layoutPtr->numDataCol + layoutPtr->numParityCol), alloclist); @@ -329,10 +329,10 @@ rf_VerifyParityBasic(RF_Raid_t *raidPtr, retcode = RF_PARITY_CORRECTED; } out: - rf_FreeAccessStripeMap(asm_h); + rf_FreeAccessStripeMap(raidPtr, asm_h); rf_FreeAllocList(alloclist); rf_FreeDAG(rd_dag_h); - rf_FreeMCPair(mcpair); + rf_FreeMCPair(raidPtr, mcpair); return (retcode); } @@ -428,7 +428,7 @@ rf_MakeSimpleDAG(RF_Raid_t *raidPtr, int /* grab a DAG header... */ - dag_h = rf_AllocDAGHeader(); + dag_h = rf_AllocDAGHeader(raidPtr); dag_h->raidPtr = (void *) raidPtr; dag_h->allocList = NULL;/* we won't use this alloc list */ dag_h->status = rf_enable; @@ -444,21 +444,21 @@ rf_MakeSimpleDAG(RF_Raid_t *raidPtr, int * node */ for (i = 0; i < nNodes; i++) { - tmpNode = rf_AllocDAGNode(); + tmpNode = rf_AllocDAGNode(raidPtr); tmpNode->list_next = dag_h->nodes; dag_h->nodes = tmpNode; } nodes = dag_h->nodes; - blockNode = rf_AllocDAGNode(); + blockNode = rf_AllocDAGNode(raidPtr); blockNode->list_next = dag_h->nodes; dag_h->nodes = blockNode; - unblockNode = rf_AllocDAGNode(); + unblockNode = rf_AllocDAGNode(raidPtr); unblockNode->list_next = dag_h->nodes; dag_h->nodes = unblockNode; - termNode = rf_AllocDAGNode(); + termNode = rf_AllocDAGNode(raidPtr); termNode->list_next = dag_h->nodes; dag_h->nodes = termNode; Index: src/sys/dev/raidframe/rf_dagutils.c diff -u src/sys/dev/raidframe/rf_dagutils.c:1.57 src/sys/dev/raidframe/rf_dagutils.c:1.58 --- src/sys/dev/raidframe/rf_dagutils.c:1.57 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_dagutils.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_dagutils.c,v 1.57 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_dagutils.c,v 1.58 2021/07/23 00:54:45 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.57 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_dagutils.c,v 1.58 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -99,7 +99,8 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeS { void **ptrs; int nptrs; - + RF_Raid_t *raidPtr; + if (nAnte > RF_MAX_ANTECEDENTS) RF_PANIC(); node->status = initstatus; @@ -122,6 +123,9 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeS node->big_dag_params = NULL; node->visited = 0; + RF_ASSERT(hdr != NULL); + raidPtr = hdr->raidPtr; + /* allocate all the pointers with one call to malloc */ nptrs = nSucc + nAnte + nResult + nSucc; @@ -139,7 +143,7 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeS */ ptrs = (void **) node->dag_ptrs; } else if (nptrs <= (RF_DAGPCACHE_SIZE / sizeof(RF_DagNode_t *))) { - node->big_dag_ptrs = rf_AllocDAGPCache(); + node->big_dag_ptrs = rf_AllocDAGPCache(raidPtr); ptrs = (void **) node->big_dag_ptrs; } else { ptrs = RF_MallocAndAdd(nptrs * sizeof(*ptrs), alist); @@ -153,7 +157,7 @@ rf_InitNode(RF_DagNode_t *node, RF_NodeS 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->big_dag_params = rf_AllocDAGPCache(raidPtr); node->params = node->big_dag_params; } else { node->params = RF_MallocAndAdd( @@ -179,26 +183,30 @@ rf_FreeDAG(RF_DagHeader_t *dag_h) RF_PhysDiskAddr_t *pda; RF_DagNode_t *tmpnode; RF_DagHeader_t *nextDag; + RF_Raid_t *raidPtr; + if (dag_h) + raidPtr = dag_h->raidPtr; + while (dag_h) { nextDag = dag_h->next; rf_FreeAllocList(dag_h->allocList); for (asmap = dag_h->asmList; asmap;) { t_asmap = asmap; asmap = asmap->next; - rf_FreeAccessStripeMap(t_asmap); + rf_FreeAccessStripeMap(raidPtr, t_asmap); } while (dag_h->pda_cleanup_list) { pda = dag_h->pda_cleanup_list; dag_h->pda_cleanup_list = dag_h->pda_cleanup_list->next; - rf_FreePhysDiskAddr(pda); + rf_FreePhysDiskAddr(raidPtr, pda); } while (dag_h->nodes) { tmpnode = dag_h->nodes; dag_h->nodes = dag_h->nodes->list_next; - rf_FreeDAGNode(tmpnode); + rf_FreeDAGNode(raidPtr, tmpnode); } - rf_FreeDAGHeader(dag_h); + rf_FreeDAGHeader(raidPtr, dag_h); dag_h = nextDag; } } @@ -223,98 +231,103 @@ rf_FreeDAG(RF_DagHeader_t *dag_h) static void rf_ShutdownDAGs(void *); static void -rf_ShutdownDAGs(void *ignored) +rf_ShutdownDAGs(void *arg) { - 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); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.dagh); + pool_destroy(&raidPtr->pools.dagnode); + pool_destroy(&raidPtr->pools.daglist); + pool_destroy(&raidPtr->pools.dagpcache); + pool_destroy(&raidPtr->pools.funclist); } int -rf_ConfigureDAGs(RF_ShutdownList_t **listp) +rf_ConfigureDAGs(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.dagnode, sizeof(RF_DagNode_t), - "rf_dagnode_pl", RF_MIN_FREE_DAGNODE, RF_MAX_FREE_DAGNODE); - rf_pool_init(&rf_pools.dagh, sizeof(RF_DagHeader_t), - "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); + rf_pool_init(raidPtr, raidPtr->poolNames.dagnode, &raidPtr->pools.dagnode, sizeof(RF_DagNode_t), + "dagnode", RF_MIN_FREE_DAGNODE, RF_MAX_FREE_DAGNODE); + rf_pool_init(raidPtr, raidPtr->poolNames.dagh, &raidPtr->pools.dagh, sizeof(RF_DagHeader_t), + "dagh", RF_MIN_FREE_DAGH, RF_MAX_FREE_DAGH); + rf_pool_init(raidPtr, raidPtr->poolNames.daglist, &raidPtr->pools.daglist, sizeof(RF_DagList_t), + "daglist", RF_MIN_FREE_DAGLIST, RF_MAX_FREE_DAGLIST); + rf_pool_init(raidPtr, raidPtr->poolNames.dagpcache, &raidPtr->pools.dagpcache, RF_DAGPCACHE_SIZE, + "dagpcache", RF_MIN_FREE_DAGPCACHE, RF_MAX_FREE_DAGPCACHE); + rf_pool_init(raidPtr, raidPtr->poolNames.funclist, &raidPtr->pools.funclist, sizeof(RF_FuncList_t), + "funclist", RF_MIN_FREE_FUNCLIST, RF_MAX_FREE_FUNCLIST); + rf_ShutdownCreate(listp, rf_ShutdownDAGs, raidPtr); return (0); } RF_DagHeader_t * -rf_AllocDAGHeader(void) +rf_AllocDAGHeader(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.dagh, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.dagh, PR_WAITOK | PR_ZERO); } void -rf_FreeDAGHeader(RF_DagHeader_t * dh) +rf_FreeDAGHeader(RF_Raid_t *raidPtr, RF_DagHeader_t * dh) { - pool_put(&rf_pools.dagh, dh); + pool_put(&raidPtr->pools.dagh, dh); } RF_DagNode_t * -rf_AllocDAGNode(void) +rf_AllocDAGNode(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.dagnode, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.dagnode, PR_WAITOK | PR_ZERO); } void -rf_FreeDAGNode(RF_DagNode_t *node) +rf_FreeDAGNode(RF_Raid_t *raidPtr, RF_DagNode_t *node) { if (node->big_dag_ptrs) { - rf_FreeDAGPCache(node->big_dag_ptrs); + rf_FreeDAGPCache(raidPtr, node->big_dag_ptrs); } if (node->big_dag_params) { - rf_FreeDAGPCache(node->big_dag_params); + rf_FreeDAGPCache(raidPtr, node->big_dag_params); } - pool_put(&rf_pools.dagnode, node); + pool_put(&raidPtr->pools.dagnode, node); } RF_DagList_t * -rf_AllocDAGList(void) +rf_AllocDAGList(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.daglist, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.daglist, PR_WAITOK | PR_ZERO); } void -rf_FreeDAGList(RF_DagList_t *dagList) +rf_FreeDAGList(RF_Raid_t *raidPtr, RF_DagList_t *dagList) { - pool_put(&rf_pools.daglist, dagList); + pool_put(&raidPtr->pools.daglist, dagList); } void * -rf_AllocDAGPCache(void) +rf_AllocDAGPCache(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.dagpcache, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.dagpcache, PR_WAITOK | PR_ZERO); } void -rf_FreeDAGPCache(void *p) +rf_FreeDAGPCache(RF_Raid_t *raidPtr, void *p) { - pool_put(&rf_pools.dagpcache, p); + pool_put(&raidPtr->pools.dagpcache, p); } RF_FuncList_t * -rf_AllocFuncList(void) +rf_AllocFuncList(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.funclist, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.funclist, PR_WAITOK | PR_ZERO); } void -rf_FreeFuncList(RF_FuncList_t *funcList) +rf_FreeFuncList(RF_Raid_t *raidPtr, RF_FuncList_t *funcList) { - pool_put(&rf_pools.funclist, funcList); + pool_put(&raidPtr->pools.funclist, funcList); } /* allocates a stripe buffer -- a buffer large enough to hold all the data @@ -340,7 +353,7 @@ rf_AllocStripeBuffer(RF_Raid_t *raidPtr, vple = raidPtr->stripebuf; raidPtr->stripebuf = vple->next; p = vple->p; - rf_FreeVPListElem(vple); + rf_FreeVPListElem(raidPtr, vple); raidPtr->stripebuf_count--; } else { #ifdef DIAGNOSTIC @@ -357,7 +370,7 @@ rf_AllocStripeBuffer(RF_Raid_t *raidPtr, } memset(p, 0, raidPtr->numCol * (raidPtr->Layout.sectorsPerStripeUnit << raidPtr->logBytesPerSector)); - vple = rf_AllocVPListElem(); + vple = rf_AllocVPListElem(raidPtr); vple->p = p; vple->next = dag_h->desc->stripebufs; dag_h->desc->stripebufs = vple; @@ -377,7 +390,7 @@ rf_FreeStripeBuffer(RF_Raid_t *raidPtr, raidPtr->stripebuf_count++; } else { free(vple->p, M_RAIDFRAME); - rf_FreeVPListElem(vple); + rf_FreeVPListElem(raidPtr, vple); } rf_unlock_mutex2(raidPtr->mutex); } @@ -393,7 +406,7 @@ rf_AllocBuffer(RF_Raid_t *raidPtr, RF_Da void *p; p = rf_AllocIOBuffer(raidPtr, size); - vple = rf_AllocVPListElem(); + vple = rf_AllocVPListElem(raidPtr); vple->p = p; vple->next = dag_h->desc->iobufs; dag_h->desc->iobufs = vple; @@ -419,7 +432,7 @@ rf_AllocIOBuffer(RF_Raid_t *raidPtr, int vple = raidPtr->iobuf; raidPtr->iobuf = vple->next; p = vple->p; - rf_FreeVPListElem(vple); + rf_FreeVPListElem(raidPtr, vple); raidPtr->iobuf_count--; } else { #ifdef DIAGNOSTIC @@ -450,7 +463,7 @@ rf_FreeIOBuffer(RF_Raid_t *raidPtr, RF_V raidPtr->iobuf_count++; } else { free(vple->p, M_RAIDFRAME); - rf_FreeVPListElem(vple); + rf_FreeVPListElem(raidPtr, vple); } rf_unlock_mutex2(raidPtr->mutex); } Index: src/sys/dev/raidframe/rf_diskqueue.c diff -u src/sys/dev/raidframe/rf_diskqueue.c:1.59 src/sys/dev/raidframe/rf_diskqueue.c:1.60 --- src/sys/dev/raidframe/rf_diskqueue.c:1.59 Fri Jul 23 00:26:19 2021 +++ src/sys/dev/raidframe/rf_diskqueue.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_diskqueue.c,v 1.59 2021/07/23 00:26:19 oster Exp $ */ +/* $NetBSD: rf_diskqueue.c,v 1.60 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -66,7 +66,7 @@ ****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.59 2021/07/23 00:26:19 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.60 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -193,21 +193,27 @@ rf_ConfigureDiskQueue(RF_Raid_t *raidPtr } static void -rf_ShutdownDiskQueueSystem(void *ignored) +rf_ShutdownDiskQueueSystem(void *arg) { - pool_destroy(&rf_pools.dqd); - pool_destroy(&rf_pools.bufio); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.dqd); + pool_destroy(&raidPtr->pools.bufio); } int -rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **listp) +rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) + { - rf_pool_init(&rf_pools.dqd, sizeof(RF_DiskQueueData_t), - "rf_dqd_pl", RF_MIN_FREE_DQD, RF_MAX_FREE_DQD); - rf_pool_init(&rf_pools.bufio, sizeof(buf_t), - "rf_bufio_pl", RF_MIN_FREE_BUFIO, RF_MAX_FREE_BUFIO); - rf_ShutdownCreate(listp, rf_ShutdownDiskQueueSystem, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.dqd, &raidPtr->pools.dqd, sizeof(RF_DiskQueueData_t), + "dqd", RF_MIN_FREE_DQD, RF_MAX_FREE_DQD); + rf_pool_init(raidPtr, raidPtr->poolNames.bufio, &raidPtr->pools.bufio, sizeof(buf_t), + "bufio", RF_MIN_FREE_BUFIO, RF_MAX_FREE_BUFIO); + rf_ShutdownCreate(listp, rf_ShutdownDiskQueueSystem, raidPtr); return (0); } @@ -377,7 +383,7 @@ rf_CreateDiskQueueData(RF_IoType_t typ, { RF_DiskQueueData_t *p; - p = pool_get(&rf_pools.dqd, PR_WAITOK | PR_ZERO); + p = pool_get(&raidPtr->pools.dqd, PR_WAITOK | PR_ZERO); KASSERT(p != NULL); /* Obtain a buffer from our own pool. It is possible for the @@ -386,7 +392,7 @@ rf_CreateDiskQueueData(RF_IoType_t typ, doesn't have a good way to recover if memory allocation fails here. */ - p->bp = pool_get(&rf_pools.bufio, PR_WAITOK | PR_ZERO); + p->bp = pool_get(&raidPtr->pools.bufio, PR_WAITOK | PR_ZERO); KASSERT(p->bp != NULL); buf_init(p->bp); @@ -416,6 +422,6 @@ rf_CreateDiskQueueData(RF_IoType_t typ, void rf_FreeDiskQueueData(RF_DiskQueueData_t *p) { - pool_put(&rf_pools.bufio, p->bp); - pool_put(&rf_pools.dqd, p); + pool_put(&p->raidPtr->pools.bufio, p->bp); + pool_put(&p->raidPtr->pools.dqd, p); } Index: src/sys/dev/raidframe/rf_diskqueue.h diff -u src/sys/dev/raidframe/rf_diskqueue.h:1.26 src/sys/dev/raidframe/rf_diskqueue.h:1.27 --- src/sys/dev/raidframe/rf_diskqueue.h:1.26 Fri Jun 19 19:29:39 2020 +++ src/sys/dev/raidframe/rf_diskqueue.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_diskqueue.h,v 1.26 2020/06/19 19:29:39 jdolecek Exp $ */ +/* $NetBSD: rf_diskqueue.h,v 1.27 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -131,7 +131,7 @@ struct RF_DiskQueue_s { (RF_QUEUE_EMPTY(_q_) || \ (!RF_QUEUE_FULL(_q_) && ((_r_)->priority >= (_q_)->curPriority))) -int rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **); +int rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); int rf_ConfigureDiskQueues(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); void rf_DiskIOEnqueue(RF_DiskQueue_t *, RF_DiskQueueData_t *, int); void rf_DiskIOComplete(RF_DiskQueue_t *, RF_DiskQueueData_t *, int); Index: src/sys/dev/raidframe/rf_reconbuffer.c diff -u src/sys/dev/raidframe/rf_reconbuffer.c:1.26 src/sys/dev/raidframe/rf_reconbuffer.c:1.27 --- src/sys/dev/raidframe/rf_reconbuffer.c:1.26 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_reconbuffer.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_reconbuffer.c,v 1.26 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_reconbuffer.c,v 1.27 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ ***************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_reconbuffer.c,v 1.26 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_reconbuffer.c,v 1.27 2021/07/23 00:54:45 oster Exp $"); #include "rf_raid.h" #include "rf_reconbuffer.h" @@ -233,8 +233,8 @@ rf_SubmitReconBufferBasic(RF_ReconBuffer RF_PANIC(); } pssPtr->flags |= RF_PSS_BUFFERWAIT; - cb = rf_AllocCallbackValueDesc();/* append to buf wait list in - * recon ctrl structure */ + cb = rf_AllocCallbackValueDesc(raidPtr); /* append to buf wait list in + * recon ctrl structure */ cb->col = rbuf->col; cb->v = rbuf->parityStripeID; cb->next = NULL; @@ -413,7 +413,7 @@ rf_ReleaseFloatingReconBuffer(RF_Raid_t rcPtr->bufferWaitList = cb->next; rf_CauseReconEvent(raidPtr, cb->col, (void *) 1, RF_REVENT_BUFCLEAR); /* arg==1 => we've * committed a buffer */ - rf_FreeCallbackValueDesc(cb); + rf_FreeCallbackValueDesc(raidPtr, cb); raidPtr->procsInBufWait--; } else { rbuf->next = rcPtr->floatingRbufs; Index: src/sys/dev/raidframe/rf_driver.c diff -u src/sys/dev/raidframe/rf_driver.c:1.137 src/sys/dev/raidframe/rf_driver.c:1.138 --- src/sys/dev/raidframe/rf_driver.c:1.137 Wed May 26 06:11:50 2021 +++ src/sys/dev/raidframe/rf_driver.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_driver.c,v 1.137 2021/05/26 06:11:50 mrg Exp $ */ +/* $NetBSD: rf_driver.c,v 1.138 2021/07/23 00:54:45 oster Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. * All rights reserved. @@ -66,7 +66,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.137 2021/05/26 06:11:50 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.138 2021/07/23 00:54:45 oster Exp $"); #ifdef _KERNEL_OPT #include "opt_raid_diagnostic.h" @@ -128,7 +128,7 @@ static void rf_ConfigureDebug(RF_Config_ static void set_debug_option(char *name, long val); static void rf_UnconfigureArray(void); static void rf_ShutdownRDFreeList(void *); -static int rf_ConfigureRDFreeList(RF_ShutdownList_t **); +static int rf_ConfigureRDFreeList(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); rf_declare_mutex2(rf_printf_mutex); /* debug only: avoids interleaved * printfs by different stripes */ @@ -147,7 +147,7 @@ static rf_declare_mutex2(configureMutex) static RF_ShutdownList_t *globalShutdown; /* non array-specific * stuff */ -static int rf_ConfigureRDFreeList(RF_ShutdownList_t ** listp); +static int rf_ConfigureRDFreeList(RF_ShutdownList_t ** listp, RF_Raid_t *raidPtr, RF_Config_t *cfgPtr); static int rf_AllocEmergBuffers(RF_Raid_t *); static void rf_FreeEmergBuffers(RF_Raid_t *); static void rf_destroy_mutex_cond(RF_Raid_t *); @@ -309,7 +309,6 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf rf_init_mutex2(rf_printf_mutex, IPL_VM); /* initialize globals */ - DO_INIT_CONFIGURE(rf_ConfigureAllocList); /* @@ -321,19 +320,9 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf #if RF_ACC_TRACE > 0 DO_INIT_CONFIGURE(rf_ConfigureAccessTrace); #endif - DO_INIT_CONFIGURE(rf_ConfigureMapModule); - DO_INIT_CONFIGURE(rf_ConfigureReconEvent); - DO_INIT_CONFIGURE(rf_ConfigureCallback); - DO_INIT_CONFIGURE(rf_ConfigureRDFreeList); DO_INIT_CONFIGURE(rf_ConfigureNWayXor); - DO_INIT_CONFIGURE(rf_ConfigureStripeLockFreeList); - DO_INIT_CONFIGURE(rf_ConfigureMCPair); - DO_INIT_CONFIGURE(rf_ConfigureDAGs); DO_INIT_CONFIGURE(rf_ConfigureDAGFuncs); - DO_INIT_CONFIGURE(rf_ConfigureReconstruction); DO_INIT_CONFIGURE(rf_ConfigureCopyback); - DO_INIT_CONFIGURE(rf_ConfigureDiskQueueSystem); - DO_INIT_CONFIGURE(rf_ConfigurePSStatus); isconfigged = 1; } rf_unlock_mutex2(configureMutex); @@ -358,6 +347,17 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf raidPtr->status = rf_rs_optimal; raidPtr->reconControl = NULL; + DO_RAID_INIT_CONFIGURE(rf_ConfigureMapModule); + DO_RAID_INIT_CONFIGURE(rf_ConfigureReconEvent); + DO_RAID_INIT_CONFIGURE(rf_ConfigureCallback); + DO_RAID_INIT_CONFIGURE(rf_ConfigureRDFreeList); + DO_RAID_INIT_CONFIGURE(rf_ConfigureStripeLockFreeList); + DO_RAID_INIT_CONFIGURE(rf_ConfigureMCPair); + DO_RAID_INIT_CONFIGURE(rf_ConfigureDAGs); + DO_RAID_INIT_CONFIGURE(rf_ConfigureReconstruction); + DO_RAID_INIT_CONFIGURE(rf_ConfigureDiskQueueSystem); + DO_RAID_INIT_CONFIGURE(rf_ConfigurePSStatus); + DO_RAID_INIT_CONFIGURE(rf_ConfigureEngine); DO_RAID_INIT_CONFIGURE(rf_ConfigureStripeLocks); @@ -379,6 +379,9 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf DO_RAID_INIT_CONFIGURE(rf_ConfigureLayout); + + + /* Initialize per-RAID PSS bits */ rf_InitPSStatus(raidPtr); @@ -491,7 +494,7 @@ rf_AllocEmergBuffers(RF_Raid_t *raidPtr) raidPtr->logBytesPerSector, M_RAIDFRAME, M_WAITOK); if (tmpbuf) { - vple = rf_AllocVPListElem(); + vple = rf_AllocVPListElem(raidPtr); vple->p= tmpbuf; vple->next = raidPtr->iobuf; raidPtr->iobuf = vple; @@ -510,7 +513,7 @@ rf_AllocEmergBuffers(RF_Raid_t *raidPtr) raidPtr->logBytesPerSector), M_RAIDFRAME, M_WAITOK); if (tmpbuf) { - vple = rf_AllocVPListElem(); + vple = rf_AllocVPListElem(raidPtr); vple->p= tmpbuf; vple->next = raidPtr->stripebuf; raidPtr->stripebuf = vple; @@ -535,7 +538,7 @@ rf_FreeEmergBuffers(RF_Raid_t *raidPtr) tmp = raidPtr->iobuf; raidPtr->iobuf = raidPtr->iobuf->next; free(tmp->p, M_RAIDFRAME); - rf_FreeVPListElem(tmp); + rf_FreeVPListElem(raidPtr,tmp); } /* Free the emergency stripe buffers */ @@ -543,24 +546,29 @@ rf_FreeEmergBuffers(RF_Raid_t *raidPtr) tmp = raidPtr->stripebuf; raidPtr->stripebuf = raidPtr->stripebuf->next; free(tmp->p, M_RAIDFRAME); - rf_FreeVPListElem(tmp); + rf_FreeVPListElem(raidPtr, tmp); } } static void -rf_ShutdownRDFreeList(void *ignored) +rf_ShutdownRDFreeList(void *arg) { - pool_destroy(&rf_pools.rad); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.rad); } static int -rf_ConfigureRDFreeList(RF_ShutdownList_t **listp) +rf_ConfigureRDFreeList(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.rad, sizeof(RF_RaidAccessDesc_t), - "rf_rad_pl", RF_MIN_FREE_RAD, RF_MAX_FREE_RAD); - rf_ShutdownCreate(listp, rf_ShutdownRDFreeList, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.rad, &raidPtr->pools.rad, sizeof(RF_RaidAccessDesc_t), + "rad", RF_MIN_FREE_RAD, RF_MAX_FREE_RAD); + rf_ShutdownCreate(listp, rf_ShutdownRDFreeList, raidPtr); return (0); } @@ -572,7 +580,7 @@ rf_AllocRaidAccDesc(RF_Raid_t *raidPtr, { RF_RaidAccessDesc_t *desc; - desc = pool_get(&rf_pools.rad, PR_WAITOK); + desc = pool_get(&raidPtr->pools.rad, PR_WAITOK); rf_lock_mutex2(raidPtr->rad_lock); if (raidPtr->waitShutdown) { @@ -582,7 +590,7 @@ rf_AllocRaidAccDesc(RF_Raid_t *raidPtr, */ rf_unlock_mutex2(raidPtr->rad_lock); - pool_put(&rf_pools.rad, desc); + pool_put(&raidPtr->pools.rad, desc); return (NULL); } raidPtr->nAccOutstanding++; @@ -628,7 +636,7 @@ rf_FreeRaidAccDesc(RF_RaidAccessDesc_t * while(dagList != NULL) { temp = dagList; dagList = dagList->next; - rf_FreeDAGList(temp); + rf_FreeDAGList(raidPtr, temp); } while (desc->iobufs) { @@ -643,7 +651,7 @@ rf_FreeRaidAccDesc(RF_RaidAccessDesc_t * rf_FreeStripeBuffer(raidPtr, tmp); } - pool_put(&rf_pools.rad, desc); + pool_put(&raidPtr->pools.rad, desc); rf_lock_mutex2(raidPtr->rad_lock); raidPtr->nAccOutstanding--; if (raidPtr->waitShutdown) { @@ -848,7 +856,7 @@ rf_ResumeNewRequests(RF_Raid_t *raidPtr) t = cb; cb = cb->next; (t->callbackFunc) (t->callbackArg); - rf_FreeCallbackFuncDesc(t); + rf_FreeCallbackFuncDesc(raidPtr, t); } } /***************************************************************************************** Index: src/sys/dev/raidframe/rf_evenodd.c diff -u src/sys/dev/raidframe/rf_evenodd.c:1.22 src/sys/dev/raidframe/rf_evenodd.c:1.23 --- src/sys/dev/raidframe/rf_evenodd.c:1.22 Sat Feb 9 03:34:00 2019 +++ src/sys/dev/raidframe/rf_evenodd.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_evenodd.c,v 1.22 2019/02/09 03:34:00 christos Exp $ */ +/* $NetBSD: rf_evenodd.c,v 1.23 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ ****************************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_evenodd.c,v 1.22 2019/02/09 03:34:00 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_evenodd.c,v 1.23 2021/07/23 00:54:45 oster Exp $"); #include "rf_archs.h" @@ -356,7 +356,7 @@ rf_VerifyParityEvenOdd(RF_Raid_t *raidPt retcode = RF_PARITY_OKAY; - mcpair = rf_AllocMCPair(); + mcpair = rf_AllocMCPair(raidPtr); rf_MakeAllocList(alloclist); buf = RF_MallocAndAdd( numbytes * (layoutPtr->numDataCol + layoutPtr->numParityCol), @@ -526,10 +526,10 @@ rf_VerifyParityEvenOdd(RF_Raid_t *raidPt out: - rf_FreeAccessStripeMap(asm_h); + rf_FreeAccessStripeMap(raidPtr, asm_h); rf_FreeAllocList(alloclist); rf_FreeDAG(rd_dag_h); - rf_FreeMCPair(mcpair); + rf_FreeMCPair(raidPtr, mcpair); return (retcode); } #endif /* RF_INCLUDE_EVENODD > 0 */ Index: src/sys/dev/raidframe/rf_map.c diff -u src/sys/dev/raidframe/rf_map.c:1.50 src/sys/dev/raidframe/rf_map.c:1.51 --- src/sys/dev/raidframe/rf_map.c:1.50 Tue May 28 08:59:35 2019 +++ src/sys/dev/raidframe/rf_map.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_map.c,v 1.50 2019/05/28 08:59:35 msaitoh Exp $ */ +/* $NetBSD: rf_map.c,v 1.51 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ **************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_map.c,v 1.50 2019/05/28 08:59:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_map.c,v 1.51 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -43,8 +43,8 @@ __KERNEL_RCSID(0, "$NetBSD: rf_map.c,v 1 #include "rf_map.h" #include "rf_shutdown.h" -static void rf_FreePDAList(RF_PhysDiskAddr_t *pda_list); -static void rf_FreeASMList(RF_AccessStripeMap_t *asm_list); +static void rf_FreePDAList(RF_Raid_t *raidPtr, RF_PhysDiskAddr_t *pda_list); +static void rf_FreeASMList(RF_Raid_t *raidPtr, RF_AccessStripeMap_t *asm_list); /*************************************************************************** * @@ -108,10 +108,10 @@ rf_MapAccess(RF_Raid_t *raidPtr, RF_Raid SUID = rf_RaidAddressToStripeUnitID(layoutPtr, raidAddress); lastSUID = rf_RaidAddressToStripeUnitID(layoutPtr, lastRaidAddr); - asmList = rf_AllocASMList(totStripes); + asmList = rf_AllocASMList(raidPtr, totStripes); /* may also need pda(s) per stripe for parity */ - pdaList = rf_AllocPDAList(lastSUID - SUID + 1 + + pdaList = rf_AllocPDAList(raidPtr, lastSUID - SUID + 1 + faultsTolerated * totStripes); @@ -209,7 +209,7 @@ rf_MapAccess(RF_Raid_t *raidPtr, RF_Raid /* raidAddr may be needed to find unit to redirect to */ pda_p->raidAddress = rf_RaidAddressOfPrevStripeUnitBoundary(layoutPtr, startAddrWithinStripe); rf_ASMCheckStatus(raidPtr, pda_p, asm_p, disks, 1); - rf_ASMParityAdjust(asm_p->parityInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); + rf_ASMParityAdjust(raidPtr, asm_p->parityInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); break; #if (RF_INCLUDE_DECL_PQ > 0) || (RF_INCLUDE_RAID6 > 0) @@ -236,15 +236,15 @@ rf_MapAccess(RF_Raid_t *raidPtr, RF_Raid /* failure mode stuff */ rf_ASMCheckStatus(raidPtr, pda_p, asm_p, disks, 1); rf_ASMCheckStatus(raidPtr, pda_q, asm_p, disks, 1); - rf_ASMParityAdjust(asm_p->parityInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); - rf_ASMParityAdjust(asm_p->qInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); + rf_ASMParityAdjust(raidPtr, asm_p->parityInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); + rf_ASMParityAdjust(raidPtr, asm_p->qInfo, startAddrWithinStripe, endAddress, layoutPtr, asm_p); break; #endif } } RF_ASSERT(asmList == NULL && pdaList == NULL); /* make the header structure */ - asm_hdr = rf_AllocAccessStripeMapHeader(); + asm_hdr = rf_AllocAccessStripeMapHeader(raidPtr); RF_ASSERT(numStripes == totStripes); asm_hdr->numStripes = numStripes; asm_hdr->stripeMap = asm_list; @@ -339,103 +339,108 @@ rf_MarkFailuresInASMList(RF_Raid_t *raid release all the free lists */ static void rf_ShutdownMapModule(void *); static void -rf_ShutdownMapModule(void *ignored) +rf_ShutdownMapModule(void *arg) { - pool_destroy(&rf_pools.asm_hdr); - pool_destroy(&rf_pools.asmap); - pool_destroy(&rf_pools.asmhle); - pool_destroy(&rf_pools.pda); - pool_destroy(&rf_pools.fss); - pool_destroy(&rf_pools.vfple); - pool_destroy(&rf_pools.vple); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.asm_hdr); + pool_destroy(&raidPtr->pools.asmap); + pool_destroy(&raidPtr->pools.asmhle); + pool_destroy(&raidPtr->pools.pda); + pool_destroy(&raidPtr->pools.fss); + pool_destroy(&raidPtr->pools.vfple); + pool_destroy(&raidPtr->pools.vple); } int -rf_ConfigureMapModule(RF_ShutdownList_t **listp) +rf_ConfigureMapModule(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.asm_hdr, sizeof(RF_AccessStripeMapHeader_t), - "rf_asmhdr_pl", RF_MIN_FREE_ASMHDR, RF_MAX_FREE_ASMHDR); - rf_pool_init(&rf_pools.asmap, sizeof(RF_AccessStripeMap_t), - "rf_asm_pl", RF_MIN_FREE_ASM, RF_MAX_FREE_ASM); - rf_pool_init(&rf_pools.asmhle, sizeof(RF_ASMHeaderListElem_t), - "rf_asmhle_pl", RF_MIN_FREE_ASMHLE, RF_MAX_FREE_ASMHLE); - rf_pool_init(&rf_pools.pda, sizeof(RF_PhysDiskAddr_t), - "rf_pda_pl", RF_MIN_FREE_PDA, RF_MAX_FREE_PDA); - rf_pool_init(&rf_pools.fss, sizeof(RF_FailedStripe_t), - "rf_fss_pl", RF_MIN_FREE_FSS, RF_MAX_FREE_FSS); - rf_pool_init(&rf_pools.vfple, sizeof(RF_VoidFunctionPointerListElem_t), - "rf_vfple_pl", RF_MIN_FREE_VFPLE, RF_MAX_FREE_VFPLE); - rf_pool_init(&rf_pools.vple, sizeof(RF_VoidPointerListElem_t), - "rf_vple_pl", RF_MIN_FREE_VPLE, RF_MAX_FREE_VPLE); - rf_ShutdownCreate(listp, rf_ShutdownMapModule, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.asm_hdr, &raidPtr->pools.asm_hdr, sizeof(RF_AccessStripeMapHeader_t), + "asmhdr", RF_MIN_FREE_ASMHDR, RF_MAX_FREE_ASMHDR); + rf_pool_init(raidPtr, raidPtr->poolNames.asmap, &raidPtr->pools.asmap, sizeof(RF_AccessStripeMap_t), + "asmap", RF_MIN_FREE_ASM, RF_MAX_FREE_ASM); + rf_pool_init(raidPtr, raidPtr->poolNames.asmhle, &raidPtr->pools.asmhle, sizeof(RF_ASMHeaderListElem_t), + "asmhle", RF_MIN_FREE_ASMHLE, RF_MAX_FREE_ASMHLE); + rf_pool_init(raidPtr, raidPtr->poolNames.pda, &raidPtr->pools.pda, sizeof(RF_PhysDiskAddr_t), + "pda", RF_MIN_FREE_PDA, RF_MAX_FREE_PDA); + rf_pool_init(raidPtr, raidPtr->poolNames.fss, &raidPtr->pools.fss, sizeof(RF_FailedStripe_t), + "fss", RF_MIN_FREE_FSS, RF_MAX_FREE_FSS); + rf_pool_init(raidPtr, raidPtr->poolNames.vfple, &raidPtr->pools.vfple, sizeof(RF_VoidFunctionPointerListElem_t), + "vfple", RF_MIN_FREE_VFPLE, RF_MAX_FREE_VFPLE); + rf_pool_init(raidPtr, raidPtr->poolNames.vple, &raidPtr->pools.vple, sizeof(RF_VoidPointerListElem_t), + "vple", RF_MIN_FREE_VPLE, RF_MAX_FREE_VPLE); + rf_ShutdownCreate(listp, rf_ShutdownMapModule, raidPtr); return (0); } RF_AccessStripeMapHeader_t * -rf_AllocAccessStripeMapHeader(void) +rf_AllocAccessStripeMapHeader(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.asm_hdr, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.asm_hdr, PR_WAITOK | PR_ZERO); } void -rf_FreeAccessStripeMapHeader(RF_AccessStripeMapHeader_t *p) +rf_FreeAccessStripeMapHeader(RF_Raid_t *raidPtr, RF_AccessStripeMapHeader_t *p) { - pool_put(&rf_pools.asm_hdr, p); + pool_put(&raidPtr->pools.asm_hdr, p); } RF_VoidFunctionPointerListElem_t * -rf_AllocVFPListElem(void) +rf_AllocVFPListElem(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.vfple, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.vfple, PR_WAITOK | PR_ZERO); } void -rf_FreeVFPListElem(RF_VoidFunctionPointerListElem_t *p) +rf_FreeVFPListElem(RF_Raid_t *raidPtr, RF_VoidFunctionPointerListElem_t *p) { - pool_put(&rf_pools.vfple, p); + pool_put(&raidPtr->pools.vfple, p); } RF_VoidPointerListElem_t * -rf_AllocVPListElem(void) +rf_AllocVPListElem(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.vple, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.vple, PR_WAITOK | PR_ZERO); } void -rf_FreeVPListElem(RF_VoidPointerListElem_t *p) +rf_FreeVPListElem(RF_Raid_t *raidPtr, RF_VoidPointerListElem_t *p) { - pool_put(&rf_pools.vple, p); + pool_put(&raidPtr->pools.vple, p); } RF_ASMHeaderListElem_t * -rf_AllocASMHeaderListElem(void) +rf_AllocASMHeaderListElem(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.asmhle, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.asmhle, PR_WAITOK | PR_ZERO); } void -rf_FreeASMHeaderListElem(RF_ASMHeaderListElem_t *p) +rf_FreeASMHeaderListElem(RF_Raid_t *raidPtr, RF_ASMHeaderListElem_t *p) { - pool_put(&rf_pools.asmhle, p); + pool_put(&raidPtr->pools.asmhle, p); } RF_FailedStripe_t * -rf_AllocFailedStripeStruct(void) +rf_AllocFailedStripeStruct(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.fss, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.fss, PR_WAITOK | PR_ZERO); } void -rf_FreeFailedStripeStruct(RF_FailedStripe_t *p) +rf_FreeFailedStripeStruct(RF_Raid_t *raidPtr, RF_FailedStripe_t *p) { - pool_put(&rf_pools.fss, p); + pool_put(&raidPtr->pools.fss, p); } @@ -443,9 +448,9 @@ rf_FreeFailedStripeStruct(RF_FailedStrip RF_PhysDiskAddr_t * -rf_AllocPhysDiskAddr(void) +rf_AllocPhysDiskAddr(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.pda, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.pda, PR_WAITOK | PR_ZERO); } /* allocates a list of PDAs, locking the free list only once when we * have to call calloc, we do it one component at a time to simplify @@ -453,7 +458,7 @@ rf_AllocPhysDiskAddr(void) * not be much of a performance hit, because it should be very * infrequently executed. */ RF_PhysDiskAddr_t * -rf_AllocPDAList(int count) +rf_AllocPDAList(RF_Raid_t *raidPtr, int count) { RF_PhysDiskAddr_t *p, *prev; int i; @@ -461,7 +466,7 @@ rf_AllocPDAList(int count) p = NULL; prev = NULL; for (i = 0; i < count; i++) { - p = pool_get(&rf_pools.pda, PR_WAITOK); + p = pool_get(&raidPtr->pools.pda, PR_WAITOK); p->next = prev; prev = p; } @@ -470,20 +475,20 @@ rf_AllocPDAList(int count) } void -rf_FreePhysDiskAddr(RF_PhysDiskAddr_t *p) +rf_FreePhysDiskAddr(RF_Raid_t *raidPtr, RF_PhysDiskAddr_t *p) { - pool_put(&rf_pools.pda, p); + pool_put(&raidPtr->pools.pda, p); } static void -rf_FreePDAList(RF_PhysDiskAddr_t *pda_list) +rf_FreePDAList(RF_Raid_t *raidPtr, RF_PhysDiskAddr_t *pda_list) { RF_PhysDiskAddr_t *p, *tmp; p=pda_list; while (p) { tmp = p->next; - pool_put(&rf_pools.pda, p); + pool_put(&raidPtr->pools.pda, p); p = tmp; } } @@ -494,7 +499,7 @@ rf_FreePDAList(RF_PhysDiskAddr_t *pda_li * shutdown. This should not be much of a performance hit, because it * should be very infrequently executed. */ RF_AccessStripeMap_t * -rf_AllocASMList(int count) +rf_AllocASMList(RF_Raid_t *raidPtr, int count) { RF_AccessStripeMap_t *p, *prev; int i; @@ -502,7 +507,7 @@ rf_AllocASMList(int count) p = NULL; prev = NULL; for (i = 0; i < count; i++) { - p = pool_get(&rf_pools.asmap, PR_WAITOK); + p = pool_get(&raidPtr->pools.asmap, PR_WAITOK); p->next = prev; prev = p; } @@ -510,20 +515,20 @@ rf_AllocASMList(int count) } static void -rf_FreeASMList(RF_AccessStripeMap_t *asm_list) +rf_FreeASMList(RF_Raid_t *raidPtr, RF_AccessStripeMap_t *asm_list) { RF_AccessStripeMap_t *p, *tmp; p=asm_list; while (p) { tmp = p->next; - pool_put(&rf_pools.asmap, p); + pool_put(&raidPtr->pools.asmap, p); p = tmp; } } void -rf_FreeAccessStripeMap(RF_AccessStripeMapHeader_t *hdr) +rf_FreeAccessStripeMap(RF_Raid_t *raidPtr, RF_AccessStripeMapHeader_t *hdr) { RF_AccessStripeMap_t *p; RF_PhysDiskAddr_t *pdp, *trailer, *pdaList = NULL, *pdaEnd = NULL; @@ -576,9 +581,9 @@ rf_FreeAccessStripeMap(RF_AccessStripeMa RF_ASSERT(t == count); if (pdaList) - rf_FreePDAList(pdaList); - rf_FreeASMList(hdr->stripeMap); - rf_FreeAccessStripeMapHeader(hdr); + rf_FreePDAList(raidPtr, pdaList); + rf_FreeASMList(raidPtr, hdr->stripeMap); + rf_FreeAccessStripeMapHeader(raidPtr, hdr); } /* We can't use the large write optimization if there are any failures * in the stripe. In the declustered layout, there is no way to @@ -760,7 +765,8 @@ rf_PrintRaidAddressInfo(RF_Raid_t *raidP * range restrict the parity descriptor to touch only the correct * stuff. */ void -rf_ASMParityAdjust(RF_PhysDiskAddr_t *toAdjust, +rf_ASMParityAdjust(RF_Raid_t *raidPtr, + RF_PhysDiskAddr_t *toAdjust, RF_StripeNum_t startAddrWithinStripe, RF_SectorNum_t endAddress, RF_RaidLayout_t *layoutPtr, @@ -795,7 +801,7 @@ rf_ASMParityAdjust(RF_PhysDiskAddr_t *to RF_ASSERT(toAdjust->next == NULL); /* the following will get freed in rf_FreeAccessStripeMap() via rf_FreePDAList() */ - new_pda = toAdjust->next = rf_AllocPhysDiskAddr(); + new_pda = toAdjust->next = rf_AllocPhysDiskAddr(raidPtr); *new_pda = *toAdjust; /* structure assignment */ new_pda->next = NULL; Index: src/sys/dev/raidframe/rf_map.h diff -u src/sys/dev/raidframe/rf_map.h:1.13 src/sys/dev/raidframe/rf_map.h:1.14 --- src/sys/dev/raidframe/rf_map.h:1.13 Sun Mar 4 06:02:38 2007 +++ src/sys/dev/raidframe/rf_map.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_map.h,v 1.13 2007/03/04 06:02:38 christos Exp $ */ +/* $NetBSD: rf_map.h,v 1.14 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -40,31 +40,31 @@ RF_AccessStripeMapHeader_t *rf_MapAccess(RF_Raid_t *, RF_RaidAddr_t, RF_SectorCount_t, void *, int); void rf_MarkFailuresInASMList(RF_Raid_t *, RF_AccessStripeMapHeader_t *); -int rf_ConfigureMapModule(RF_ShutdownList_t **); -RF_AccessStripeMapHeader_t *rf_AllocAccessStripeMapHeader(void); -void rf_FreeAccessStripeMapHeader(RF_AccessStripeMapHeader_t *); -RF_PhysDiskAddr_t *rf_AllocPhysDiskAddr(void); -RF_PhysDiskAddr_t *rf_AllocPDAList(int); -void rf_FreePhysDiskAddr(RF_PhysDiskAddr_t *); -RF_AccessStripeMap_t *rf_AllocASMList(int); -void rf_FreeAccessStripeMap(RF_AccessStripeMapHeader_t *); +int rf_ConfigureMapModule(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); +RF_AccessStripeMapHeader_t *rf_AllocAccessStripeMapHeader(RF_Raid_t *); +void rf_FreeAccessStripeMapHeader(RF_Raid_t *, RF_AccessStripeMapHeader_t *); +RF_PhysDiskAddr_t *rf_AllocPhysDiskAddr(RF_Raid_t *); +RF_PhysDiskAddr_t *rf_AllocPDAList(RF_Raid_t *, int); +void rf_FreePhysDiskAddr(RF_Raid_t *, RF_PhysDiskAddr_t *); +RF_AccessStripeMap_t *rf_AllocASMList(RF_Raid_t *, int); +void rf_FreeAccessStripeMap(RF_Raid_t *, RF_AccessStripeMapHeader_t *); int rf_CheckStripeForFailures(RF_Raid_t *, RF_AccessStripeMap_t *); int rf_NumFailedDataUnitsInStripe(RF_Raid_t *, RF_AccessStripeMap_t *); void rf_PrintAccessStripeMap(RF_AccessStripeMapHeader_t *); void rf_PrintFullAccessStripeMap(RF_AccessStripeMapHeader_t *, int); void rf_PrintRaidAddressInfo(RF_Raid_t *, RF_RaidAddr_t, RF_SectorCount_t); -void rf_ASMParityAdjust(RF_PhysDiskAddr_t *, RF_StripeNum_t, RF_SectorNum_t, +void rf_ASMParityAdjust(RF_Raid_t *, RF_PhysDiskAddr_t *, RF_StripeNum_t, RF_SectorNum_t, RF_RaidLayout_t *, RF_AccessStripeMap_t *); void rf_ASMCheckStatus(RF_Raid_t *, RF_PhysDiskAddr_t *, RF_AccessStripeMap_t *, RF_RaidDisk_t *, int); -RF_VoidFunctionPointerListElem_t *rf_AllocVFPListElem(void); -void rf_FreeVFPListElem(RF_VoidFunctionPointerListElem_t *); -RF_VoidPointerListElem_t *rf_AllocVPListElem(void); -void rf_FreeVPListElem(RF_VoidPointerListElem_t *); -RF_ASMHeaderListElem_t *rf_AllocASMHeaderListElem(void); -void rf_FreeASMHeaderListElem(RF_ASMHeaderListElem_t *); -RF_FailedStripe_t *rf_AllocFailedStripeStruct(void); -void rf_FreeFailedStripeStruct(RF_FailedStripe_t *); +RF_VoidFunctionPointerListElem_t *rf_AllocVFPListElem(RF_Raid_t *); +void rf_FreeVFPListElem(RF_Raid_t *, RF_VoidFunctionPointerListElem_t *); +RF_VoidPointerListElem_t *rf_AllocVPListElem(RF_Raid_t *); +void rf_FreeVPListElem(RF_Raid_t *, RF_VoidPointerListElem_t *); +RF_ASMHeaderListElem_t *rf_AllocASMHeaderListElem(RF_Raid_t *); +void rf_FreeASMHeaderListElem(RF_Raid_t *, RF_ASMHeaderListElem_t *); +RF_FailedStripe_t *rf_AllocFailedStripeStruct(RF_Raid_t *); +void rf_FreeFailedStripeStruct(RF_Raid_t *, RF_FailedStripe_t *); #endif /* !_RF__RF_MAP_H_ */ Index: src/sys/dev/raidframe/rf_mcpair.h diff -u src/sys/dev/raidframe/rf_mcpair.h:1.10 src/sys/dev/raidframe/rf_mcpair.h:1.11 --- src/sys/dev/raidframe/rf_mcpair.h:1.10 Sun May 1 01:09:05 2011 +++ src/sys/dev/raidframe/rf_mcpair.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_mcpair.h,v 1.10 2011/05/01 01:09:05 mrg Exp $ */ +/* $NetBSD: rf_mcpair.h,v 1.11 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -45,9 +45,9 @@ struct RF_MCPair_s { #define RF_LOCK_MCPAIR(_mcp) rf_lock_mutex2((_mcp)->mutex) #define RF_UNLOCK_MCPAIR(_mcp) rf_unlock_mutex2((_mcp)->mutex) -int rf_ConfigureMCPair(RF_ShutdownList_t ** listp); -RF_MCPair_t *rf_AllocMCPair(void); -void rf_FreeMCPair(RF_MCPair_t * t); +int rf_ConfigureMCPair(RF_ShutdownList_t ** listp, RF_Raid_t *raidPtr, RF_Config_t *cfgPtr); +RF_MCPair_t *rf_AllocMCPair(RF_Raid_t *); +void rf_FreeMCPair(RF_Raid_t *raidPtr, RF_MCPair_t * t); void rf_MCPairWakeupFunc(RF_MCPair_t * t); #endif /* !_RF__RF_MCPAIR_H_ */ Index: src/sys/dev/raidframe/rf_revent.h diff -u src/sys/dev/raidframe/rf_revent.h:1.10 src/sys/dev/raidframe/rf_revent.h:1.11 --- src/sys/dev/raidframe/rf_revent.h:1.10 Sun Dec 11 12:23:37 2005 +++ src/sys/dev/raidframe/rf_revent.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_revent.h,v 1.10 2005/12/11 12:23:37 christos Exp $ */ +/* $NetBSD: rf_revent.h,v 1.11 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -37,10 +37,10 @@ #include <dev/raidframe/raidframevar.h> -int rf_ConfigureReconEvent(RF_ShutdownList_t **); +int rf_ConfigureReconEvent(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); RF_ReconEvent_t *rf_GetNextReconEvent(RF_RaidReconDesc_t *); void rf_CauseReconEvent(RF_Raid_t *, RF_RowCol_t, void *, RF_Revent_t); void rf_DrainReconEventQueue(RF_RaidReconDesc_t *r); -void rf_FreeReconEventDesc(RF_ReconEvent_t *); +void rf_FreeReconEventDesc(RF_Raid_t *,RF_ReconEvent_t *); #endif /* !_RF__RF_REVENT_H_ */ Index: src/sys/dev/raidframe/rf_netbsdkintf.c diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.394 src/sys/dev/raidframe/rf_netbsdkintf.c:1.395 --- src/sys/dev/raidframe/rf_netbsdkintf.c:1.394 Wed May 26 06:11:50 2021 +++ src/sys/dev/raidframe/rf_netbsdkintf.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_netbsdkintf.c,v 1.394 2021/05/26 06:11:50 mrg Exp $ */ +/* $NetBSD: rf_netbsdkintf.c,v 1.395 2021/07/23 00:54:45 oster Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc. @@ -101,7 +101,7 @@ ***********************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.394 2021/05/26 06:11:50 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.395 2021/07/23 00:54:45 oster Exp $"); #ifdef _KERNEL_OPT #include "opt_raid_autoconfig.h" @@ -331,7 +331,7 @@ int raidautoconfig = 0; #endif static bool raidautoconfigdone = false; -struct RF_Pools_s rf_pools; +struct pool rf_alloclist_pool; /* AllocList */ static LIST_HEAD(, raid_softc) raids = LIST_HEAD_INITIALIZER(raids); static kmutex_t raid_lock; @@ -3558,15 +3558,19 @@ rf_auto_config_set(RF_ConfigSet_t *cset) } void -rf_pool_init(struct pool *p, size_t size, const char *w_chan, +rf_pool_init(RF_Raid_t *raidPtr, char *w_chan, struct pool *p, size_t size, const char *pool_name, size_t xmin, size_t xmax) { + /* Format: raid%d_foo */ + snprintf(w_chan, RF_MAX_POOLNAMELEN, "raid%d_%s", raidPtr->raidid, pool_name); + pool_init(p, size, 0, 0, 0, w_chan, NULL, IPL_BIO); pool_sethiwat(p, xmax); pool_prime(p, xmin); } + /* * rf_buf_queue_check(RF_Raid_t raidPtr) -- looks into the buffer queue * to see if there is IO pending and if that IO could possibly be done Index: src/sys/dev/raidframe/rf_paritylogDiskMgr.c diff -u src/sys/dev/raidframe/rf_paritylogDiskMgr.c:1.30 src/sys/dev/raidframe/rf_paritylogDiskMgr.c:1.31 --- src/sys/dev/raidframe/rf_paritylogDiskMgr.c:1.30 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_paritylogDiskMgr.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_paritylogDiskMgr.c,v 1.30 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_paritylogDiskMgr.c,v 1.31 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_paritylogDiskMgr.c,v 1.30 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_paritylogDiskMgr.c,v 1.31 2021/07/23 00:54:45 oster Exp $"); #include "rf_archs.h" @@ -134,7 +134,7 @@ ReadRegionLog( RF_IO_NORMAL_PRIORITY); /* create and initialize PDA for the core log */ - *rrd_pda = rf_AllocPDAList(1); + *rrd_pda = rf_AllocPDAList(raidPtr, 1); rf_MapLogParityLogging(raidPtr, regionID, 0, &((*rrd_pda)->col), &((*rrd_pda)->startSector)); (*rrd_pda)->numSector = raidPtr->regionInfo[regionID].capacity; @@ -184,7 +184,7 @@ WriteCoreLog( rf_DiskWriteFunc, rf_DiskWriteUndoFunc, "Wcl", *fwr_alloclist, RF_DAG_FLAGS_NONE, RF_IO_NORMAL_PRIORITY); - *fwr_pda = rf_AllocPDAList(1); + *fwr_pda = rf_AllocPDAList(raidPtr, 1); regionOffset = log->diskOffset; rf_MapLogParityLogging(raidPtr, regionID, regionOffset, &((*fwr_pda)->col), @@ -232,7 +232,7 @@ ReadRegionParity( RF_IO_NORMAL_PRIORITY); /* create and initialize PDA for region parity */ - *prd_pda = rf_AllocPDAList(1); + *prd_pda = rf_AllocPDAList(raidPtr, 1); rf_MapRegionParity(raidPtr, regionID, &((*prd_pda)->col), &((*prd_pda)->startSector), &((*prd_pda)->numSector)); @@ -287,7 +287,7 @@ WriteRegionParity( RF_IO_NORMAL_PRIORITY); /* create and initialize PDA for region parity */ - *pwr_pda = rf_AllocPDAList(1); + *pwr_pda = rf_AllocPDAList(raidPtr, 1); rf_MapRegionParity(raidPtr, regionID, &((*pwr_pda)->col), &((*pwr_pda)->startSector), &((*pwr_pda)->numSector)); @@ -327,7 +327,7 @@ FlushLogsToDisk( RF_AllocListElem_t *fwr_alloclist; RF_PhysDiskAddr_t *fwr_pda; - fwr_mcpair = rf_AllocMCPair(); + fwr_mcpair = rf_AllocMCPair(raidPtr); RF_LOCK_MCPAIR(fwr_mcpair); RF_ASSERT(logList); @@ -350,14 +350,14 @@ FlushLogsToDisk( RF_ASSERT(0); } /* RF_Free(fwr_pda, sizeof(RF_PhysDiskAddr_t)); */ - rf_FreePhysDiskAddr(fwr_pda); + rf_FreePhysDiskAddr(raidPtr, fwr_pda); rf_FreeDAG(fwr_dag_h); rf_FreeAllocList(fwr_alloclist); log = log->next; } RF_UNLOCK_MCPAIR(fwr_mcpair); - rf_FreeMCPair(fwr_mcpair); + rf_FreeMCPair(raidPtr, fwr_mcpair); rf_ReleaseParityLogs(raidPtr, logList); } @@ -391,7 +391,7 @@ ReintegrateRegion( if (rf_parityLogDebug) printf("[initiating read of parity for region %d]\n",regionID); parityBuffer = AcquireReintBuffer(&raidPtr->parityBufferPool); - prd_mcpair = rf_AllocMCPair(); + prd_mcpair = rf_AllocMCPair(raidPtr); RF_LOCK_MCPAIR(prd_mcpair); prd_mcpair->flag = RF_FALSE; ReadRegionParity(regionID, prd_mcpair, parityBuffer, raidPtr, @@ -403,7 +403,7 @@ ReintegrateRegion( printf("[initiating read of disk log for region %d]\n", regionID); regionBuffer = AcquireReintBuffer(&raidPtr->regionBufferPool); - rrd_mcpair = rf_AllocMCPair(); + rrd_mcpair = rf_AllocMCPair(raidPtr); RF_LOCK_MCPAIR(rrd_mcpair); rrd_mcpair->flag = RF_FALSE; ReadRegionLog(regionID, rrd_mcpair, regionBuffer, raidPtr, @@ -436,17 +436,17 @@ ReintegrateRegion( /* ApplyRegionToParity(regionID, regionBuffer, parityBuffer); */ /* release resources associated with region log */ /* RF_Free(rrd_pda, sizeof(RF_PhysDiskAddr_t)); */ - rf_FreePhysDiskAddr(rrd_pda); + rf_FreePhysDiskAddr(raidPtr, rrd_pda); rf_FreeDAG(rrd_dag_h); rf_FreeAllocList(rrd_alloclist); - rf_FreeMCPair(rrd_mcpair); + rf_FreeMCPair(raidPtr, rrd_mcpair); ReleaseReintBuffer(&raidPtr->regionBufferPool, regionBuffer); } /* write reintegrated parity to disk */ if (rf_parityLogDebug) printf("[initiating write of parity for region %d]\n", regionID); - pwr_mcpair = rf_AllocMCPair(); + pwr_mcpair = rf_AllocMCPair(raidPtr); RF_LOCK_MCPAIR(pwr_mcpair); pwr_mcpair->flag = RF_FALSE; WriteRegionParity(regionID, pwr_mcpair, parityBuffer, raidPtr, @@ -461,18 +461,18 @@ ReintegrateRegion( } /* release resources associated with read of old parity */ /* RF_Free(prd_pda, sizeof(RF_PhysDiskAddr_t)); */ - rf_FreePhysDiskAddr(prd_pda); + rf_FreePhysDiskAddr(raidPtr, prd_pda); rf_FreeDAG(prd_dag_h); rf_FreeAllocList(prd_alloclist); - rf_FreeMCPair(prd_mcpair); + rf_FreeMCPair(raidPtr, prd_mcpair); /* release resources associated with write of new parity */ ReleaseReintBuffer(&raidPtr->parityBufferPool, parityBuffer); /* RF_Free(pwr_pda, sizeof(RF_PhysDiskAddr_t)); */ - rf_FreePhysDiskAddr(pwr_pda); + rf_FreePhysDiskAddr(raidPtr, pwr_pda); rf_FreeDAG(pwr_dag_h); rf_FreeAllocList(pwr_alloclist); - rf_FreeMCPair(pwr_mcpair); + rf_FreeMCPair(raidPtr, pwr_mcpair); if (rf_parityLogDebug) printf("[finished reintegrating region %d]\n", regionID); Index: src/sys/dev/raidframe/rf_psstatus.c diff -u src/sys/dev/raidframe/rf_psstatus.c:1.37 src/sys/dev/raidframe/rf_psstatus.c:1.38 --- src/sys/dev/raidframe/rf_psstatus.c:1.37 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_psstatus.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_psstatus.c,v 1.37 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_psstatus.c,v 1.38 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -37,7 +37,7 @@ *****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_psstatus.c,v 1.37 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_psstatus.c,v 1.38 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -69,17 +69,21 @@ static void rf_ShutdownPSStatus(void *); static void rf_ShutdownPSStatus(void *arg) { + RF_Raid_t *raidPtr; - pool_destroy(&rf_pools.pss); + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.pss); } int -rf_ConfigurePSStatus(RF_ShutdownList_t **listp) +rf_ConfigurePSStatus(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.pss, sizeof(RF_ReconParityStripeStatus_t), - "raidpsspl", RF_MIN_FREE_PSS, RF_MAX_FREE_PSS); - rf_ShutdownCreate(listp, rf_ShutdownPSStatus, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.pss, &raidPtr->pools.pss, sizeof(RF_ReconParityStripeStatus_t), + "pss", RF_MIN_FREE_PSS, RF_MAX_FREE_PSS); + rf_ShutdownCreate(listp, rf_ShutdownPSStatus, raidPtr); return (0); } @@ -257,7 +261,7 @@ rf_RemoveFromActiveReconTable(RF_Raid_t Dprintf1("Waking up access waiting on parity stripe ID %ld\n", p->parityStripeID); cb1 = cb->next; (cb->callbackFunc) (cb->callbackArg); - rf_FreeCallbackFuncDesc(cb); + rf_FreeCallbackFuncDesc(raidPtr, cb); cb = cb1; } @@ -267,7 +271,7 @@ rf_RemoveFromActiveReconTable(RF_Raid_t RF_ReconParityStripeStatus_t * rf_AllocPSStatus(RF_Raid_t *raidPtr) { - return pool_get(&rf_pools.pss, PR_WAITOK | PR_ZERO); + return pool_get(&raidPtr->pools.pss, PR_WAITOK | PR_ZERO); } void @@ -277,7 +281,7 @@ rf_FreePSStatus(RF_Raid_t *raidPtr, RF_R RF_ASSERT(p->blockWaitList == NULL); RF_ASSERT(p->bufWaitList == NULL); - pool_put(&rf_pools.pss, p); + pool_put(&raidPtr->pools.pss, p); } static void Index: src/sys/dev/raidframe/rf_raid1.c diff -u src/sys/dev/raidframe/rf_raid1.c:1.37 src/sys/dev/raidframe/rf_raid1.c:1.38 --- src/sys/dev/raidframe/rf_raid1.c:1.37 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_raid1.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_raid1.c,v 1.37 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_raid1.c,v 1.38 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ *****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_raid1.c,v 1.37 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_raid1.c,v 1.38 2021/07/23 00:54:45 oster Exp $"); #include "rf_raid.h" #include "rf_raid1.h" @@ -286,7 +286,7 @@ rf_VerifyParityRAID1(RF_Raid_t *raidPtr, rf_MakeAllocList(allocList); if (allocList == NULL) return (RF_PARITY_COULD_NOT_VERIFY); - mcpair = rf_AllocMCPair(); + mcpair = rf_AllocMCPair(raidPtr); if (mcpair == NULL) goto done; RF_ASSERT(layoutPtr->numDataCol == layoutPtr->numParityCol); @@ -522,13 +522,13 @@ done: * so cleanup what we have to and return our running status. */ if (asm_h) - rf_FreeAccessStripeMap(asm_h); + rf_FreeAccessStripeMap(raidPtr, asm_h); if (rd_dag_h) rf_FreeDAG(rd_dag_h); if (wr_dag_h) rf_FreeDAG(wr_dag_h); if (mcpair) - rf_FreeMCPair(mcpair); + rf_FreeMCPair(raidPtr, mcpair); rf_FreeAllocList(allocList); #if RF_DEBUG_VERIFYPARITY if (rf_verifyParityDebug) { @@ -646,7 +646,7 @@ rf_SubmitReconBufferRAID1(RF_ReconBuffer RF_PANIC(); } pssPtr->flags |= RF_PSS_BUFFERWAIT; - cb = rf_AllocCallbackValueDesc(); + cb = rf_AllocCallbackValueDesc(raidPtr); cb->col = rbuf->col; cb->v = rbuf->parityStripeID; cb->next = NULL; Index: src/sys/dev/raidframe/rf_reconutil.c diff -u src/sys/dev/raidframe/rf_reconutil.c:1.37 src/sys/dev/raidframe/rf_reconutil.c:1.38 --- src/sys/dev/raidframe/rf_reconutil.c:1.37 Sat Feb 9 03:34:00 2019 +++ src/sys/dev/raidframe/rf_reconutil.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_reconutil.c,v 1.37 2019/02/09 03:34:00 christos Exp $ */ +/* $NetBSD: rf_reconutil.c,v 1.38 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -31,7 +31,7 @@ ********************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_reconutil.c,v 1.37 2019/02/09 03:34:00 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_reconutil.c,v 1.38 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -231,7 +231,7 @@ rf_MakeReconBuffer(RF_Raid_t *raidPtr, R RF_ReconBuffer_t *t; u_int recon_buffer_size = rf_RaidAddressToByte(raidPtr, layoutPtr->SUsPerRU * layoutPtr->sectorsPerStripeUnit); - t = pool_get(&rf_pools.reconbuffer, PR_WAITOK); + t = pool_get(&raidPtr->pools.reconbuffer, PR_WAITOK); t->buffer = RF_Malloc(recon_buffer_size); t->raidPtr = raidPtr; t->col = col; @@ -253,7 +253,7 @@ rf_FreeReconBuffer(RF_ReconBuffer_t *rbu recon_buffer_size = rf_RaidAddressToByte(raidPtr, raidPtr->Layout.SUsPerRU * raidPtr->Layout.sectorsPerStripeUnit); RF_Free(rbuf->buffer, recon_buffer_size); - pool_put(&rf_pools.reconbuffer, rbuf); + pool_put(&raidPtr->pools.reconbuffer, rbuf); } #if RF_DEBUG_RECON Index: src/sys/dev/raidframe/rf_psstatus.h diff -u src/sys/dev/raidframe/rf_psstatus.h:1.15 src/sys/dev/raidframe/rf_psstatus.h:1.16 --- src/sys/dev/raidframe/rf_psstatus.h:1.15 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_psstatus.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_psstatus.h,v 1.15 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_psstatus.h,v 1.16 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -122,7 +122,7 @@ struct RF_PSStatusHeader_s { #define RF_PSS_BUFFERWAIT 0x00000020 /* someone is waiting for a * buffer for this RU */ -int rf_ConfigurePSStatus(RF_ShutdownList_t **); +int rf_ConfigurePSStatus(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); void rf_InitPSStatus(RF_Raid_t *); RF_PSStatusHeader_t *rf_MakeParityStripeStatusTable(RF_Raid_t *); void rf_FreeParityStripeStatusTable(RF_Raid_t *, RF_PSStatusHeader_t *); Index: src/sys/dev/raidframe/rf_raid.h diff -u src/sys/dev/raidframe/rf_raid.h:1.48 src/sys/dev/raidframe/rf_raid.h:1.49 --- src/sys/dev/raidframe/rf_raid.h:1.48 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_raid.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_raid.h,v 1.48 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_raid.h,v 1.49 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -304,6 +304,8 @@ struct RF_Raid_s { #endif /* RF_INCLUDE_PARITYLOGGING > 0 */ struct rf_paritymap *parity_map; + struct RF_Pools_s pools; + struct RF_PoolNames_s poolNames; }; struct raid_softc { Index: src/sys/dev/raidframe/rf_reconstruct.c diff -u src/sys/dev/raidframe/rf_reconstruct.c:1.125 src/sys/dev/raidframe/rf_reconstruct.c:1.126 --- src/sys/dev/raidframe/rf_reconstruct.c:1.125 Mon Feb 15 23:27:03 2021 +++ src/sys/dev/raidframe/rf_reconstruct.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_reconstruct.c,v 1.125 2021/02/15 23:27:03 oster Exp $ */ +/* $NetBSD: rf_reconstruct.c,v 1.126 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -33,7 +33,7 @@ ************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.125 2021/02/15 23:27:03 oster Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.126 2021/07/23 00:54:45 oster Exp $"); #include <sys/param.h> #include <sys/time.h> @@ -145,18 +145,23 @@ struct RF_ReconDoneProc_s { * **************************************************************************/ static void -rf_ShutdownReconstruction(void *ignored) +rf_ShutdownReconstruction(void *arg) { - pool_destroy(&rf_pools.reconbuffer); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.reconbuffer); } int -rf_ConfigureReconstruction(RF_ShutdownList_t **listp) +rf_ConfigureReconstruction(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { - rf_pool_init(&rf_pools.reconbuffer, sizeof(RF_ReconBuffer_t), - "rf_reconbuffer_pl", RF_MIN_FREE_RECONBUFFER, RF_MAX_FREE_RECONBUFFER); - rf_ShutdownCreate(listp, rf_ShutdownReconstruction, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.reconbuffer, &raidPtr->pools.reconbuffer, sizeof(RF_ReconBuffer_t), + "reconbuf", RF_MIN_FREE_RECONBUFFER, RF_MAX_FREE_RECONBUFFER); + rf_ShutdownCreate(listp, rf_ShutdownReconstruction, raidPtr); return (0); } @@ -1138,7 +1143,7 @@ ProcessReconEvent(RF_Raid_t *raidPtr, RF default: RF_PANIC(); } - rf_FreeReconEventDesc(event); + rf_FreeReconEventDesc(raidPtr, event); return (retcode); } /***************************************************************************** @@ -1611,7 +1616,7 @@ CheckForNewMinHeadSep(RF_Raid_t *raidPtr reconCtrlPtr->headSepCBList = p->next; p->next = NULL; rf_CauseReconEvent(raidPtr, p->col, NULL, RF_REVENT_HEADSEPCLEAR); - rf_FreeCallbackValueDesc(p); + rf_FreeCallbackValueDesc(raidPtr, p); } } @@ -1662,7 +1667,7 @@ CheckHeadSeparation(RF_Raid_t *raidPtr, raidPtr->raidid, col, ctrl->headSepCounter, reconCtrlPtr->minHeadSepCounter, raidPtr->headSepLimit); - cb = rf_AllocCallbackValueDesc(); + cb = rf_AllocCallbackValueDesc(raidPtr); /* the minHeadSepCounter value we have to get to before we'll * wake up. build in 20% hysteresis. */ cb->v = (ctrl->headSepCounter - raidPtr->headSepLimit + raidPtr->headSepLimit / 5); @@ -1718,9 +1723,9 @@ CheckForcedOrBlockedReconstruction(RF_Ra else if (pssPtr->flags & RF_PSS_RECON_BLOCKED) { Dprintf3("RECON: col %d blocked at psid %ld ru %d\n", col, psid, which_ru); - cb = rf_AllocCallbackValueDesc(); /* append ourselves to - * the blockage-wait - * list */ + cb = rf_AllocCallbackValueDesc(raidPtr); /* append ourselves to + * the blockage-wait + * list */ cb->col = col; cb->next = pssPtr->blockWaitList; pssPtr->blockWaitList = cb; @@ -1838,7 +1843,7 @@ rf_ForceOrBlockRecon(RF_Raid_t *raidPtr, } /* install a callback descriptor to be invoked when recon completes on * this parity stripe. */ - cb = rf_AllocCallbackFuncDesc(); + cb = rf_AllocCallbackFuncDesc(raidPtr); cb->callbackFunc = cbFunc; cb->callbackArg = cbArg; cb->next = pssPtr->procWaitList; @@ -1917,7 +1922,7 @@ rf_UnblockRecon(RF_Raid_t *raidPtr, RF_A pssPtr->blockWaitList = cb->next; cb->next = NULL; rf_CauseReconEvent(raidPtr, cb->col, NULL, RF_REVENT_BLOCKCLEAR); - rf_FreeCallbackValueDesc(cb); + rf_FreeCallbackValueDesc(raidPtr, cb); } if (!(pssPtr->flags & RF_PSS_UNDER_RECON)) { /* if no recon was requested while recon was blocked */ @@ -1948,7 +1953,7 @@ rf_WakeupHeadSepCBWaiters(RF_Raid_t *rai raidPtr->reconControl->headSepCBList = p->next; p->next = NULL; rf_CauseReconEvent(raidPtr, p->col, NULL, RF_REVENT_HEADSEPCLEAR); - rf_FreeCallbackValueDesc(p); + rf_FreeCallbackValueDesc(raidPtr, p); } rf_lock_mutex2(raidPtr->reconControl->rb_mutex); raidPtr->reconControl->rb_lock = 0; Index: src/sys/dev/raidframe/rf_states.c diff -u src/sys/dev/raidframe/rf_states.c:1.51 src/sys/dev/raidframe/rf_states.c:1.52 --- src/sys/dev/raidframe/rf_states.c:1.51 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_states.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_states.c,v 1.51 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_states.c,v 1.52 2021/07/23 00:54:45 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.51 2019/10/10 03:43:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_states.c,v 1.52 2021/07/23 00:54:45 oster Exp $"); #include <sys/errno.h> @@ -306,7 +306,7 @@ rf_State_Quiesce(RF_RaidAccessDesc_t *de if (need_cb) { /* create a callback if we might need it... and we likely do. */ - cb = rf_AllocCallbackFuncDesc(); + cb = rf_AllocCallbackFuncDesc(raidPtr); } rf_lock_mutex2(raidPtr->access_suspend_mutex); @@ -321,7 +321,7 @@ rf_State_Quiesce(RF_RaidAccessDesc_t *de rf_unlock_mutex2(raidPtr->access_suspend_mutex); if ((need_cb == 1) && (used_cb == 0)) { - rf_FreeCallbackFuncDesc(cb); + rf_FreeCallbackFuncDesc(raidPtr, cb); } #if RF_ACC_TRACE > 0 @@ -395,7 +395,7 @@ rf_State_Lock(RF_RaidAccessDesc_t *desc) RF_INIT_LOCK_REQ_DESC(asm_p->lockReqDesc, desc->type, rf_ContinueRaidAccess, desc, asm_p, raidPtr->Layout.dataSectorsPerStripe); - if (rf_AcquireStripeLock(raidPtr->lockTable, asm_p->stripeID, + if (rf_AcquireStripeLock(raidPtr, raidPtr->lockTable, asm_p->stripeID, &asm_p->lockReqDesc)) { suspended = RF_TRUE; break; @@ -617,7 +617,7 @@ rf_State_ProcessDAG(RF_RaidAccessDesc_t rf_FreeDAG(dagList->dags); temp = dagList; dagList = dagList->next; - rf_FreeDAGList(temp); + rf_FreeDAGList(raidPtr, temp); } desc->dagList = NULL; @@ -709,7 +709,8 @@ rf_State_Cleanup(RF_RaidAccessDesc_t *de asm_p->parityInfo && !(desc->flags & RF_DAG_SUPPRESS_LOCKS)) { RF_ASSERT_VALID_LOCKREQ(&asm_p->lockReqDesc); - rf_ReleaseStripeLock(raidPtr->lockTable, + rf_ReleaseStripeLock(raidPtr, + raidPtr->lockTable, asm_p->stripeID, &asm_p->lockReqDesc); } @@ -724,7 +725,7 @@ rf_State_Cleanup(RF_RaidAccessDesc_t *de RF_ETIMER_START(timer); #endif - rf_FreeAccessStripeMap(asmh); + rf_FreeAccessStripeMap(raidPtr, asmh); #if RF_ACC_TRACE > 0 RF_ETIMER_STOP(timer); RF_ETIMER_EVAL(timer); Index: src/sys/dev/raidframe/rf_stripelocks.c diff -u src/sys/dev/raidframe/rf_stripelocks.c:1.34 src/sys/dev/raidframe/rf_stripelocks.c:1.35 --- src/sys/dev/raidframe/rf_stripelocks.c:1.34 Thu Jul 11 03:49:51 2019 +++ src/sys/dev/raidframe/rf_stripelocks.c Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_stripelocks.c,v 1.34 2019/07/11 03:49:51 msaitoh Exp $ */ +/* $NetBSD: rf_stripelocks.c,v 1.35 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_stripelocks.c,v 1.34 2019/07/11 03:49:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_stripelocks.c,v 1.35 2021/07/23 00:54:45 oster Exp $"); #include <dev/raidframe/raidframevar.h> @@ -99,8 +99,8 @@ __KERNEL_RCSID(0, "$NetBSD: rf_stripeloc static void AddToWaitersQueue(RF_StripeLockDesc_t * lockDesc, RF_LockReqDesc_t * lockReqDesc); -static RF_StripeLockDesc_t *AllocStripeLockDesc(RF_StripeNum_t stripeID); -static void FreeStripeLockDesc(RF_StripeLockDesc_t * p); +static RF_StripeLockDesc_t *AllocStripeLockDesc(RF_Raid_t *raidPtr, RF_StripeNum_t stripeID); +static void FreeStripeLockDesc(RF_Raid_t *raidPtr, RF_StripeLockDesc_t * p); static RF_LockTableEntry_t *rf_MakeLockTable(void); #if RF_DEBUG_STRIPELOCK static void PrintLockedStripes(RF_LockTableEntry_t * lockTable); @@ -158,19 +158,24 @@ static void rf_ShutdownStripeLockFreeLis static void rf_RaidShutdownStripeLocks(void *); static void -rf_ShutdownStripeLockFreeList(void *ignored) +rf_ShutdownStripeLockFreeList(void *arg) { - pool_destroy(&rf_pools.stripelock); + RF_Raid_t *raidPtr; + + raidPtr = (RF_Raid_t *) arg; + + pool_destroy(&raidPtr->pools.stripelock); } int -rf_ConfigureStripeLockFreeList(RF_ShutdownList_t **listp) +rf_ConfigureStripeLockFreeList(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr, + RF_Config_t *cfgPtr) { unsigned mask; - rf_pool_init(&rf_pools.stripelock, sizeof(RF_StripeLockDesc_t), - "rf_stripelock_pl", RF_MIN_FREE_STRIPELOCK, RF_MAX_FREE_STRIPELOCK); - rf_ShutdownCreate(listp, rf_ShutdownStripeLockFreeList, NULL); + rf_pool_init(raidPtr, raidPtr->poolNames.stripelock, &raidPtr->pools.stripelock, sizeof(RF_StripeLockDesc_t), + "strplock", RF_MIN_FREE_STRIPELOCK, RF_MAX_FREE_STRIPELOCK); + rf_ShutdownCreate(listp, rf_ShutdownStripeLockFreeList, raidPtr); for (mask = 0x1; mask; mask <<= 1) if (rf_lockTableSize == mask) @@ -245,7 +250,7 @@ rf_ConfigureStripeLocks(RF_ShutdownList_ * *releaseTag that you need to give back to us when you release the * lock. */ int -rf_AcquireStripeLock(RF_LockTableEntry_t *lockTable, RF_StripeNum_t stripeID, +rf_AcquireStripeLock(RF_Raid_t *raidPtr, RF_LockTableEntry_t *lockTable, RF_StripeNum_t stripeID, RF_LockReqDesc_t *lockReqDesc) { RF_StripeLockDesc_t *lockDesc; @@ -275,7 +280,7 @@ rf_AcquireStripeLock(RF_LockTableEntry_t if (stripeID == -1) return (0); lockReqDesc->next = NULL; /* just to be sure */ - newlockDesc = AllocStripeLockDesc(stripeID); + newlockDesc = AllocStripeLockDesc(raidPtr, stripeID); rf_lock_mutex2(lockTable[hashval].mutex); for (lockDesc = lockTable[hashval].descList; lockDesc; @@ -301,7 +306,7 @@ rf_AcquireStripeLock(RF_LockTableEntry_t #endif } else { /* we won't be needing newlockDesc after all.. pity.. */ - FreeStripeLockDesc(newlockDesc); + FreeStripeLockDesc(raidPtr, newlockDesc); if (lockReqDesc->type == RF_IO_TYPE_WRITE) lockDesc->nWriters++; @@ -368,7 +373,7 @@ rf_AcquireStripeLock(RF_LockTableEntry_t } void -rf_ReleaseStripeLock(RF_LockTableEntry_t *lockTable, RF_StripeNum_t stripeID, +rf_ReleaseStripeLock(RF_Raid_t *raidPtr, RF_LockTableEntry_t *lockTable, RF_StripeNum_t stripeID, RF_LockReqDesc_t *lockReqDesc) { RF_StripeLockDesc_t *lockDesc, *ld_t; @@ -606,7 +611,7 @@ rf_ReleaseStripeLock(RF_LockTableEntry_t RF_ASSERT(lockDesc == lockTable[hashval].descList); lockTable[hashval].descList = lockDesc->next; } - FreeStripeLockDesc(lockDesc); + FreeStripeLockDesc(raidPtr, lockDesc); lockDesc = NULL;/* only for the ASSERT below */ } rf_unlock_mutex2(lockTable[hashval].mutex); @@ -637,11 +642,11 @@ AddToWaitersQueue(RF_StripeLockDesc_t *l } static RF_StripeLockDesc_t * -AllocStripeLockDesc(RF_StripeNum_t stripeID) +AllocStripeLockDesc(RF_Raid_t *raidPtr, RF_StripeNum_t stripeID) { RF_StripeLockDesc_t *p; - p = pool_get(&rf_pools.stripelock, PR_WAITOK); + p = pool_get(&raidPtr->pools.stripelock, PR_WAITOK); if (p) { p->stripeID = stripeID; p->granted = NULL; @@ -654,9 +659,9 @@ AllocStripeLockDesc(RF_StripeNum_t strip } static void -FreeStripeLockDesc(RF_StripeLockDesc_t *p) +FreeStripeLockDesc(RF_Raid_t *raidPtr, RF_StripeLockDesc_t *p) { - pool_put(&rf_pools.stripelock, p); + pool_put(&raidPtr->pools.stripelock, p); } #if RF_DEBUG_STRIPELOCK Index: src/sys/dev/raidframe/rf_stripelocks.h diff -u src/sys/dev/raidframe/rf_stripelocks.h:1.9 src/sys/dev/raidframe/rf_stripelocks.h:1.10 --- src/sys/dev/raidframe/rf_stripelocks.h:1.9 Thu Oct 10 03:43:59 2019 +++ src/sys/dev/raidframe/rf_stripelocks.h Fri Jul 23 00:54:45 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rf_stripelocks.h,v 1.9 2019/10/10 03:43:59 christos Exp $ */ +/* $NetBSD: rf_stripelocks.h,v 1.10 2021/07/23 00:54:45 oster Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. @@ -104,9 +104,9 @@ struct RF_LockTableEntry_s { (_lrd).cbArg = (void *) (_cba); \ } -int rf_ConfigureStripeLockFreeList(RF_ShutdownList_t **); -int rf_ConfigureStripeLocks(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); -int rf_AcquireStripeLock(RF_LockTableEntry_t *, RF_StripeNum_t, RF_LockReqDesc_t *); -void rf_ReleaseStripeLock(RF_LockTableEntry_t *, RF_StripeNum_t, RF_LockReqDesc_t *); +int rf_ConfigureStripeLockFreeList(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); +int rf_ConfigureStripeLocks(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *); +int rf_AcquireStripeLock(RF_Raid_t *, RF_LockTableEntry_t *, RF_StripeNum_t, RF_LockReqDesc_t *); +void rf_ReleaseStripeLock(RF_Raid_t *, RF_LockTableEntry_t *, RF_StripeNum_t, RF_LockReqDesc_t *); #endif /* !_RF__RF_STRIPELOCKS_H_ */