Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!doc.ic.ac.uk!marble.uknet.ac.uk!mcsun!fuug!kiae!relcom!maginf!amsteel!ivans
From: ivans@amsteel.chel.su (Mike Ivans)
Subject: Re: kmem_map overflow with 0.2.2 kernel
Organization: AMsteel Joint Venture
References: <C4Kw3q.C6M@sugar.neosoft.com>
Message-ID: <1993Mar31.075521.29358@amsteel.chel.su>
Date: Wed, 31 Mar 1993 07:55:21 GMT
Lines: 102
peter@NeoSoft.com (Peter da Silva) writes:
>distribution loaded on /var1 (temporarily mounted as /tmp) I have been
>getting reproducible kmem_map crashes using the /tmp/extract program. Using
>"cat bin* | compress -d | cpio -pcdumv" works, but I'd like to find out
>what the problem is.
>Any ideas? This is a pretty vanilla (if old) installation.
I had a similar problem while compiling X with sources on sparcstation,
connected to my 386bsd box through NFS. I solved the problem with the
help of the following patch for vm_kern.c:
| Path: amsteel!maginf!kiae!demos!fuug!mcsun!uknet!doc.ic.ac.uk!pipex!uunet!ihz.compuserve.com!mdickson
| From: mdickson@csi.compuserve.com (Michael Dickson)
| Newsgroups: comp.unix.bsd
| Subject: A fix for kern_malloc panics
| Message-ID: <MDICKSON.93Jan18113820@mhaao.csi.compuserve.com>
| Date: 18 Jan 93 16:40:52 GMT
| Sender: news@csi.compuserve.com (Usenet News)
| Reply-To: m.dickson@csi.CompuServe.com
| Distribution: comp.unix.bsd
| Organization: CompuServe, Inc.
| Lines: 74
|
| All,
|
| Well, here's a patch that I believe should fix the problems
| we've been seeing with panics (kmem_map too small). Note that
| this is only a partial fix. There is some extra work to do
| to complete the changes.
|
| In short, the M_WAITOK and M_NOWAIT flags passed to the kernel
| memory allocator routines are converted to boolean TRUE/FALSE
| values when passed in parameter "canwait" to kern_malloc. The logic
| in kern_malloc is incorrectly coded so that a panic is generated
| if canwait is TRUE and a null is returned on the FALSE condition.
| This is obviously backwards (even the comments indicate the correct
| behaviour). Basically the M_NOWAIT case is designed for interrupt
| time allocational where a request must be satisfied immediately.
| The vast majority of the allocations happen using M_WAITOK.
|
| I found this after doing some debugging. In most cases when
| the machine would panic it was during a bursty load condition
| creating a temporary memory shortfall, hence the panic. This change
| allows callers to detect the shortfall and act accordingly.
|
| Note that this is really only a partial fix. There are a couple
| of places where MALLOC is called where the return value is NOT
| checked. Ideally these also need to be fixed.
|
| Anyway, here's the patch. Enjoy.
|
| Mike Dickson
| Compuserve, Incorporated
| m.dickson@csi.compuserve.com
|
|
| *** vm_kern.c.save Sun Jan 10 12:51:05 1993
| --- vm_kern.c Sun Jan 17 01:39:03 1993
| ***************
| *** 360,365 ****
| --- 360,366 ----
| vm_offset_t addr;
| vm_page_t m;
| extern vm_object_t kmem_object;
| + int result;
|
| if (map != kmem_map && map != mb_map && map != buffer_map)
| panic("kern_malloc_alloc: map != {kmem,mb,buffer}_map");
| ***************
| *** 367,377 ****
| size = round_page(size);
| addr = vm_map_min(map);
|
| ! if (vm_map_find(map, NULL, (vm_offset_t)0,
| ! &addr, size, TRUE) != KERN_SUCCESS) {
| ! if (canwait)
| panic("kmem_malloc: kmem_map too small");
| ! return(0);
| }
|
| /*
| --- 368,382 ----
| size = round_page(size);
| addr = vm_map_min(map);
|
| ! result = vm_map_find(map, NULL, (vm_offset_t)0, &addr, size, TRUE);
| ! if (result != KERN_SUCCESS) {
| ! if (canwait) {
| ! return(0);
| ! }
| ! else {
| ! printf("kmem_malloc: bad status return of %d.\n", result);
| panic("kmem_malloc: kmem_map too small");
| ! }
| }
|
| /*
--
ιΧΑΞΟΧ νΙΘΑΙΜ (A Bear With a Little Brain), σπ AMsteel.
Voice: (35137) 3-0267, 7-3406. E-mail: ivans@amsteel.chel.su