On Thu, Apr 21, 2011 at 01:38:35AM +0200, Ariane van der Steldt wrote: > Hi, > > MMU address space holes are at a fixed position (ofcourse). > This diff makes sure the FIXED position flag is specified when mapping > them in and complains loudly otherwise. > > While there, check some other flag mistakes (which don't happen in the > kernel). > > This diff prepares for the vmmap replacement I wrote, but is correct > regardless. > > Ok? > -- > Ariane > > > Index: arch/sparc/sparc/pmap.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc/sparc/pmap.c,v > retrieving revision 1.158 > diff -u -d -p -r1.158 pmap.c > --- arch/sparc/sparc/pmap.c 6 Dec 2010 20:57:18 -0000 1.158 > +++ arch/sparc/sparc/pmap.c 20 Apr 2011 23:34:10 -0000 > @@ -6275,7 +6275,8 @@ pmap_remove_holes(struct vm_map *map) > (void)uvm_map(map, &shole, ehole - shole, NULL, > UVM_UNKNOWN_OFFSET, 0, > UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE, > - UVM_ADV_RANDOM, UVM_FLAG_NOMERGE | UVM_FLAG_HOLE)); > + UVM_ADV_RANDOM, > + UVM_FLAG_NOMERGE | UVM_FLAG_HOLE | UVM_FLAG_FIXED)); > } > #endif > } > Index: arch/sparc64/sparc64/pmap.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/sparc64/pmap.c,v > retrieving revision 1.72 > diff -u -d -p -r1.72 pmap.c > --- arch/sparc64/sparc64/pmap.c 7 Apr 2011 15:30:16 -0000 1.72 > +++ arch/sparc64/sparc64/pmap.c 20 Apr 2011 23:34:12 -0000 > @@ -3614,7 +3614,8 @@ pmap_remove_holes(struct vm_map *map) > > (void)uvm_map(map, &shole, ehole - shole, NULL, UVM_UNKNOWN_OFFSET, 0, > UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE, > - UVM_ADV_RANDOM, UVM_FLAG_NOMERGE | UVM_FLAG_HOLE)); > + UVM_ADV_RANDOM, > + UVM_FLAG_NOMERGE | UVM_FLAG_HOLE | UVM_FLAG_FIXED)); > } > > #ifdef DDB > Index: arch/vax/vax/pmap.c > =================================================================== > RCS file: /cvs/src/sys/arch/vax/vax/pmap.c,v > retrieving revision 1.50 > diff -u -d -p -r1.50 pmap.c > --- arch/vax/vax/pmap.c 30 Sep 2008 20:00:29 -0000 1.50 > +++ arch/vax/vax/pmap.c 20 Apr 2011 23:34:12 -0000 > @@ -426,7 +426,8 @@ pmap_remove_holes(struct vm_map *map) > > (void)uvm_map(map, &shole, ehole - shole, NULL, UVM_UNKNOWN_OFFSET, 0, > UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE, > - UVM_ADV_RANDOM, UVM_FLAG_NOMERGE | UVM_FLAG_HOLE)); > + UVM_ADV_RANDOM, > + UVM_FLAG_NOMERGE | UVM_FLAG_HOLE | UVM_FLAG_FIXED)); > } > > void > Index: uvm/uvm_map.c > =================================================================== > RCS file: /cvs/src/sys/uvm/uvm_map.c,v > retrieving revision 1.134 > diff -u -d -p -r1.134 uvm_map.c > --- uvm/uvm_map.c 18 Apr 2011 19:23:46 -0000 1.134 > +++ uvm/uvm_map.c 20 Apr 2011 23:34:12 -0000 > @@ -744,6 +744,14 @@ uvm_map_p(struct vm_map *map, vaddr_t *s > map, *startp, size, flags); > UVMHIST_LOG(maphist, " uobj/offset %p/%ld", uobj, (u_long)uoffset,0,0); > > + /* > + * Holes are incompatible with other types of mappings. > + */ > + if (flags & UVM_FLAG_HOLE) { > + KASSERT(uobj == NULL && (flags & UVM_FLAG_FIXED) != 0 && > + (flags & (UVM_FLAG_OVERLAY | UVM_FLAG_COPYONW)) == 0); > + } > +
So really what this does it enforce the fact that holes should be fixed (so the map code doesn't even attempt to move them around which is currently a risk if almost non-existant) and the flags should enforce that? Similarly holes can't be copy on write or overlays. I've confirmed that this is every hole allocation in the kernel. Ok. -0- -- Barometer, n.: An ingenious instrument which indicates what kind of weather we are having. -- Ambrose Bierce, "The Devil's Dictionary"