Skip to content

Commit 1b194d3

Browse files
committed
riscv pmap: only need to re-read l3 when crossing the page boundary
1 parent 50c962d commit 1b194d3

File tree

1 file changed

+43
-14
lines changed

1 file changed

+43
-14
lines changed

sys/riscv/riscv/pmap.c

+43-14
Original file line numberDiff line numberDiff line change
@@ -1201,17 +1201,22 @@ pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode)
12011201
pn_t pn;
12021202

12031203
KASSERT((pa & L3_OFFSET) == 0,
1204-
("pmap_kenter_device: Invalid physical address"));
1204+
("%s: Invalid physical address", __func__));
12051205
KASSERT((sva & L3_OFFSET) == 0,
1206-
("pmap_kenter_device: Invalid virtual address"));
1206+
("%s: Invalid virtual address", __func__));
12071207
KASSERT((size & PAGE_MASK) == 0,
1208-
("pmap_kenter_device: Mapping is not page-sized"));
1208+
("%s: Mapping is not page-sized", __func__));
12091209

12101210
memattr = pmap_memattr_bits(mode);
1211+
l3 = NULL;
12111212
va = sva;
12121213
while (size != 0) {
1213-
l3 = pmap_l3(kernel_pmap, va);
1214-
KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
1214+
/* only need to re-read l3 when crossing the page boundary */
1215+
if (l3 == NULL || __is_aligned(l3, PAGE_SIZE)) {
1216+
l3 = pmap_l3(kernel_pmap, va);
1217+
KASSERT(l3 != NULL,
1218+
("%s: Invalid page table, va: 0x%lx", __func__, va));
1219+
}
12151220

12161221
pn = (pa / PAGE_SIZE);
12171222
entry = PTE_KERN;
@@ -1222,6 +1227,7 @@ pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode)
12221227
va += PAGE_SIZE;
12231228
pa += PAGE_SIZE;
12241229
size -= PAGE_SIZE;
1230+
++l3;
12251231
}
12261232
pmap_invalidate_range(kernel_pmap, sva, va);
12271233
}
@@ -1255,18 +1261,24 @@ pmap_kremove_device(vm_offset_t sva, vm_size_t size)
12551261
vm_offset_t va;
12561262

12571263
KASSERT((sva & L3_OFFSET) == 0,
1258-
("pmap_kremove_device: Invalid virtual address"));
1264+
("%s: Invalid virtual address", __func__));
12591265
KASSERT((size & PAGE_MASK) == 0,
1260-
("pmap_kremove_device: Mapping is not page-sized"));
1266+
("%s: Mapping is not page-sized", __func__));
12611267

1268+
l3 = NULL;
12621269
va = sva;
12631270
while (size != 0) {
1264-
l3 = pmap_l3(kernel_pmap, va);
1265-
KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
1271+
/* only need to re-read l3 when crossing the page boundary */
1272+
if (l3 == NULL || __is_aligned(l3, PAGE_SIZE)) {
1273+
l3 = pmap_l3(kernel_pmap, va);
1274+
KASSERT(l3 != NULL,
1275+
("%s: Invalid page table, va: 0x%lx", __func__, va));
1276+
}
12661277
pmap_clear(l3);
12671278

12681279
va += PAGE_SIZE;
12691280
size -= PAGE_SIZE;
1281+
++l3;
12701282
}
12711283

12721284
pmap_invalidate_range(kernel_pmap, sva, va);
@@ -1311,19 +1323,26 @@ pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
13111323
pn_t pn;
13121324
int i;
13131325

1326+
l3 = NULL;
13141327
va = sva;
13151328
for (i = 0; i < count; i++) {
1329+
/* only need to re-read l3 when crossing the page boundary */
1330+
if (l3 == NULL || __is_aligned(l3, PAGE_SIZE)) {
1331+
l3 = pmap_l3(kernel_pmap, va);
1332+
KASSERT(l3 != NULL,
1333+
("%s: Invalid page table, va: 0x%lx", __func__, va));
1334+
}
13161335
m = ma[i];
13171336
pa = VM_PAGE_TO_PHYS(m);
13181337
pn = (pa / PAGE_SIZE);
1319-
l3 = pmap_l3(kernel_pmap, va);
13201338

13211339
entry = PTE_KERN;
13221340
entry |= pmap_memattr_bits(m->md.pv_memattr);
13231341
entry |= (pn << PTE_PPN0_S);
13241342
pmap_store(l3, entry);
13251343

1326-
va += L3_SIZE;
1344+
va += PAGE_SIZE;
1345+
++l3;
13271346
}
13281347
pmap_invalidate_range(kernel_pmap, sva, va);
13291348
}
@@ -1338,13 +1357,23 @@ pmap_qremove(vm_offset_t sva, int count)
13381357
{
13391358
pt_entry_t *l3;
13401359
vm_offset_t va;
1360+
int i;
13411361

13421362
KASSERT(sva >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", sva));
13431363

1344-
for (va = sva; count-- > 0; va += PAGE_SIZE) {
1345-
l3 = pmap_l3(kernel_pmap, va);
1346-
KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
1364+
l3 = NULL;
1365+
va = sva;
1366+
for (i = 0; i < count; i++) {
1367+
/* only need to re-read l3 when crossing the page boundary */
1368+
if (l3 == NULL || __is_aligned(l3, PAGE_SIZE)) {
1369+
l3 = pmap_l3(kernel_pmap, va);
1370+
KASSERT(l3 != NULL,
1371+
("%s: Invalid page table, va: 0x%lx", __func__, va));
1372+
}
13471373
pmap_clear(l3);
1374+
1375+
va += PAGE_SIZE;
1376+
++l3;
13481377
}
13491378
pmap_invalidate_range(kernel_pmap, sva, va);
13501379
}

0 commit comments

Comments
 (0)