NetBSD/sys/scsi/dmabouncebufs
1993-11-24 04:52:44 +00:00

1009 lines
26 KiB
Plaintext

From agora.rain.com!rgrimes Sat Apr 24 09:38:42 1993
Received: from agora.rain.com by jules.DIALix.oz.au with UUCP (5.67/25-eef)
id AA00109; Sat, 24 Apr 93 09:29:06 +0800
Received: from uniwa.uwa.edu.au by perth.dialix.oz.au with SMTP id AA28179
(5.67a/IDA-1.5 for <julian@jules.dialix.oz.au>); Sat, 24 Apr 1993 09:04:48 +0800
Received: from agora.rain.com by uniwa.uwa.edu.au with SMTP (5.65c)
id AA23685; Sat, 24 Apr 1993 09:04:26 +0800
Received: by agora.rain.com (Smail3.1.26.7 #19)
id m0nmYf0-0001bcC; Fri, 23 Apr 93 18:04 PDT
Message-Id: <m0nmYf0-0001bcC@agora.rain.com>
From: rgrimes@agora.rain.com (Rodney Grimes)
Subject: >16MB ram experimental patch (fwd)
To: julian@jules.dialix.oz.au (Julian Elischer)
Date: Fri, 23 Apr 93 18:04:06 PDT
X-Mailer: ELM [version 2.4beta PL3]
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Length: 27406
Status: OR
Julian,
This has been filed in the bugfiler for processing. I am forwarding it
to you for approval. If you approve this I will add it to the patch kit
licity split. If the person is way off base on these changes, or you would
like to clean them up that is fine, just let me know.
This problem does effect a lot of people (me real soon, as I just came accross
some money and will be going from 16MB to 32MB)
Forwarded message:
From bsd.coe.montana.edu!owner-bugs Fri Apr 23 15:58:05 1993
Resent-Date: Sat, 24 Apr 1993 00:55:51 +0200
Resent-From: <owner-bugs@bsd.coe.montana.edu>
Resent-Message-Id: <9304232257.AA13748@bsd.coe.montana.edu>
Subject: >16MB ram experimental patch
To: 386bsd_bugs@bsd.coe.montana.edu
Resent-To: rgrimes@bsd.coe.montana.edu
Date: Sat, 24 Apr 1993 00:55:51 +0200
From: Arne Juul <Arne.Juul@dsl.unit.no>
Message-Id: <199304232255.AA00913@skarven.dsl.unit.no>
Index: sys.386bsd 386BSD-0.1.2.3
Reference: 386BSD-0.1.2.3/sys.386bsd/2
Description:
Disk transfers scribble random things about when you have
more than 16 MB ram
Repeat-By:
Install more than 16MB ram in your 386bsd machine
Fix:
We have an Everex 486/33 box with ISA bus, Adaptec SCSI card,
and 32MB ram. As most people should be aware of by now, 386bsd
currently does not avoid doing DMA to memory outside the 16MB
boundary. This causes great frustration for everybody with more
than 16MB. Earlier we just patches machdep.c to turn off using
those extra 16MB (too lazy to pick them physically out of the
machine :-).
But the local high guru (tegge@pvv.unitno) has made the following
patches for using bounce-buffers in a couple of night's programming.
This currently works great on our machine, but may have unfortunate
side-effects that we are not aware of.
I hope both the NetBSD people and the patch-kit maintainers will
test this out and try to get it into the patch-kit (it's an option
after all), so people will be able to use their full memory. Feel
free to mail me about it, and I will answer questions as good as
I can.
These patches are against the 0.1 + patchkit 0.2.3, and should
fix both the as driver and Julian's drivers. It also has some extra
debugging stuff (TRYGETSETUP, TRYTARGET) which may or may not be
interesting. Hopefully it will also be applyable on NetBSD as-is.
If you test this, especially with >16MB ram:
* remember to backup your system first. We crashed (totally!) our
root partition during the development of this. You were forewarned!
* apply patches, add 'option HUGEMEM' to your configuration file,
reconfigure and remake the kernel.
Happy hacking,
Arne H. Juul (arnej@lise.unit.no)
* EXPERIMENTAL PATCH * EXPERIMENTAL PATCH * EXPERIMENTAL PATCH *
*** /usr/src/sys.386bsd/i386/isa/aha1542.c.orig Sun Apr 4 09:39:16 1993
--- /usr/src/sys.386bsd/i386/isa/aha1542.c Mon Apr 5 05:21:11 1993
***************
*** 78,84 ****
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
!
#include <sys/types.h>
#include <aha.h>
--- 78,85 ----
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
! #undef TRYGETSETUP
! #undef TRYTARGET
#include <sys/types.h>
#include <aha.h>
***************
*** 128,133 ****
--- 129,143 ----
#endif __386BSD__
extern int delaycount; /* from clock setup code */
+ #ifdef HUGEMEM
+ #include "malloc.h"
+ struct bouncebuf *freebouncebufs;
+ int hugememflag=0;
+ #define NUM_BOUNCEBUFS 100 /* Should be moved to a header file */
+ #define MAXDMAADDR 0x1000000 /* Ditto ? */
+ #endif
+
+
/************************** board definitions *******************************/
/*
* I/O Port Interface
***************
*** 626,631 ****
--- 636,671 ----
dev->dev_addr, dev->dev_spl);
#endif __386BSD__
ahaunit ++;
+ #ifdef HUGEMEM
+ {
+ /* Allocate bounce buffers before all ISA memory is used. */
+ char *bufs;
+ int i;
+
+ if (hugememflag)
+ panic("Repeated ahaprobe");
+ hugememflag=1;
+ bufs=malloc((NUM_BOUNCEBUFS+1)*page_size,M_DEVBUF,M_NOWAIT);
+ bufs = (char *) trunc_page(bufs+page_size);
+ freebouncebufs=malloc(NUM_BOUNCEBUFS*sizeof(struct bouncebuf),
+ M_DEVBUF,M_NOWAIT);
+ if (bufs && freebouncebufs)
+ {
+ for (i=0;i<NUM_BOUNCEBUFS;i++)
+ {
+ freebouncebufs[i].s_vaddr=bufs;
+ freebouncebufs[i].physaddr= vtophys(bufs);
+ if ((int) (freebouncebufs[i].physaddr+page_size)>MAXDMAADDR)
+ panic("asprobe: bouncebuf> MAXDMAADDR");
+ freebouncebufs[i].next=
+ (i < NUM_BOUNCEBUFS-1) ? &freebouncebufs[i+1] : NULL ;
+ bufs+=page_size;
+ }
+ }
+ else
+ freebouncebufs=NULL;
+ }
+ #endif
return(1);
}
***************
*** 651,656 ****
--- 691,715 ----
{
aha_timeout(0);
}
+ #ifdef TRYGETSETUP
+ {
+ int i;
+ static struct aha_setup setup;
+ bzero(&setup,sizeof(setup));
+ aha_cmd(unit, 1, sizeof(setup), 0,&setup, AHA_SETUP_GET,
+ sizeof(setup));
+ printf("ahasetup: sync_neg=%d, parity=%d, speed=0x%x\n",
+ setup.sync_neg,setup.parity,setup.speed);
+ printf("ahasetup: bus_on=%d, bus_off=%d, num_mbx=%d\n",
+ setup.bus_on,setup.bus_off,setup.num_mbx);
+ printf("ahasetup: mbx=0x%x\n",(setup.mbx[0] << 16) |
+ (setup.mbx[1] << 8 ) | setup.mbx[2] );
+ for (i=0;i<8;i++)
+ printf("ahasetup: sync[%d]: offset=%d, period=%d, valid=%d\n",i,
+ setup.sync[i].offset,setup.sync[i].period,
+ setup.sync[i].valid);
+ }
+ #endif
#ifdef __386BSD__
printf("aha%d",unit);
#endif __386BSD__
***************
*** 911,916 ****
--- 970,976 ----
unsigned char ad[3];
volatile int i,sts;
struct aha_config conf;
+
/***********************************************\
* reset board, If it doesn't respond, assume *
***************
*** 1018,1023 ****
--- 1078,1086 ----
}
+ #ifdef TRYTARGET
+ aha_cmd(unit,8, 0, 0, 0, AHA_TARGET_EN,0,0,0,0,0,0,0,0);
+ #endif
/***********************************************\
* Initialize mail box *
\***********************************************/
***************
*** 1172,1177 ****
--- 1235,1244 ----
* Set up the scatter gather block *
\***********************************************/
+ #ifdef HUGEMEM
+ struct bouncebuf *bounced=NULL,*head;
+ int s;
+ #endif
if(scsi_debug & SHOWSCATGATH)
printf("%d @0x%x:- ",xs->datalen,xs->data);
datalen = xs->datalen;
***************
*** 1182,1188 ****
{
bytes_this_seg = 0;
! /* put in the base address */
lto3b(thisphys,&(sg->seg_addr));
if(scsi_debug & SHOWSCATGATH)
--- 1249,1293 ----
{
bytes_this_seg = 0;
! #ifdef HUGEMEM
! if (thisphys>=MAXDMAADDR) /* If already bounced --> won't hit this code */
! {
! /* Copy down to DMA-able ram */
!
! s=splbio();
! bounced=freebouncebufs;
! if (bounced)
! {
! freebouncebufs=bounced->next;
! splx(s);
! bounced->next=xs->bouncebufs;
! xs->bouncebufs=bounced;
! /* Keep offset on page */
! thisphys= bounced->physaddr
! +( thisphys & (PAGESIZ-1));
! bounced->length=0;
! }
! else
! {
! xs->error = XS_DRIVER_STUFFUP;
! printf("aha_scsi_cmd%d: out of bouncebufs\n",
! unit);
! head=xs->bouncebufs;
! xs->bouncebufs=NULL;
! while (head)
! {
! bounced=head;
! head=bounced->next;
! bounced->next=freebouncebufs;
! freebouncebufs=bounced;
! }
! splx(s);
! aha_free_ccb(unit,ccb,flags);
! return(HAD_ERROR);
! }
! }
! #endif
! /* put in the base address */
lto3b(thisphys,&(sg->seg_addr));
if(scsi_debug & SHOWSCATGATH)
***************
*** 1204,1209 ****
--- 1309,1328 ----
/**** or the data ****/
bytes_this_page = min(bytes_this_page
,datalen);
+ #ifdef HUGEMEM
+ if (bounced)
+ {
+ bounced->vaddr=bounced->s_vaddr +
+ (thisphys & (PAGESIZ-1));
+ if (!xs->bp ||
+ !(xs->bp->b_flags & B_READ))
+ bcopy(thiskv,bounced->vaddr,
+ bytes_this_page);
+ bounced->length=bytes_this_page;
+ bounced->wanted=thiskv;
+ bounced=NULL;
+ }
+ #endif
bytes_this_seg += bytes_this_page;
datalen -= bytes_this_page;
***************
*** 1212,1217 ****
--- 1331,1374 ----
+ PAGESIZ;
if(datalen)
thisphys = KVTOPHYS(thiskv);
+ #ifdef HUGEMEM
+ if (datalen && thisphys>=MAXDMAADDR)
+ {
+ /* Copy down to DMA-able ram */
+
+ s=splbio();
+ bounced=freebouncebufs;
+ if (bounced)
+ {
+ freebouncebufs=bounced->next;
+ splx(s);
+ bounced->next=xs->bouncebufs;
+ xs->bouncebufs=bounced;
+ /* Keep offset on page */
+ thisphys= bounced->physaddr
+ +( thisphys & (PAGESIZ-1));
+ bounced->length=0;
+ }
+ else
+ {
+ xs->error = XS_DRIVER_STUFFUP;
+ printf("aha_scsi_cmd%d: out of bouncebufs\n",
+ unit,AHA_NSEG);
+ head=xs->bouncebufs;
+ xs->bouncebufs=NULL;
+ while (head)
+ {
+ bounced=head;
+ head=bounced->next;
+ bounced->next=freebouncebufs;
+ freebouncebufs=bounced;
+ }
+ splx(s);
+ aha_free_ccb(unit,ccb,flags);
+ return(HAD_ERROR);
+ }
+ }
+ #endif
}
/***************************************\
* next page isn't contiguous, finish the seg*
*** /usr/src/sys.386bsd/i386/isa/as.c.orig Sun Apr 4 09:36:23 1993
--- /usr/src/sys.386bsd/i386/isa/as.c Mon Apr 5 05:21:12 1993
***************
*** 63,68 ****
--- 63,99 ----
* 27 Feb 93 James da Silva Tapedrive fixes.
*/
+ /*
+ HUGEMEM Fix (>16M ram). Tries to implement the first of the
+ alternatives listed below.
+
+ Some alternatives for handling of addresses outside DMA range:
+
+ - Do all the handling at splbio() level. Allocate bounce buffers
+ in asstart(). Performance problem due bcopy delaying the next disk IO ?
+
+ - Do first part of handling in asstrategy() before disksort.
+ May cause use of MANY bounce buffers. (Or when running out of
+ them: cause less efficiency from the disksort().
+
+ - Do a variant of double buffering. Use an alternative disksort()
+ which handles TWO active entries. (The second entry is active
+ in the sense that it has allocated bounce buffers). Let asstrategy()
+ allocate bounce buffers if its the first or second on the list.
+ Add a mechanism for 'lazy' allocation of bounce buffers when
+ removing the first entry from the active list. (Use spl0 from
+ inside an interrupt handler, or modify the exit part of the
+ assembly part of the interrupt handler, to get an 'at interrupt leave'
+ callback).
+ A lot of rewriting to be done.
+
+ Some unknowns:
+
+ - How costly is a 4K bcopy starting on a page boundary ?
+ - How costly are spl0(), splx() and splbio() ?
+
+ */
+
#include "as.h"
#if NAS > 0
***************
*** 81,86 ****
--- 112,118 ----
#include "syslog.h"
#include "vm/vm.h"
#include "kernel.h"
+ #include <malloc.h>
#include "asreg.h"
***************
*** 101,106 ****
--- 133,141 ----
/* maximum scatter list size for Adaptech controller */
#define NSCATTER 17
+ #define NUM_BOUNCEBUFS 100 /* Should be moved to a header file */
+ #define MAXDMAADDR 0x1000000 /* Ditto ? */
+
/* this array must reside in contiguous physical memory */
struct asinfo {
dev_t dev;
***************
*** 138,146 ****
--- 173,197 ----
int retry_count;
int start_time;
int restart_pending;
+ #ifdef HUGEMEM
+ struct bouncebuf *bouncebufs;
+ #endif
} asinfo[NTARGETS] = {0};
+
+ #ifdef HUGEMEM
+ struct bouncebuf
+ {
+ struct bouncebuf *next; /* freelist or chain on same request */
+ caddr_t physaddr; /* a 4K buffer in phys. memory */
+ caddr_t vaddr;
+ caddr_t wanted;
+ int wantedsize;
+ } *freebouncebufs;
+ int hugememflag=0;
+ #endif
+
#define dev_part(dev) (minor (dev) & 7)
#define dev_target(dev) ((minor (dev) >> 3) & 7)
#define dev_rewind(dev) ((minor (dev) & 1) == 0)
***************
*** 169,175 ****
val = inb (as_port + AS_STATUS);
if (val == (AS_STATUS_INIT | AS_STATUS_IDLE))
! return (1);
as_port = 0;
return (0);
}
--- 220,257 ----
val = inb (as_port + AS_STATUS);
if (val == (AS_STATUS_INIT | AS_STATUS_IDLE))
! {
! #ifdef HUGEMEM
! /* Allocate bounce buffers before all ISA memory is used. */
! char *bufs;
! int i;
!
! if (hugememflag)
! panic("Repeated asprobe");
! hugememflag=1;
! bufs=malloc((NUM_BOUNCEBUFS+1)*page_size,M_DEVBUF,M_NOWAIT);
! bufs = (char *) trunc_page(bufs+page_size);
! freebouncebufs=malloc(NUM_BOUNCEBUFS*sizeof(struct bouncebuf),
! M_DEVBUF,M_NOWAIT);
! if (bufs && freebouncebufs)
! {
! for (i=0;i<NUM_BOUNCEBUFS;i++)
! {
! freebouncebufs[i].vaddr=bufs;
! freebouncebufs[i].physaddr=(caddr_t) vtophys(bufs);
! if ((int) (freebouncebufs[i].physaddr+page_size)>MAXDMAADDR)
! panic("asprobe: bouncebuf> MAXDMAADDR");
! freebouncebufs[i].next=
! (i < NUM_BOUNCEBUFS-1) ? &freebouncebufs[i+1] : NULL ;
! bufs+=page_size;
! }
! }
! else
! freebouncebufs=NULL;
! #endif
!
! return(1);
! }
as_port = 0;
return (0);
}
***************
*** 192,198 ****
s = splbio ();
if (as_put_byte (AS_CMD_MAILBOX_INIT) < 0
! || as_put_byte (NTARGETS) < 0
|| as_put_byte (physaddr >> 16) < 0
|| as_put_byte (physaddr >> 8) < 0
|| as_put_byte (physaddr) < 0) {
--- 274,280 ----
s = splbio ();
if (as_put_byte (AS_CMD_MAILBOX_INIT) < 0
! || as_put_byte (NTARGETS) < 0 /* Differs by factor 2 from aha1542.c */
|| as_put_byte (physaddr >> 16) < 0
|| as_put_byte (physaddr >> 8) < 0
|| as_put_byte (physaddr) < 0) {
***************
*** 737,746 ****
if (asverbose)
printf ("asstrategy %d %d ", bp->b_blkno, bp->b_bcount);
- s = splbio ();
as = &asinfo[dev_target (bp->b_dev)];
if (as->tape) {
bp->av_forw = NULL;
if (as->requests.b_actf)
--- 819,834 ----
if (asverbose)
printf ("asstrategy %d %d ", bp->b_blkno, bp->b_bcount);
as = &asinfo[dev_target (bp->b_dev)];
+
+ /* Moved up to avoid splstuff needlessly */
+ if (!as->tape && bp != as->scsi_bp
+ && as->have_label == 0
+ && dev_part (bp->b_dev) != 3)
+ goto bad;
+ s = splbio ();
if (as->tape) {
bp->av_forw = NULL;
if (as->requests.b_actf)
***************
*** 749,759 ****
as->requests.b_actf = bp;
as->requests.b_actl = bp;
} else {
- if (bp != as->scsi_bp
- && as->have_label == 0
- && dev_part (bp->b_dev) != 3)
- goto bad;
-
bp->b_cylin = bp->b_blkno;
disksort (&as->requests, bp);
}
--- 837,842 ----
***************
*** 776,781 ****
--- 859,879 ----
s = splbio ();
as->restart_pending = 0;
as->retry_count++;
+ #ifdef HUGEMEM
+ {
+ /* free bounce buffers. (something has gone wrong) */
+ struct bouncebuf *tmp,*head;
+ head=as->bouncebufs;
+ as->bouncebufs=NULL;
+ while (head)
+ {
+ tmp=head;
+ head=tmp->next;
+ tmp->next=freebouncebufs;
+ freebouncebufs=tmp;
+ }
+ }
+ #endif
asstart (as);
splx (s);
}
***************
*** 909,914 ****
--- 1007,1040 ----
sp[0] = thistime >> 16;
sp[1] = thistime >> 8;
sp[2] = thistime;
+ #ifdef HUGEMEM
+ if (physaddr+thistime > MAXDMAADDR)
+ {
+ struct bouncebuf *tmp;
+ tmp=freebouncebufs;
+ if (tmp)
+ {
+ /* splbio() stuff ==> asintr is no problem here */
+ freebouncebufs=freebouncebufs->next;
+ tmp->next=as->bouncebufs;
+ as->bouncebufs=tmp;
+
+ physaddr = tmp->physaddr;
+ tmp->wanted=p;
+ tmp->wantedsize=thistime;
+ /* Ugly. bcopy may take some time. blocks BIO :-( */
+ if (!(bp->b_flags & B_READ))
+ bcopy(p,tmp->vaddr,thistime);
+ }
+ else
+ {
+ /* Too few allocated bounce buffers :-( */
+ printf("need more bounce buffers, cannot happen?");
+ bp->b_error = ENXIO;
+ goto bad;
+ }
+ }
+ #endif
sp[3] = physaddr >> 16;
sp[4] = physaddr >> 8;
sp[5] = physaddr;
***************
*** 940,945 ****
--- 1066,1072 ----
ccb->ccb_addr_and_control |= (bp->b_flags & B_READ) ? 8 : 0x10;
else
ccb->ccb_addr_and_control |= 0x18;
+ /* Note: unit number is in the 3 LSB of ccb_addr_and_control */
nbytes = nscatter * 6;
ccb->ccb_data_len_msb = nbytes >> 16;
***************
*** 1037,1042 ****
--- 1164,1183 ----
as->active = 0;
bp = as->requests.b_actf;
+ #ifdef HUGEMEM
+ {
+ /* free bounce buffers. (something has gone wrong) */
+ struct bouncebuf *tmp,*head=as->bouncebufs;
+ as->bouncebufs=NULL;
+ while (head)
+ {
+ tmp=head;
+ head=tmp->next;
+ tmp->next=freebouncebufs;
+ freebouncebufs=tmp;
+ }
+ }
+ #endif
if (bp) {
bp->b_flags |= B_ERROR;
asdone (as, 1);
***************
*** 1260,1272 ****
int restart;
{
struct buf *bp;
bp = as->requests.b_actf;
as->requests.b_actf = bp->av_forw;
! biodone (bp);
! as->retry_count = 0;
if (restart && as->requests.b_actf)
asstart (as);
}
int
--- 1401,1444 ----
int restart;
{
struct buf *bp;
+ #ifdef HUGEMEM
+ struct bouncebuf *tmp,*head;
+ int s;
+
+ head = as->bouncebufs;
+ as->bouncebufs=NULL;
+ #endif
bp = as->requests.b_actf;
as->requests.b_actf = bp->av_forw;
! as->retry_count = 0;
! /* side effect: done handling cannot get retry cnt. bad ?? */
if (restart && as->requests.b_actf)
asstart (as);
+ #ifdef HUGEMEM
+ /* free bounce buffers. */
+ /* s=spl0(); */
+ while (head)
+ {
+ tmp=head;
+ head=tmp->next;
+
+ /* Copy up from bounce buffer if read. Blocks BIO :-( */
+ if ((bp->b_flags & (B_READ|B_ERROR))==B_READ)
+ bcopy(tmp->vaddr,tmp->wanted,tmp->wantedsize);
+
+ /* splx(s); */
+ tmp->next=freebouncebufs;
+ freebouncebufs=tmp;
+ /* spl0(); */
+ }
+ /* splx(s); */
+ /*
+ * Should prepare new bounce buffers for next request here
+ * - not implemented
+ */
+ #endif
+ biodone (bp);
}
int
*** /usr/src/sys.386bsd/scsi/scsiconf.h.orig Sun Apr 4 09:39:40 1993
--- /usr/src/sys.386bsd/scsi/scsiconf.h Mon Apr 5 05:21:13 1993
***************
*** 85,91 ****
--- 85,107 ----
int error;
struct buf *bp;
struct scsi_sense_data sense;
+ #ifdef HUGEMEM
+ struct bouncebuf *bouncebufs;
+ #endif
};
+
+ #ifdef HUGEMEM
+ struct bouncebuf
+ {
+ struct bouncebuf *next; /* freelist or chain on same request */
+ int physaddr; /* a 4K buffer in phys. memory */
+ caddr_t vaddr; /* aligned with same offset on page as 'wanted' */
+ caddr_t s_vaddr; /* aligned on page boundary */
+ caddr_t wanted;
+ int length;
+ };
+ #endif
+
/********************************/
/* Flag values */
/********************************/
*** /usr/src/sys.386bsd/scsi/sd.c.orig Sun Apr 4 09:39:42 1993
--- /usr/src/sys.386bsd/scsi/sd.c Mon Apr 5 05:21:14 1993
***************
*** 46,53 ****
#include <scsi/scsiconf.h>
long int sdstrats,sdqueues;
-
#include <ddb.h>
#if NDDB > 0
int Debugger();
--- 46,55 ----
#include <scsi/scsiconf.h>
long int sdstrats,sdqueues;
+ #ifdef HUGEMEM
+ extern struct bouncebuf *freebouncebufs;
+ #endif
#include <ddb.h>
#if NDDB > 0
int Debugger();
***************
*** 345,350 ****
--- 347,357 ----
splx(s);
xs->flags = 0;
}
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ panic("sd_get_xs: bouncebufs!=NULL");
+
+ #endif
return(xs);
}
***************
*** 358,363 ****
--- 365,374 ----
{
int s;
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ panic("sd_free_xs: bouncebufs!=NULL");
+ #endif
if(flags & SCSI_NOMASK)
{
if (sd_xfer_block_wait[unit])
***************
*** 611,616 ****
--- 622,662 ----
sdqueues++;
}
+ #ifdef HUGEMEM
+ /*******************************************************\
+ * Frees bouncebuffers.
+ *
+ \*******************************************************/
+
+ int scsi_free_bouncebufs(xs,head,docopy)
+ struct scsi_xfer *xs;
+ struct bouncebuf *head;
+ int docopy;
+ {
+ struct bouncebuf *tmp;
+ int s;
+ if (xs)
+ xs->bouncebufs=NULL;
+ if (docopy)
+ for (tmp=head;tmp;tmp=tmp->next)
+ {
+ if (!tmp->length)
+ panic("scsi_free_bouncebufs: length==0");
+ else
+ bcopy(tmp->vaddr,tmp->wanted,tmp->length);
+ }
+ s=splbio();
+ while (head)
+ {
+ tmp=head;
+ head=head->next;
+ tmp->next=freebouncebufs;
+ freebouncebufs=tmp;
+ }
+ splx(s);
+ }
+ #endif
+
/*******************************************************\
* This routine is called by the scsi interrupt when *
* the transfer is complete.
***************
*** 657,662 ****
--- 703,712 ----
{
xs->error = XS_NOERROR;
xs->flags &= ~ITSDONE;
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,0);
+ #endif
if ( (*(sd_data[unit].sc_sw->scsi_cmd))(xs)
== SUCCESSFULLY_QUEUED)
{ /* don't wake the job, ok? */
***************
*** 673,681 ****
--- 723,748 ----
printf("sd%d: unknown error category from scsi driver\n"
,unit);
}
+ #ifdef HUGEMEM
+ {
+ struct bouncebuf *head;
+
+ head=xs->bouncebufs;
+ xs->bouncebufs=NULL;
+
+ sd_free_xs(unit,xs,0);
+ sdstart(unit); /* If there's anything waiting.. do it */
+ if (head)
+ scsi_free_bouncebufs(NULL,head,
+ (bp->b_flags &
+ (B_READ|B_ERROR))==B_READ);
+ biodone(bp);
+ }
+ #else
biodone(bp);
sd_free_xs(unit,xs,0);
sdstart(unit); /* If there's anything waiting.. do it */
+ #endif
}
else /* special has finished */
{
***************
*** 1168,1173 ****
--- 1235,1245 ----
xs->done_arg2 = (int)xs;
retry: xs->error = XS_NOERROR;
xs->bp = 0;
+ #ifdef HUGEMEM
+ /* Clean away bouncebufs */
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,0);
+ #endif
retval = (*(sd->sc_sw->scsi_cmd))(xs);
switch(retval)
{
***************
*** 1226,1233 ****
--- 1298,1319 ----
default:
retval = EIO;
}
+ #ifdef HUGEMEM
+ {
+ struct bouncebuf *head;
+
+ head=xs->bouncebufs;
+ xs->bouncebufs=NULL;
+
+ sd_free_xs(unit,xs,flags);
+ sdstart(unit); /* check if anything is waiting fr the xs */
+ if (head)
+ scsi_free_bouncebufs(NULL,head,retval==ESUCCESS);
+ }
+ #else
sd_free_xs(unit,xs,flags);
sdstart(unit); /* check if anything is waiting fr the xs */
+ #endif
}
else
{
*** /usr/src/sys.386bsd/scsi/st.c.orig Sun Apr 4 09:39:44 1993
--- /usr/src/sys.386bsd/scsi/st.c Mon Apr 5 05:21:16 1993
***************
*** 850,855 ****
--- 850,859 ----
{
xs->flags &= ~ITSDONE;
xs->error = XS_NOERROR;
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,0);
+ #endif
if ( (*(st_data[unit].sc_sw->scsi_cmd))(xs)
== SUCCESSFULLY_QUEUED)
{ /* don't wake the job, ok? */
***************
*** 868,875 ****
--- 872,887 ----
,unit);
}
biodone(bp);
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,
+ (bp->b_flags &
+ (B_READ|B_ERROR))==B_READ);
+
+ #endif
xs->flags = 0; /* no longer in use */
ststart(unit); /* If there's another waiting.. do it */
+ #endif
}
else
{
***************
*** 1380,1385 ****
--- 1392,1401 ----
xs->flags = INUSE;
if(!(flags & SCSI_NOMASK))
splx(s);
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ panic("st_scsi_cmd: bouncebufs!=NULL");
+ #endif
/*******************************************************\
* Fill out the scsi_xfer structure *
***************
*** 1402,1407 ****
--- 1418,1427 ----
xs->done_arg2 = (int)xs;
retry: xs->error = XS_NOERROR;
xs->bp = 0;
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,0);
+ #endif
retval = (*(st->sc_sw->scsi_cmd))(xs);
switch(retval)
{
***************
*** 1469,1476 ****
--- 1489,1501 ----
default:
retval = EIO;
}
+ #ifdef HUGEMEM
+ if (xs->bouncebufs)
+ scsi_free_bouncebufs(xs,xs->bouncebufs,retval==ESUCCESS);
+ #else
xs->flags = 0; /* it's free! */
ststart(unit);
+ #endif
}
else
{
diff -c /usr/src/sys.386bsd/vm/vm_map.h.buggy /usr/src/sys.386bsd/vm/vm_map.h
*** /usr/src/sys.386bsd/vm/vm_map.h.buggy Tue Feb 16 00:29:04 1993
--- /usr/src/sys.386bsd/vm/vm_map.h Thu Feb 18 23:26:52 1993
***************
*** 210,216 ****
--- 210,220 ----
#ifdef OMIT
#define MAX_KMAPENT 500
#else /* !OMIT*/
+ #ifdef HUGEMEM
+ #define MAX_KMAPENT 2048
+ #else
#define MAX_KMAPENT 1000 /* 15 Aug 92*/
+ #endif
#endif /* !OMIT*/
#endif _VM_MAP_
--
Rod Grimes rgrimes@agora.rain.com
386BSD patchkit coordinator Wish it paid real money!
Accurate Automation Company All opinions belong to me and my company!