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 - 1.158
+++ arch/sparc/sparc/pmap.c 20 Apr 2011 23:34:10 -
@@ -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 - 1.72
+++ arch/sparc64/sparc64/pmap.c 20 Apr 2011 23:34:12 -
@@ -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 - 1.50
+++ arch/vax/vax/pmap.c 20 Apr 2011 23:34:12 -
@@ -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 - 1.134
+++ uvm/uvm_map.c 20 Apr 2011 23:34:12 -
@@ -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