Module Name: src Committed By: martin Date: Tue Oct 19 10:55:15 UTC 2021
Modified Files: src/sys/dev/raidframe [netbsd-9]: rf_diskqueue.c rf_netbsd.h Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.55 -r1.55.4.1 src/sys/dev/raidframe/rf_diskqueue.c cvs rdiff -u -r1.33 -r1.33.4.1 src/sys/dev/raidframe/rf_netbsd.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_diskqueue.c diff -u src/sys/dev/raidframe/rf_diskqueue.c:1.55 src/sys/dev/raidframe/rf_diskqueue.c:1.55.4.1 --- src/sys/dev/raidframe/rf_diskqueue.c:1.55 Sun Feb 10 17:13:33 2019 +++ src/sys/dev/raidframe/rf_diskqueue.c Tue Oct 19 10:55:15 2021 @@ -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 #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 diskqueues }; #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_ShutdownL 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_DiskQueueData_t *p; - p = pool_get(&rf_pools.dqd, waitflag | PR_ZERO); - if (p == NULL) - return (NULL); + p = pool_get(&rf_pools.dqd, PR_WAITOK | PR_ZERO); + KASSERT(p != 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); - } + /* 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, 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); } Index: src/sys/dev/raidframe/rf_netbsd.h diff -u src/sys/dev/raidframe/rf_netbsd.h:1.33 src/sys/dev/raidframe/rf_netbsd.h:1.33.4.1 --- src/sys/dev/raidframe/rf_netbsd.h:1.33 Wed Feb 6 02:49:09 2019 +++ src/sys/dev/raidframe/rf_netbsd.h Tue Oct 19 10:55:15 2021 @@ -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 */