Oh, I think I've been here before.. on sparc.. with buffer cache stuff.. yes please.
On Thu, Jun 02, 2016 at 10:55:24PM +0200, Mark Kettenis wrote: > The fix below fixes the following panic that mglocker@ was seeing on > macppc: > > panic: uvm_addr_invoke: address selector 0xfe8000 (uaddr_bestfit > 0xe0000000-0xee000000) returned unavailable address 0xe8a59000 > > This happened immediately after a failed malloc(9). What is happening > here is that we end up calling uvm_map_kmem_grow() on kmem_map, which > is a submap of kernel_map. The end of kmem_map is smaller than > uvm_maxkaddr. So we end up setting uvm_maxkaddr to a smaller value. > The next allocation out of kernel_map that returns an adress larger > than uvm_maxkaddr will now trigger the panic. > > We should never reduce uvm_maxkaddr. The diff below makes sure that > we don't. > > This will probably fix similar panics that we have seen on sparc. > > ok? > > P.S. I think this function is somewhat retarded when dealing with > submaps of kernel_map and/or architectures without pmap_growkernel(). > But let's fix this long-standing bug first before we try to address > that issue. > > > Index: uvm_map.c > =================================================================== > RCS file: /cvs/src/sys/uvm/uvm_map.c,v > retrieving revision 1.213 > diff -u -p -r1.213 uvm_map.c > --- uvm_map.c 8 May 2016 16:29:57 -0000 1.213 > +++ uvm_map.c 2 Jun 2016 20:18:11 -0000 > @@ -4573,7 +4573,7 @@ uvm_map_kmem_grow(struct vm_map *map, st > #ifdef PMAP_GROWKERNEL > uvm_maxkaddr = pmap_growkernel(end); > #else > - uvm_maxkaddr = end; > + uvm_maxkaddr = MAX(uvm_maxkaddr, end); > #endif > > /* Rebuild free list. */ >