Module Name: src
Committed By: ad
Date: Mon May 18 21:12:33 UTC 2009
Modified Files:
src/sys/kern: kern_physio.c
Log Message:
- Remove unneded uvm_lwp_hold(), uvm_lwp_rele().
- Make physio_concurrency tuneable via crash(8).
- Update comments.
To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/sys/kern/kern_physio.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_physio.c
diff -u src/sys/kern/kern_physio.c:1.89 src/sys/kern/kern_physio.c:1.90
--- src/sys/kern/kern_physio.c:1.89 Sun Nov 9 12:18:07 2008
+++ src/sys/kern/kern_physio.c Mon May 18 21:12:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_physio.c,v 1.89 2008/11/09 12:18:07 bouyer Exp $ */
+/* $NetBSD: kern_physio.c,v 1.90 2009/05/18 21:12:33 ad Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_physio.c,v 1.89 2008/11/09 12:18:07 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_physio.c,v 1.90 2009/05/18 21:12:33 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -86,12 +86,7 @@
ONCE_DECL(physio_initialized);
struct workqueue *physio_workqueue;
-/*
- * The routines implemented in this file are described in:
- * Leffler, et al.: The Design and Implementation of the 4.3BSD
- * UNIX Operating System (Addison Welley, 1989)
- * on pages 231-233.
- */
+int physio_concurrency = 16;
/* #define PHYSIO_DEBUG */
#if defined(PHYSIO_DEBUG)
@@ -208,13 +203,9 @@
return error;
}
-#define PHYSIO_CONCURRENCY 16 /* XXX tune */
-
/*
* Do "physical I/O" on behalf of a user. "Physical I/O" is I/O directly
* from the raw device to user buffers, and bypasses the buffer cache.
- *
- * Comments in brackets are from Leffler, et al.'s pseudo-code implementation.
*/
int
physio(void (*strategy)(struct buf *), struct buf *obp, dev_t dev, int flags,
@@ -226,7 +217,7 @@
int i, error;
struct buf *bp = NULL;
struct physio_stat *ps;
- int concurrency = PHYSIO_CONCURRENCY - 1;
+ int concurrency = physio_concurrency - 1;
error = RUN_ONCE(&physio_initialized, physio_init);
if (__predict_false(error != 0)) {
@@ -250,7 +241,6 @@
/* Make sure we have a buffer, creating one if necessary. */
if (obp != NULL) {
- /* [raise the processor priority level to splbio;] */
mutex_enter(&bufcache_lock);
/* Mark it busy, so nobody else will use it. */
while (bbusy(obp, false, 0, NULL) == EPASSTHROUGH)
@@ -259,8 +249,6 @@
concurrency = 0; /* see "XXXkludge" comment below */
}
- uvm_lwp_hold(l);
-
for (i = 0; i < uio->uio_iovcnt; i++) {
bool sync = true;
@@ -290,18 +278,17 @@
bp->b_private = ps;
/*
- * [mark the buffer busy for physical I/O]
- * (i.e. set B_PHYS (because it's an I/O to user
- * memory, and B_RAW, because B_RAW is to be
- * "Set by physio for raw transfers.", in addition
- * to the "busy" and read/write flag.)
+ * Mrk the buffer busy for physical I/O. Also set
+ * B_PHYS because it's an I/O to user memory, and
+ * B_RAW because B_RAW is to be "set by physio for
+ * raw transfers".
*/
bp->b_oflags = 0;
bp->b_cflags = BC_BUSY;
bp->b_flags = flags | B_PHYS | B_RAW;
bp->b_iodone = physio_biodone;
- /* [set up the buffer for a maximum-sized transfer] */
+ /* Set up the buffer for a maximum-sized transfer. */
bp->b_blkno = btodb(uio->uio_offset);
if (dbtob(bp->b_blkno) != uio->uio_offset) {
error = EINVAL;
@@ -311,7 +298,7 @@
bp->b_data = iovp->iov_base;
/*
- * [call minphys to bound the transfer size]
+ * Call minphys to bound the transfer size,
* and remember the amount of data to transfer,
* for later comparison.
*/
@@ -327,18 +314,17 @@
endp = (vaddr_t)bp->b_data + todo;
if (trunc_page(endp) != endp) {
/*
- * following requests can overlap.
+ * Following requests can overlap.
* note that uvm_vslock does round_page.
*/
sync = true;
}
/*
- * [lock the part of the user address space involved
- * in the transfer]
- * Beware vmapbuf(); it clobbers b_data and
- * saves it in b_saveaddr. However, vunmapbuf()
- * restores it.
+ * Lock the part of the user address space involved
+ * in the transfer. Beware vmapbuf(); it clobbers
+ * b_data and saves it in b_saveaddr. However,
+ * vunmapbuf() restores it.
*/
error = uvm_vslock(p->p_vmspace, bp->b_data, todo,
(flags & B_READ) ? VM_PROT_WRITE : VM_PROT_READ);
@@ -353,7 +339,7 @@
ps->ps_running++;
mutex_exit(&ps->ps_lock);
- /* [call strategy to start the transfer] */
+ /* Call strategy to start the transfer. */
(*strategy)(bp);
bp = NULL;
@@ -391,16 +377,16 @@
kmem_free(ps, sizeof(*ps));
/*
- * [clean up the state of the buffer]
- * Remember if somebody wants it, so we can wake them up below.
- * Also, if we had to steal it, give it back.
+ * Clean up the state of the buffer. Remember if somebody wants
+ * it, so we can wake them up below. Also, if we had to steal it,
+ * give it back.
*/
if (obp != NULL) {
KASSERT((obp->b_cflags & BC_BUSY) != 0);
/*
- * [if another process is waiting for the raw I/O buffer,
- * wake up processes waiting to do physical I/O;
+ * If another process is waiting for the raw I/O buffer,
+ * wake up processes waiting to do physical I/O;
*/
mutex_enter(&bufcache_lock);
obp->b_cflags &= ~(BC_BUSY | BC_WANTED);
@@ -409,7 +395,6 @@
cv_broadcast(&obp->b_busy);
mutex_exit(&bufcache_lock);
}
- uvm_lwp_rele(l);
DPRINTF(("%s: done: off=%" PRIu64 ", resid=%zu\n",
__func__, uio->uio_offset, uio->uio_resid));
@@ -418,13 +403,12 @@
}
/*
- * Leffler, et al., says on p. 231:
- * "The minphys() routine is called by physio() to adjust the
- * size of each I/O transfer before the latter is passed to
- * the strategy routine..."
+ * A minphys() routine is called by physio() to adjust the size of each
+ * I/O transfer before the latter is passed to the strategy routine.
*
- * so, just adjust the buffer's count accounting to MAXPHYS here,
- * and return the new count;
+ * This minphys() is a default that must be called to enforce limits
+ * that are applicable to all devices, because of limitations in the
+ * kernel or the hardware platform.
*/
void
minphys(struct buf *bp)