svn commit: r353307 - head/sys/amd64/amd64
Mateusz Guzik
mjg at FreeBSD.org
Tue Oct 8 14:59:51 UTC 2019
Author: mjg
Date: Tue Oct 8 14:59:50 2019
New Revision: 353307
URL: https://svnweb.freebsd.org/changeset/base/353307
Log:
amd64 pmap: allocate pv table entries for gaps in PA
This matches the state prior to r353149 and fixes crashes with DRM
modules.
Reported and tested by: cy, garga, Krasznai Andras
Fixes: r353149 ("amd64 pmap: implement per-superpage locks")
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/amd64/amd64/pmap.c
Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Tue Oct 8 14:54:35 2019 (r353306)
+++ head/sys/amd64/amd64/pmap.c Tue Oct 8 14:59:50 2019 (r353307)
@@ -1864,26 +1864,14 @@ pmap_init_pv_table(void)
highest = -1;
s = 0;
for (i = 0; i < vm_phys_nsegs; i++) {
- start = vm_phys_segs[i].start / NBPDR;
end = vm_phys_segs[i].end / NBPDR;
domain = vm_phys_segs[i].domain;
if (highest >= end)
continue;
- if (start < highest) {
- start = highest + 1;
- pvd = &pv_table[start];
- } else {
- /*
- * The lowest address may land somewhere in the middle
- * of our page. Simplify the code by pretending it is
- * at the beginning.
- */
- pvd = pa_to_pmdp(vm_phys_segs[i].start);
- pvd = (struct pmap_large_md_page *)trunc_page(pvd);
- start = pvd - pv_table;
- }
+ start = highest + 1;
+ pvd = &pv_table[start];
pages = end - start + 1;
s = round_page(pages * sizeof(*pvd));
More information about the svn-src-head
mailing list