svn commit: r305517 - head/sys/powerpc/booke
Justin Hibbits
jhibbits at FreeBSD.org
Wed Sep 7 03:26:56 UTC 2016
Author: jhibbits
Date: Wed Sep 7 03:26:55 2016
New Revision: 305517
URL: https://svnweb.freebsd.org/changeset/base/305517
Log:
Allow pmap_early_io_unmap() to reclaim memory
pmap_early_io_map()/pmap_early_io_unmap(), if used in pairs, should be used in
the form:
pmap_early_io_map()
..do stuff..
pmap_early_io_unmap()
Without other allocations in the middle. Without reclaiming memory this can
leave large holes in the device space.
While here, make a simple change to the unmap loop which now permits it to unmap
multiple TLB entries in the range.
Modified:
head/sys/powerpc/booke/pmap.c
Modified: head/sys/powerpc/booke/pmap.c
==============================================================================
--- head/sys/powerpc/booke/pmap.c Wed Sep 7 03:15:26 2016 (r305516)
+++ head/sys/powerpc/booke/pmap.c Wed Sep 7 03:26:55 2016 (r305517)
@@ -3391,27 +3391,37 @@ tlb1_init()
set_mas4_defaults();
}
+/*
+ * pmap_early_io_unmap() should be used in short conjunction with
+ * pmap_early_io_map(), as in the following snippet:
+ *
+ * x = pmap_early_io_map(...);
+ * <do something with x>
+ * pmap_early_io_unmap(x, size);
+ *
+ * And avoiding more allocations between.
+ */
void
pmap_early_io_unmap(vm_offset_t va, vm_size_t size)
{
int i;
tlb_entry_t e;
+ vm_size_t isize;
- for (i = 0; i < TLB1_ENTRIES && size > 0; i ++) {
+ size = roundup(size, PAGE_SIZE);
+ isize = size;
+ for (i = 0; i < TLB1_ENTRIES && size > 0; i++) {
tlb1_read_entry(&e, i);
if (!(e.mas1 & MAS1_VALID))
continue;
- /*
- * FIXME: this code does not work if VA region
- * spans multiple TLB entries. This does not cause
- * problems right now but shall be fixed in the future
- */
- if (va >= e.virt && (va + size) <= (e.virt + e.size)) {
+ if (va <= e.virt && (va + isize) >= (e.virt + e.size)) {
size -= e.size;
e.mas1 &= ~MAS1_VALID;
tlb1_write_entry(&e, i);
}
}
+ if (tlb1_map_base == va + isize)
+ tlb1_map_base -= isize;
}
vm_offset_t
More information about the svn-src-all
mailing list