summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1999-08-15 14:30:09 +0000
committerphk <phk@FreeBSD.org>1999-08-15 14:30:09 +0000
commitc640158ac4d9cd1441788bb9ee5fbe07c4e87924 (patch)
treef8f21c81e150bd423a52dd339242e4d223e73d30 /sys/contrib
parent4b99c12e08c41fedc53a407782700f2ee9dbf162 (diff)
downloadFreeBSD-src-c640158ac4d9cd1441788bb9ee5fbe07c4e87924.zip
FreeBSD-src-c640158ac4d9cd1441788bb9ee5fbe07c4e87924.tar.gz
SMP: Release the giant lock while we work the flash array
Use splbio() rather than fiddling the hardware interrupts. Remove the compatibility stuff for older FreeBSD versions. Add devstat support.
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/dev/fla/fla.c137
1 files changed, 40 insertions, 97 deletions
diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c
index 8de635e..23fbc46 100644
--- a/sys/contrib/dev/fla/fla.c
+++ b/sys/contrib/dev/fla/fla.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: fla.c,v 1.2 1999/08/07 13:11:12 bde Exp $
+ * $Id: fla.c,v 1.3 1999/08/14 11:40:32 phk Exp $
*
*/
@@ -19,6 +19,7 @@
#include <sys/malloc.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
+#include <sys/devicestat.h>
#include <sys/module.h>
#include <sys/conf.h>
#include <machine/bus.h>
@@ -29,35 +30,12 @@
#include <vm/pmap.h>
#include <vm/vm_param.h>
-#if __FreeBSD_version > 400000 /* XXX ? */
#include <sys/bus.h>
#include <isa/isareg.h>
#include <isa/isavar.h>
-#define dev2ul(foo) ((unsigned long)dev2udev(foo))
-#endif
-
-#if __FreeBSD_version < 400000 /* XXX ? */
-#include <i386/isa/isa_device.h>
-
-#define dev2ul(foo) ((unsigned long)foo)
-
-static int
-physread(dev_t dev, struct uio *uio, int ioflag)
-{
- return(physio(cdevsw[major(dev)]->d_strategy,
- NULL, dev, 1, minphys, uio));
-}
-
-static int
-physwrite(dev_t dev, struct uio *uio, int ioflag)
-{
- return(physio(cdevsw[major(dev)]->d_strategy,
- NULL, dev, 0, minphys, uio));
-}
-
-#define nopoll seltrue
-#define noparms NULL
+#ifdef SMP
+#include <machine/smp.h>
#endif
#include <contrib/dev/fla/msysosak.h>
@@ -98,8 +76,6 @@ static struct cdevsw fla_cdevsw = {
/* bmaj */ BDEV_MAJOR
};
-
-
void *
doc2k_malloc(int bytes)
{
@@ -143,6 +119,8 @@ static struct fla_s {
struct doc2k_stat ds;
struct diskslices *dk_slices;
struct buf_queue_head buf_queue;
+ struct devstat stats;
+ int busy;
} softc[NFLA];
static int
@@ -154,8 +132,8 @@ flaopen(dev_t dev, int flag, int fmt, struct proc *p)
struct disklabel dk_dd;
if (fla_debug)
- printf("flaopen(%lx %x %x %p)\n",
- dev2ul(dev), flag, fmt, p);
+ printf("flaopen(%x %x %x %p)\n",
+ dev2udev(dev), flag, fmt, p);
unit = dkunit(dev);
if (unit >= NFLA)
return (ENXIO);
@@ -181,8 +159,8 @@ flaclose(dev_t dev, int flags, int fmt, struct proc *p)
struct fla_s *sc;
if (fla_debug)
- printf("flaclose(%lx %x %x %p)\n",
- dev2ul(dev), flags, fmt, p);
+ printf("flaclose(%x %x %x %p)\n",
+ dev2udev(dev), flags, fmt, p);
unit = dkunit(dev);
sc = &softc[unit];
dsclose(dev, fmt, sc->dk_slices);
@@ -196,8 +174,8 @@ flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct fla_s *sc;
if (fla_debug)
- printf("flaioctl(%lx %lx %p %x %p)\n",
- dev2ul(dev), cmd, addr, flags, p);
+ printf("flaioctl(%x %lx %p %x %p)\n",
+ dev2udev(dev), cmd, addr, flags, p);
unit = dkunit(dev);
sc = &softc[unit];
error = dsioctl("fla", dev, cmd, addr, flags, &sc->dk_slices);
@@ -210,14 +188,14 @@ static void
flastrategy(struct buf *bp)
{
int unit, error;
- u_long ef;
+ int s;
struct fla_s *sc;
- static int busy;
enum doc2k_work what;
+ devstat_trans_flags dop;
if (fla_debug > 1)
- printf("flastrategy(%p) %lx %lx, %d, %ld, %p)\n",
- bp, dev2ul(bp->b_dev), bp->b_flags, bp->b_blkno,
+ printf("flastrategy(%p) %x %lx, %d, %ld, %p)\n",
+ bp, dev2udev(bp->b_dev), bp->b_flags, bp->b_blkno,
bp->b_bcount / DEV_BSIZE, bp->b_data);
unit = dkunit(bp->b_dev);
sc = &softc[unit];
@@ -227,39 +205,43 @@ flastrategy(struct buf *bp)
return;
}
- ef = read_eflags();
- disable_intr();
+ s = splbio();
bufqdisksort(&sc->buf_queue, bp);
- if (busy) {
- write_eflags(ef);
+ if (sc->busy) {
+ splx(s);
return;
}
- busy++;
+ sc->busy++;
while (1) {
bp = bufq_first(&sc->buf_queue);
if (bp)
bufq_remove(&sc->buf_queue, bp);
-
- write_eflags(ef);
+ splx(s);
if (!bp)
break;
+ devstat_start_transaction(&sc->stats);
bp->b_resid = bp->b_bcount;
unit = dkunit(bp->b_dev);
if (bp->b_flags & B_FREEBUF)
- what = DOC2K_ERASE;
+ what = DOC2K_ERASE, dop = DEVSTAT_NO_DATA;
else if (bp->b_flags & B_READ)
- what = DOC2K_READ;
+ what = DOC2K_READ, dop = DEVSTAT_READ;
else
- what = DOC2K_WRITE;
-
+ what = DOC2K_WRITE, dop = DEVSTAT_WRITE;
+#ifdef SMP
+ rel_mplock();
+#endif
error = doc2k_rwe( unit, what, bp->b_pblkno,
bp->b_bcount / DEV_BSIZE, bp->b_data);
+#ifdef SMP
+ get_mplock();
+#endif
if (fla_debug > 1 || error) {
printf("fla%d: %d = rwe(%p, %d, %d, %d, %ld, %p)\n",
@@ -273,11 +255,13 @@ flastrategy(struct buf *bp)
bp->b_resid = 0;
}
biodone(bp);
+ devstat_end_transaction(&sc->stats, bp->b_bcount,
+ DEVSTAT_TAG_NONE, dop);
+
- ef = read_eflags();
- disable_intr();
+ s = splbio();
}
- busy = 0;
+ sc->busy = 0;
return;
}
@@ -288,7 +272,7 @@ flapsize(dev_t dev)
struct fla_s *sc;
if (fla_debug)
- printf("flapsize(%lx)\n", dev2ul(dev));
+ printf("flapsize(%x)\n", dev2udev(dev));
unit = dkunit(dev);
sc = &softc[unit];
if (!sc->nsect)
@@ -357,9 +341,6 @@ flarealattach(int unit)
return (0);
}
-
-#if __FreeBSD_version > 400000 /* XXX ? */
-
static int
flaprobe (device_t dev)
{
@@ -389,6 +370,9 @@ flaattach (device_t dev)
unit = device_get_unit(dev);
i = flarealattach(unit);
+ devstat_add_entry(&softc[unit].stats, "fla", unit, DEV_BSIZE,
+ DEVSTAT_NO_ORDERED_TAGS,
+ DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, 0x190);
return (i);
}
@@ -408,44 +392,3 @@ static driver_t fladriver = {
static devclass_t fla_devclass;
DEV_DRIVER_MODULE(fla, isa, fladriver, fla_devclass, fla_cdevsw, 0, 0);
-#endif
-
-
-#if __FreeBSD_version < 400000 /* XXX ? */
-
-static int
-flaprobe (struct isa_device *dvp)
-{
- int unit;
- struct fla_s *sc;
- int i;
-
- unit = dvp->id_unit;
- sc = &softc[unit];
- i = flarealprobe(unit);
- if (i)
- return (0);
-
- dvp->id_maddr = (caddr_t)sc->ds.window;
- dvp->id_msize = 8192;
-
- cdevsw_add_generic(BDEV_MAJOR, CDEV_MAJOR, &fla_cdevsw);
- return (-1);
-}
-
-
-static int
-flaattach (struct isa_device *dvp)
-{
- int unit, i;
-
- unit = dvp->id_unit;
- i = flarealattach(unit);
- return (i);
-}
-
-struct isa_driver fladriver = {
- flaprobe, flaattach, "fla",
-};
-
-#endif
OpenPOWER on IntegriCloud