Return to BSD News archive
Newsgroups: comp.unix.bsd
Path: sserve!manuel!munnari.oz.au!mips!mips!darwin.sura.net!haven.umd.edu!uunet!mcsun!sunic!aun.uninett.no!barsoom!barsoom!tih
From: tih@barsoom.nhh.no (Tom Ivar Helbekkmo)
Subject: 386BSD: buffer space allocation -- a small bugfix.
Message-ID: <tih.714982908@barsoom>
Sender: news@barsoom.nhh.no (USENET News System)
Organization: Norwegian School of Economics
Date: Fri, 28 Aug 1992 06:21:48 GMT
Lines: 63
Well, I guess it's my turn! :-) I'm now seeing the "kmem_map too
small" panic here, when I try to copy a large file (a 1.44Mb floppy
image) from an NFS-mounted device to a local hard disk. I've tried
making the changes that have been suggested, but that didn't help.
(Sanity check in machdep.c, 500 to 1000 increase in vm_map.h.)
However, while looking at /sys/i386/i386/machdep.c, I discovered a
little bug in it. (Fixing it hasn't solved my problem, either, but
at least it's a bug!) Here's what I was looking at:
/*
* Determine how many buffers to allocate.
* Use 10% of memory for the first 2 Meg, 5% of the remaining
* memory. Insure a minimum of 16 buffers.
* We allocate 1/2 as many swap buffer headers as file i/o buffers.
*/
if (bufpages == 0)
if (physmem < (2 * 1024 * 1024))
bufpages = physmem / 10 / CLSIZE;
else
bufpages = ((2 * 1024 * 1024 + physmem) / 20) / CLSIZE;
if (nbuf == 0) {
nbuf = bufpages / 2;
if (nbuf < 16)
nbuf = 16;
}
freebufspace = bufpages * NBPG;
if (nswbuf == 0) {
nswbuf = (nbuf / 2) &~ 1; /* force even */
if (nswbuf > 256)
nswbuf = 256; /* sanity */
}
valloc(swbuf, struct buf, nswbuf);
valloc(buf, struct buf, nbuf);
Bill Jolitz suggests a sanity check on the calculation of bufpages,
keeping it at a max of NKMEMCLUSTERS/2. In my case, that's not the
problem, since the calculation doesn't come out higher than that.
(I only have 8Mb of RAM.)
However: The comment in the above code says to allocate 10% of the
first 2 Meg, then 5% of whatever remains. This is *not* what the
code itself does. Since physmem et al do not count bytes, we're
sort of mixing apples and oranges here, and end up with 10% of the
entire physical memory, no matter what. The following calculation,
however, does do what the comment says:
if (bufpages == 0) {
bufpages = min(physmem, btoc(2*1024*1024)) / 10 / CLSIZE;
if (physmem > btoc(2*1024*1024))
bufpages += (physmem - btoc(2*1024*1024)) / 20 / CLSIZE;
}
(Actually, I'm not too sure about the "/ CLSIZE", but since CLSIZE is
equal to 1, at least on my machine, it doesn't really matter... :-))
I still can't copy large files from NFS to UFS disks -- but what the
heck, I'm sure that will come in due time! :-)
-tih
--
Tom Ivar Helbekkmo, NHH, Bergen, Norway. Telephone: +47-5-959205
Postmaster for domain nhh.no. Internet mail: tih@barsoom.nhh.no