PERFORCE change 94855 for review
Olivier Houchard
cognet at FreeBSD.org
Sun Apr 9 17:20:29 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94855
Change 94855 by cognet at cognet on 2006/04/09 17:19:52
MFi36: enable promotion of kmem_object pages.
Affected files ...
.. //depot/projects/superpages/src/sys/arm/arm/pmap.c#8 edit
Differences ...
==== //depot/projects/superpages/src/sys/arm/arm/pmap.c#8 (text+ko) ====
@@ -493,7 +493,7 @@
* we have a write-back cache, then we assume setting
* only C will make those pages write-through.
*/
- if (1 || cpufuncs.cf_dcache_wb_range == (void *) cpufunc_nullop) {
+ if (cpufuncs.cf_dcache_wb_range == (void *) cpufunc_nullop) {
pte_l1_s_cache_mode_pt = L1_S_B|L1_S_C;
pte_l2_l_cache_mode_pt = L2_B|L2_C;
pte_l2_s_cache_mode_pt = L2_B|L2_C;
@@ -1565,12 +1565,6 @@
/* There's no way we can do it. */
return;
}
- if (((ptep[i] & pte_l2_s_cache_mask) ==
- pte_l2_s_cache_mode_pt ||
- (ptep[i - 1] & pte_l2_s_cache_mask) ==
- pte_l2_s_cache_mode_pt) && pte_l2_s_cache_mode_pt
- != pte_l2_s_cache_mode)
- panic("fuck");
}
#ifdef SP_DEBUG
printf("promoting small %x\n", va);
@@ -1595,6 +1589,7 @@
vm_offset_t va0;
vm_paddr_t pa;
struct l2_dtable *l2;
+ struct l1_ttable *l1;
uint16_t l1idx;
int i;
@@ -1623,11 +1618,6 @@
pa = (pt[i] & L2_L_FRAME) + (i & 0xf) * PAGE_SIZE;
else
pa = pt[i] & L2_S_FRAME;
- if (((pt[i - 1] & pte_l2_s_cache_mask) == pte_l2_s_cache_mode_pt
- ||
- (pt[i] & pte_l2_s_cache_mask) == pte_l2_s_cache_mode_pt) &&
- pte_l2_s_cache_mode_pt != pte_l2_s_cache_mode)
- panic("fuck2");
if ((pt[i - 1] & L2_TYPE_MASK) == L2_TYPE_L)
pa2 = (pt[i - 1] & L2_L_FRAME) +
((i - 1) & 0xf) * PAGE_SIZE;
@@ -1646,10 +1636,13 @@
if (*pt & L2_S_PROT_W)
pa |= L1_S_PROT_W;
*pd = L1_S_PROTO | pa | pte_l1_s_cache_mode | L1_S_DOM(pmap->pm_domain);
-#if 0
- bzero(pt, 0x100 * sizeof(*pt));
-#endif
pmap_free_l2_bucket(pmap, &l2->l2_bucket[L2_BUCKET(l1idx)], 0x100);
+ if (pmap == kernel_pmap) {
+ SLIST_FOREACH(l1, &l1_list, l1_link) {
+ l1->l1_kva[l1idx] = *pd;
+ PTE_SYNC(&l1->l1_kva[l1idx]);
+ }
+ }
}
static void
@@ -1658,6 +1651,7 @@
pd_entry_t *pd;
pt_entry_t *pt;
struct l2_bucket *l2b;
+ struct l1_ttable *l1;
vm_offset_t va0;
uint16_t l1idx;
uint16_t demote_size;
@@ -1684,6 +1678,12 @@
pt = &l2b->l2b_kva[l2pte_index(va0)];
*pd = l2b->l2b_phys | L1_C_DOM(pmap->pm_domain) | L1_C_PROTO;
l2b->l2b_occupancy += 0x100;
+ if (pmap == kernel_pmap) {
+ SLIST_FOREACH(l1, &l1_list, l1_link) {
+ l1->l1_kva[l1idx] = *pd;
+ PTE_SYNC(&l1->l1_kva[l1idx]);
+ }
+ }
} else {
va0 = va & L2_L_FRAME;
l2b = pmap_get_l2_bucket(pmap, va0);
@@ -3099,6 +3099,8 @@
if ((pv->pv_va & L1_S_ADDR_MASK) >= sva &&
((pv->pv_va & L1_S_ADDR_MASK) + L1_S_SIZE) <
eva) {
+ struct l1_ttable *l1;
+
pmap_destroy_pv_range(pmap,
*pd & L1_S_ADDR_MASK,
pv->pv_va & L1_S_ADDR_MASK,
@@ -3114,6 +3116,18 @@
}
*pd = 0;
npv = TAILQ_FIRST(&pmap->pm_pvlist);
+ if (pmap == pmap_kernel()) {
+ SLIST_FOREACH(l1, &l1_list,
+ l1_link) {
+ l1->l1_kva[
+ L1_IDX(pv->pv_va &
+ L1_S_ADDR_MASK)] = 0;
+ PTE_SYNC(
+ &l1->l1_kva[L1_IDX(
+ pv->pv_va &
+ L1_S_ADDR_MASK)]);
+ }
+ }
continue;
} else
pmap_demote(pmap, pv->pv_va);
@@ -3577,6 +3591,8 @@
if (l1pte_section_p(pm->pm_l1->l1_kva[L1_IDX(sva)])) {
if ((sva & L1_S_OFFSET) == 0 &&
sva + L1_S_SIZE < eva) {
+ struct l1_ttable *l1;
+
/* Change the whole 1MB superpage. */
pd = &pm->pm_l1->l1_kva[L1_IDX(sva)];
if (*pd & L1_S_PROT_W) {
@@ -3597,6 +3613,13 @@
vm_page_dirty(m);
}
}
+ if (pm == pmap_kernel()) {
+ SLIST_FOREACH(l1, &l1_list, l1_link) {
+ l1->l1_kva[L1_IDX(sva)] =
+ *pd;
+ PTE_SYNC(&l1->l1_kva[L1_IDX(sva)]);
+ }
+ }
sva += L1_S_SIZE;
continue;
}
@@ -4282,6 +4305,7 @@
if (l2b == NULL) {
pd_entry_t *pd = &pm->pm_l1->l1_kva[L1_IDX(sva)];
if (l1pte_section_p(*pd)) {
+ struct l1_ttable *l1;
/* We can just remove the superpage. */
if ((sva == (sva & L1_S_ADDR_MASK)) &&
(sva + L1_S_SIZE < eva)) {
@@ -4291,6 +4315,14 @@
*pd = 0;
flushall = 1;
sva += L1_S_SIZE;
+ if (pm == pmap_kernel()) {
+ SLIST_FOREACH(l1, &l1_list,
+ l1_link) {
+ l1->l1_kva[L1_IDX(sva)] =
+ 0;
+ PTE_SYNC(&l1->l1_kva[L1_IDX(sva)]);
+ }
+ }
continue;
} else {
pmap_demote(pm, sva);
More information about the p4-projects
mailing list