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"