home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.unix.bsd
- Path: sparky!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
-