Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/uvm - uvm_unmap_remove(): need to call pmap_update() wit...
details: https://anonhg.NetBSD.org/src/rev/a1b80d7d9003
branches: trunk
changeset: 467065:a1b80d7d9003
user: ad <ad%NetBSD.org@localhost>
date: Sun Jan 12 17:46:55 2020 +0000
description:
- uvm_unmap_remove(): need to call pmap_update() with the object still
locked, otherwise the page could gain a new identity and still be visible
via a stale mapping.
- Adjust reference counts with atomics.
diffstat:
sys/uvm/uvm_map.c | 51 ++++++++++++++++++++++-----------------------------
sys/uvm/uvm_map.h | 4 ++--
2 files changed, 24 insertions(+), 31 deletions(-)
diffs (136 lines):
diff -r 0302ce8a74e3 -r a1b80d7d9003 sys/uvm/uvm_map.c
--- a/sys/uvm/uvm_map.c Sun Jan 12 16:11:51 2020 +0000
+++ b/sys/uvm/uvm_map.c Sun Jan 12 17:46:55 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_map.c,v 1.370 2020/01/05 15:57:15 para Exp $ */
+/* $NetBSD: uvm_map.c,v 1.371 2020/01/12 17:46:55 ad Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.370 2020/01/05 15:57:15 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.371 2020/01/12 17:46:55 ad Exp $");
#include "opt_ddb.h"
#include "opt_pax.h"
@@ -2240,7 +2240,7 @@
}
/*
- * Save the free space hint
+ * save the free space hint
*/
if (map->first_free != &map->header && map->first_free->start >= start)
@@ -2314,6 +2314,18 @@
uvm_map_lock_entry(entry);
pmap_remove(map->pmap, entry->start, entry->end);
+
+ /*
+ * note: if map is dying, leave pmap_update() for
+ * pmap_destroy(), which will be called later.
+ */
+
+ if ((map->flags & VM_MAP_DYING) == 0) {
+ pmap_update(vm_map_pmap(map));
+ } else {
+ KASSERT(vm_map_pmap(map) != pmap_kernel());
+ }
+
uvm_map_unlock_entry(entry);
}
@@ -2358,16 +2370,6 @@
entry = next;
}
- /*
- * Note: if map is dying, leave pmap_update() for pmap_destroy(),
- * which will be called later.
- */
- if ((map->flags & VM_MAP_DYING) == 0) {
- pmap_update(vm_map_pmap(map));
- } else {
- KASSERT(vm_map_pmap(map) != pmap_kernel());
- }
-
uvm_map_check(map, "unmap_remove leave");
/*
@@ -4254,14 +4256,10 @@
void
uvmspace_addref(struct vmspace *vm)
{
- struct vm_map *map = &vm->vm_map;
-
- KASSERT((map->flags & VM_MAP_DYING) == 0);
-
- mutex_enter(&map->misc_lock);
+
+ KASSERT((vm->vm_map.flags & VM_MAP_DYING) == 0);
KASSERT(vm->vm_refcnt > 0);
- vm->vm_refcnt++;
- mutex_exit(&map->misc_lock);
+ atomic_inc_uint(&vm->vm_refcnt);
}
/*
@@ -4273,16 +4271,12 @@
{
struct vm_map_entry *dead_entries;
struct vm_map *map = &vm->vm_map;
- int n;
UVMHIST_FUNC("uvmspace_free"); UVMHIST_CALLED(maphist);
UVMHIST_LOG(maphist,"(vm=%#jx) ref=%jd", (uintptr_t)vm, vm->vm_refcnt,
0, 0);
- mutex_enter(&map->misc_lock);
- n = --vm->vm_refcnt;
- mutex_exit(&map->misc_lock);
- if (n > 0)
+ if (atomic_dec_uint_nv(&vm->vm_refcnt) > 0)
return;
/*
@@ -4777,15 +4771,14 @@
/*
* uvm_map_reference: add reference to a map
*
- * => map need not be locked (we use misc_lock).
+ * => map need not be locked
*/
void
uvm_map_reference(struct vm_map *map)
{
- mutex_enter(&map->misc_lock);
- map->ref_count++;
- mutex_exit(&map->misc_lock);
+
+ atomic_inc_uint(&map->ref_count);
}
void
diff -r 0302ce8a74e3 -r a1b80d7d9003 sys/uvm/uvm_map.h
--- a/sys/uvm/uvm_map.h Sun Jan 12 16:11:51 2020 +0000
+++ b/sys/uvm/uvm_map.h Sun Jan 12 17:46:55 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_map.h,v 1.76 2020/01/05 15:57:15 para Exp $ */
+/* $NetBSD: uvm_map.h,v 1.77 2020/01/12 17:46:55 ad Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -209,7 +209,7 @@
struct pmap * pmap; /* Physical map */
krwlock_t lock; /* Non-intrsafe lock */
struct lwp * busy; /* LWP holding map busy */
- kmutex_t misc_lock; /* Lock for ref_count, cv */
+ kmutex_t misc_lock; /* Lock for cv, busy */
kcondvar_t cv; /* For signalling */
int flags; /* flags */
struct rb_tree rb_tree; /* Tree for entries */
Home |
Main Index |
Thread Index |
Old Index