summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authormartin <martin@NetBSD.org>2021-10-19 10:55:15 +0000
committermartin <martin@NetBSD.org>2021-10-19 10:55:15 +0000
commitfcfd5e0383561abd341a5eb64c51f1bf0bba305f (patch)
treed6d8a961c39bbd1e32a89ebf5b2cc0089265c5be /sys/dev/raidframe
parent31405309af6860715d03dce930fb0b7773d07b5b (diff)
Pull up following revision(s) (requested by oster in ticket #1361):
sys/dev/raidframe/rf_netbsd.h: revision 1.36 (via patch) sys/dev/raidframe/rf_diskqueue.c: revision 1.58 sys/dev/raidframe/rf_diskqueue.c: revision 1.59 remove unnnecessary splbio() in rf_FreeDiskQueueData() getiobuf() can return NULL if there are no IO buffers available. RAIDframe can't deal with that, so create a dedicated pool of buffers to use for IO. PR_WAITOK is fine here, as we pre-allocate more than we need to guarantee IO can make progress. Tuning of pool still to come.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_diskqueue.c48
-rw-r--r--sys/dev/raidframe/rf_netbsd.h3
2 files changed, 30 insertions, 21 deletions
diff --git a/sys/dev/raidframe/rf_diskqueue.c b/sys/dev/raidframe/rf_diskqueue.c
index 14e5f2b4297..5c55867762e 100644
--- a/sys/dev/raidframe/rf_diskqueue.c
+++ b/sys/dev/raidframe/rf_diskqueue.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_diskqueue.c,v 1.55 2019/02/10 17:13:33 christos Exp $ */
+/* $NetBSD: rf_diskqueue.c,v 1.55.4.1 2021/10/19 10:55:15 martin 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.55 2019/02/10 17:13:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.55.4.1 2021/10/19 10:55:15 martin Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -84,6 +84,8 @@ __KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.55 2019/02/10 17:13:33 christos E
#include "rf_fifo.h"
#include "rf_kintf.h"
+#include <sys/buf.h>
+
static void rf_ShutdownDiskQueueSystem(void *);
#ifndef RF_DEBUG_DISKQUEUE
@@ -147,10 +149,15 @@ static const RF_DiskQueueSW_t diskqueuesw[] = {
};
#define NUM_DISK_QUEUE_TYPES (sizeof(diskqueuesw)/sizeof(RF_DiskQueueSW_t))
+
#define RF_MAX_FREE_DQD 256
#define RF_MIN_FREE_DQD 64
-#include <sys/buf.h>
+/* XXX: scale these... */
+#define RF_MAX_FREE_BUFIO 256
+#define RF_MIN_FREE_BUFIO 64
+
+
/* configures a single disk queue */
@@ -189,6 +196,7 @@ static void
rf_ShutdownDiskQueueSystem(void *ignored)
{
pool_destroy(&rf_pools.dqd);
+ pool_destroy(&rf_pools.bufio);
}
int
@@ -197,6 +205,8 @@ rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **listp)
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);
return (0);
@@ -367,19 +377,20 @@ rf_CreateDiskQueueData(RF_IoType_t typ, RF_SectorNum_t ssect,
{
RF_DiskQueueData_t *p;
- p = pool_get(&rf_pools.dqd, waitflag | PR_ZERO);
- if (p == NULL)
- return (NULL);
-
- if (waitflag == PR_WAITOK) {
- p->bp = getiobuf(NULL, true);
- } else {
- p->bp = getiobuf(NULL, false);
- }
- if (p->bp == NULL) {
- pool_put(&rf_pools.dqd, p);
- return (NULL);
- }
+ p = pool_get(&rf_pools.dqd, PR_WAITOK | PR_ZERO);
+ KASSERT(p != NULL);
+
+ /* Obtain a buffer from our own pool. It is possible for the
+ regular getiobuf() to run out of memory and return NULL.
+ We need to guarantee that never happens, as RAIDframe
+ doesn't have a good way to recover if memory allocation
+ fails here.
+ */
+ p->bp = pool_get(&rf_pools.bufio, PR_WAITOK | PR_ZERO);
+ KASSERT(p->bp != NULL);
+
+ buf_init(p->bp);
+
SET(p->bp->b_cflags, BC_BUSY); /* mark buffer busy */
p->sectorOffset = ssect + rf_protectedSectors;
@@ -402,9 +413,6 @@ rf_CreateDiskQueueData(RF_IoType_t typ, RF_SectorNum_t ssect,
void
rf_FreeDiskQueueData(RF_DiskQueueData_t *p)
{
- int s;
- s = splbio(); /* XXX protect only pool_put, or neither? */
- putiobuf(p->bp);
+ pool_put(&rf_pools.bufio, p->bp);
pool_put(&rf_pools.dqd, p);
- splx(s);
}
diff --git a/sys/dev/raidframe/rf_netbsd.h b/sys/dev/raidframe/rf_netbsd.h
index 6d39672389a..d4e0f681b70 100644
--- a/sys/dev/raidframe/rf_netbsd.h
+++ b/sys/dev/raidframe/rf_netbsd.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_netbsd.h,v 1.33 2019/02/06 02:49:09 oster Exp $ */
+/* $NetBSD: rf_netbsd.h,v 1.33.4.1 2021/10/19 10:55:15 martin Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -61,6 +61,7 @@ struct RF_Pools_s {
struct pool asm_hdr; /* Access Stripe Map Header */
struct pool asmap; /* Access Stripe Map */
struct pool asmhle; /* Access Stripe Map Header List Elements */
+ struct pool bufio; /* Buffer IO Pool */
struct pool callback; /* Callback descriptors */
struct pool dagh; /* DAG headers */
struct pool dagnode; /* DAG nodes */