diff options
| author | Alan Cox <alc@FreeBSD.org> | 2006-11-12 21:48:34 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2006-11-12 21:48:34 +0000 |
| commit | 44b8bd66f9d825f9ed451e40259ec6f0ec3a07d1 (patch) | |
| tree | c4a9c71fe86ec1dd8e45421082e59941e177807f /sys | |
| parent | a9e889bc33c568beef4ce06e5c2765e9e876ebeb (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/amd64/amd64/pmap.c | 4 | ||||
| -rw-r--r-- | sys/arm/arm/pmap.c | 5 | ||||
| -rw-r--r-- | sys/i386/i386/pmap.c | 4 | ||||
| -rw-r--r-- | sys/ia64/ia64/pmap.c | 2 | ||||
| -rw-r--r-- | sys/powerpc/aim/mmu_oea.c | 5 | ||||
| -rw-r--r-- | sys/powerpc/powerpc/mmu_oea.c | 5 | ||||
| -rw-r--r-- | sys/sparc64/sparc64/pmap.c | 5 | ||||
| -rw-r--r-- | sys/sun4v/sun4v/pmap.c | 4 | ||||
| -rw-r--r-- | sys/vm/vm_fault.c | 9 | ||||
| -rw-r--r-- | sys/vm/vm_kern.c | 2 |
10 files changed, 28 insertions, 17 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index c1f8c8ba2027..7a8b6725d1d7 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -2357,8 +2357,10 @@ validate: * Now validate mapping with desired protection/wiring. */ newpte = (pt_entry_t)(pa | PG_V); - if ((prot & VM_PROT_WRITE) != 0) + if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; + vm_page_flag_set(m, PG_WRITEABLE); + } if ((prot & VM_PROT_EXECUTE) == 0) newpte |= pg_nx; if (wired) diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index a390a98ae40f..c5c1b209404c 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -3396,8 +3396,11 @@ do_l2b_alloc: npte |= L2_TYPE_INV; } - if (prot & VM_PROT_WRITE) + if (prot & VM_PROT_WRITE) { npte |= L2_S_PROT_W; + if (m != NULL) + vm_page_flag_set(m, PG_WRITEABLE); + } npte |= pte_l2_s_cache_mode; if (m && m == opg) { /* diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index a7609788a029..179818049164 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2434,8 +2434,10 @@ validate: * Now validate mapping with desired protection/wiring. */ newpte = (pt_entry_t)(pa | PG_V); - if ((prot & VM_PROT_WRITE) != 0) + if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; + vm_page_flag_set(m, PG_WRITEABLE); + } if (wired) newpte |= PG_W; if (va < VM_MAXUSER_ADDRESS) diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 37fe800e3da8..bcdaae7df7fa 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1647,6 +1647,8 @@ validate: pmap_pte_prot(pmap, pte, prot); pmap_set_pte(pte, va, pa, wired, managed); + if ((prot & VM_PROT_WRITE) != 0) + vm_page_flag_set(m, PG_WRITEABLE); vm_page_unlock_queues(); pmap_install(oldpmap); PMAP_UNLOCK(pmap); diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index df5431db2fd6..08217b5289cc 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -1129,9 +1129,10 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, } } - if (prot & VM_PROT_WRITE) + if (prot & VM_PROT_WRITE) { pte_lo |= PTE_BW; - else + vm_page_flag_set(m, PG_WRITEABLE); + } else pte_lo |= PTE_BR; if (prot & VM_PROT_EXECUTE) diff --git a/sys/powerpc/powerpc/mmu_oea.c b/sys/powerpc/powerpc/mmu_oea.c index df5431db2fd6..08217b5289cc 100644 --- a/sys/powerpc/powerpc/mmu_oea.c +++ b/sys/powerpc/powerpc/mmu_oea.c @@ -1129,9 +1129,10 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, } } - if (prot & VM_PROT_WRITE) + if (prot & VM_PROT_WRITE) { pte_lo |= PTE_BW; - else + vm_page_flag_set(m, PG_WRITEABLE); + } else pte_lo |= PTE_BR; if (prot & VM_PROT_EXECUTE) diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index 15f3351be827..bf0cb0bdcb0f 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -1348,6 +1348,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (wired) { tp->tte_data |= TD_W; } + vm_page_flag_set(m, PG_WRITEABLE); } else if ((data & TD_W) != 0) { vm_page_dirty(m); } @@ -1387,8 +1388,10 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, data = TD_V | TD_8K | TD_PA(pa); if (pm == kernel_pmap) data |= TD_P; - if (prot & VM_PROT_WRITE) + if ((prot & VM_PROT_WRITE) != 0) { data |= TD_SW; + vm_page_flag_set(m, PG_WRITEABLE); + } if (prot & VM_PROT_EXECUTE) { data |= TD_EXEC; icache_page_inval(pa); diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c index da915796b096..bcc292f843ad 100644 --- a/sys/sun4v/sun4v/pmap.c +++ b/sys/sun4v/sun4v/pmap.c @@ -1008,8 +1008,10 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, /* * Now validate mapping with desired protection/wiring. */ - if ((prot & VM_PROT_WRITE) != 0) + if ((prot & VM_PROT_WRITE) != 0) { tte_data |= VTD_SW_W; + vm_page_flag_set(m, PG_WRITEABLE); + } if ((prot & VM_PROT_EXECUTE) != 0) tte_data |= VTD_X; if (wired) diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index d62f3c769145..e5771995ee0a 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -841,9 +841,6 @@ readrest: } } if (prot & VM_PROT_WRITE) { - vm_page_lock_queues(); - vm_page_flag_set(fs.m, PG_WRITEABLE); - vm_page_unlock_queues(); vm_object_set_writeable_dirty(fs.object); /* @@ -1189,14 +1186,12 @@ vm_fault_copy_entry(dst_map, src_map, dst_entry, src_entry) * Enter it in the pmap... */ pmap_enter(dst_map->pmap, vaddr, dst_m, prot, FALSE); - VM_OBJECT_LOCK(dst_object); - vm_page_lock_queues(); - if ((prot & VM_PROT_WRITE) != 0) - vm_page_flag_set(dst_m, PG_WRITEABLE); /* * Mark it no longer busy, and put it on the active list. */ + VM_OBJECT_LOCK(dst_object); + vm_page_lock_queues(); vm_page_activate(dst_m); vm_page_unlock_queues(); vm_page_wakeup(dst_m); diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c index c91dc483dd65..e3a8c12159d7 100644 --- a/sys/vm/vm_kern.c +++ b/sys/vm/vm_kern.c @@ -402,7 +402,7 @@ retry: */ pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, 1); vm_page_lock_queues(); - vm_page_flag_set(m, PG_WRITEABLE | PG_REFERENCED); + vm_page_flag_set(m, PG_REFERENCED); vm_page_unlock_queues(); vm_page_wakeup(m); } |
