RAIDframe was erroneously re-initializing the Parity Stripe Status
pool each time a new array was configured. This causes grief with things like 'vmstat -m' by causing it to loop. Make RAIDframe only initialize PSS bits once. Pointed out by simonb@. Fix tested by simonb@. Thanks!
This commit is contained in:
parent
a4163a9fe4
commit
99bb7dc022
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: rf_driver.c,v 1.109 2005/12/11 12:23:37 christos Exp $ */
|
/* $NetBSD: rf_driver.c,v 1.110 2006/02/14 01:13:33 oster Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.109 2005/12/11 12:23:37 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.110 2006/02/14 01:13:33 oster Exp $");
|
||||||
|
|
||||||
#include "opt_raid_diagnostic.h"
|
#include "opt_raid_diagnostic.h"
|
||||||
|
|
||||||
|
@ -318,6 +318,7 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Config_t *cfgPtr, RF_AutoConfig_t *ac)
|
||||||
DO_INIT_CONFIGURE(rf_ConfigureReconstruction);
|
DO_INIT_CONFIGURE(rf_ConfigureReconstruction);
|
||||||
DO_INIT_CONFIGURE(rf_ConfigureCopyback);
|
DO_INIT_CONFIGURE(rf_ConfigureCopyback);
|
||||||
DO_INIT_CONFIGURE(rf_ConfigureDiskQueueSystem);
|
DO_INIT_CONFIGURE(rf_ConfigureDiskQueueSystem);
|
||||||
|
DO_INIT_CONFIGURE(rf_ConfigurePSStatus);
|
||||||
isconfigged = 1;
|
isconfigged = 1;
|
||||||
}
|
}
|
||||||
RF_UNLOCK_LKMGR_MUTEX(configureMutex);
|
RF_UNLOCK_LKMGR_MUTEX(configureMutex);
|
||||||
|
@ -371,7 +372,8 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Config_t *cfgPtr, RF_AutoConfig_t *ac)
|
||||||
|
|
||||||
DO_RAID_INIT_CONFIGURE(rf_ConfigureLayout);
|
DO_RAID_INIT_CONFIGURE(rf_ConfigureLayout);
|
||||||
|
|
||||||
DO_RAID_INIT_CONFIGURE(rf_ConfigurePSStatus);
|
/* Initialize per-RAID PSS bits */
|
||||||
|
rf_InitPSStatus(raidPtr);
|
||||||
|
|
||||||
#if RF_INCLUDE_CHAINDECLUSTER > 0
|
#if RF_INCLUDE_CHAINDECLUSTER > 0
|
||||||
for (col = 0; col < raidPtr->numCol; col++) {
|
for (col = 0; col < raidPtr->numCol; col++) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: rf_psstatus.c,v 1.30 2005/12/11 12:23:37 christos Exp $ */
|
/* $NetBSD: rf_psstatus.c,v 1.31 2006/02/14 01:13:33 oster Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1995 Carnegie-Mellon University.
|
* Copyright (c) 1995 Carnegie-Mellon University.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: rf_psstatus.c,v 1.30 2005/12/11 12:23:37 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: rf_psstatus.c,v 1.31 2006/02/14 01:13:33 oster Exp $");
|
||||||
|
|
||||||
#include <dev/raidframe/raidframevar.h>
|
#include <dev/raidframe/raidframevar.h>
|
||||||
|
|
||||||
|
@ -74,17 +74,23 @@ rf_ShutdownPSStatus(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rf_ConfigurePSStatus(RF_ShutdownList_t **listp, RF_Raid_t *raidPtr,
|
rf_ConfigurePSStatus(RF_ShutdownList_t **listp)
|
||||||
RF_Config_t *cfgPtr)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
raidPtr->pssTableSize = RF_PSS_DEFAULT_TABLESIZE;
|
|
||||||
rf_pool_init(&rf_pools.pss, sizeof(RF_ReconParityStripeStatus_t),
|
rf_pool_init(&rf_pools.pss, sizeof(RF_ReconParityStripeStatus_t),
|
||||||
"raidpsspl", RF_MIN_FREE_PSS, RF_MAX_FREE_PSS);
|
"raidpsspl", RF_MIN_FREE_PSS, RF_MAX_FREE_PSS);
|
||||||
rf_ShutdownCreate(listp, rf_ShutdownPSStatus, raidPtr);
|
rf_ShutdownCreate(listp, rf_ShutdownPSStatus, NULL);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rf_InitPSStatus(RF_Raid_t *raidPtr)
|
||||||
|
{
|
||||||
|
raidPtr->pssTableSize = RF_PSS_DEFAULT_TABLESIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************************
|
/*****************************************************************************************
|
||||||
* sets up the pss table
|
* sets up the pss table
|
||||||
* We pre-allocate a bunch of entries to avoid as much as possible having to
|
* We pre-allocate a bunch of entries to avoid as much as possible having to
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: rf_psstatus.h,v 1.12 2005/12/11 12:23:37 christos Exp $ */
|
/* $NetBSD: rf_psstatus.h,v 1.13 2006/02/14 01:13:33 oster Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1995 Carnegie-Mellon University.
|
* Copyright (c) 1995 Carnegie-Mellon University.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -122,7 +122,8 @@ struct RF_PSStatusHeader_s {
|
||||||
#define RF_PSS_BUFFERWAIT 0x00000020 /* someone is waiting for a
|
#define RF_PSS_BUFFERWAIT 0x00000020 /* someone is waiting for a
|
||||||
* buffer for this RU */
|
* buffer for this RU */
|
||||||
|
|
||||||
int rf_ConfigurePSStatus(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
|
int rf_ConfigurePSStatus(RF_ShutdownList_t **);
|
||||||
|
void rf_InitPSStatus(RF_Raid_t *);
|
||||||
RF_PSStatusHeader_t *rf_MakeParityStripeStatusTable(RF_Raid_t *);
|
RF_PSStatusHeader_t *rf_MakeParityStripeStatusTable(RF_Raid_t *);
|
||||||
void rf_FreeParityStripeStatusTable(RF_Raid_t *, RF_PSStatusHeader_t *);
|
void rf_FreeParityStripeStatusTable(RF_Raid_t *, RF_PSStatusHeader_t *);
|
||||||
RF_ReconParityStripeStatus_t *rf_LookupRUStatus(RF_Raid_t *, RF_PSStatusHeader_t *,
|
RF_ReconParityStripeStatus_t *rf_LookupRUStatus(RF_Raid_t *, RF_PSStatusHeader_t *,
|
||||||
|
|
Loading…
Reference in New Issue