Module Name: src
Committed By: riastradh
Date: Tue Aug 13 20:23:23 UTC 2024
Modified Files:
src/sys/uvm: uvm_map.c
Log Message:
Revert uvm_map.c 1.414.
This was:
uvm_map(9): Sprinkle assertions and interface contract comments.
Apparently, you have to actually test changes, not just prove they
are correct. Who knew??
(And the incantation `No functional change intended.' didn't work
either!)
PR kern/51254: uvm assertion "!topdown || hint <= orig_hint" failed
To generate a diff of this commit:
cvs rdiff -u -r1.415 -r1.416 src/sys/uvm/uvm_map.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.415 src/sys/uvm/uvm_map.c:1.416
--- src/sys/uvm/uvm_map.c:1.415 Tue Aug 13 17:54:59 2024
+++ src/sys/uvm/uvm_map.c Tue Aug 13 20:23:23 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_map.c,v 1.415 2024/08/13 17:54:59 riastradh Exp $ */
+/* $NetBSD: uvm_map.c,v 1.416 2024/08/13 20:23:23 riastradh 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.415 2024/08/13 17:54:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.416 2024/08/13 20:23:23 riastradh Exp $");
#include "opt_ddb.h"
#include "opt_pax.h"
@@ -303,23 +303,11 @@ int _uvm_map_sanity(struct vm_map *);
int _uvm_tree_sanity(struct vm_map *);
static vsize_t uvm_rb_maxgap(const struct vm_map_entry *);
-/*
- * Tree iteration. We violate the rbtree(9) abstraction for various
- * things here. Entries are ascending left to right, so, provided the
- * child entry in question exists:
- *
- * LEFT_ENTRY(entry)->end <= entry->start
- * entry->end <= RIGHT_ENTRY(entry)->start
- */
-__CTASSERT(offsetof(struct vm_map_entry, rb_node) == 0);
-#define ROOT_ENTRY(map) \
- ((struct vm_map_entry *)(map)->rb_tree.rbt_root)
-#define LEFT_ENTRY(entry) \
- ((struct vm_map_entry *)(entry)->rb_node.rb_left)
-#define RIGHT_ENTRY(entry) \
- ((struct vm_map_entry *)(entry)->rb_node.rb_right)
-#define PARENT_ENTRY(map, entry) \
- (ROOT_ENTRY(map) == (entry) \
+#define ROOT_ENTRY(map) ((struct vm_map_entry *)(map)->rb_tree.rbt_root)
+#define LEFT_ENTRY(entry) ((struct vm_map_entry *)(entry)->rb_node.rb_left)
+#define RIGHT_ENTRY(entry) ((struct vm_map_entry *)(entry)->rb_node.rb_right)
+#define PARENT_ENTRY(map, entry) \
+ (ROOT_ENTRY(map) == (entry) \
? NULL : (struct vm_map_entry *)RB_FATHER(&(entry)->rb_node))
/*
@@ -1631,18 +1619,6 @@ done:
/*
* uvm_map_lookup_entry_bytree: lookup an entry in tree
- *
- * => map must at least be read-locked by caller.
- *
- * => If address lies in an entry, set *entry to it and return true;
- * then (*entry)->start <= address < (*entry)->end.
-
- * => If address is below all entries in map, return false and set
- * *entry to &map->header.
- *
- * => Otherwise, return false and set *entry to the highest entry below
- * address, so (*entry)->end <= address, and if (*entry)->next is
- * not &map->header, address < (*entry)->next->start.
*/
static inline bool
@@ -1652,10 +1628,7 @@ uvm_map_lookup_entry_bytree(struct vm_ma
struct vm_map_entry *prev = &map->header;
struct vm_map_entry *cur = ROOT_ENTRY(map);
- KASSERT(rw_lock_held(&map->lock));
-
while (cur) {
- KASSERT(prev == &map->header || prev->end <= address);
UVMMAP_EVCNT_INCR(mlk_treeloop);
if (address >= cur->start) {
if (address < cur->end) {
@@ -1663,14 +1636,10 @@ uvm_map_lookup_entry_bytree(struct vm_ma
return true;
}
prev = cur;
- KASSERT(prev->end <= address);
cur = RIGHT_ENTRY(cur);
- KASSERT(prev->end <= cur->start);
} else
cur = LEFT_ENTRY(cur);
}
- KASSERT(prev == &map->header || prev->end <= address);
- KASSERT(prev->next == &map->header || address < prev->next->start);
*entry = prev;
return false;
}
@@ -1678,17 +1647,9 @@ uvm_map_lookup_entry_bytree(struct vm_ma
/*
* uvm_map_lookup_entry: find map entry at or before an address
*
- * => map must at least be read-locked by caller.
- *
- * => If address lies in an entry, set *entry to it and return true;
- * then (*entry)->start <= address < (*entry)->end.
-
- * => If address is below all entries in map, return false and set
- * *entry to &map->header.
- *
- * => Otherwise, return false and set *entry to the highest entry below
- * address, so (*entry)->end <= address, and if (*entry)->next is
- * not &map->header, address < (*entry)->next->start.
+ * => map must at least be read-locked by caller
+ * => entry is returned in "entry"
+ * => return value is true if address is in the returned entry
*/
bool
@@ -1700,8 +1661,6 @@ uvm_map_lookup_entry(struct vm_map *map,
UVMHIST_CALLARGS(maphist,"(map=%#jx,addr=%#jx,ent=%#jx)",
(uintptr_t)map, address, (uintptr_t)entry, 0);
- KDASSERT(rw_lock_held(&map->lock));
-
/*
* make a quick check to see if we are already looking at
* the entry we want (which is usually the case). note also
@@ -2001,23 +1960,18 @@ uvm_map_findspace(struct vm_map *map, va
* optimization or find a better way to do it.
*/
entry = map->first_free;
- } else if (uvm_map_lookup_entry(map, hint, &entry)) {
- KASSERT(entry->start <= hint);
- KASSERT(hint < entry->end);
- /* "hint" address already in use ... */
- if (flags & UVM_FLAG_FIXED) {
- UVMHIST_LOG(maphist, "<- fixed & VA in use",
- 0, 0, 0, 0);
- return (NULL);
- }
- if (topdown)
- /* Start from lower gap. */
- entry = entry->prev;
} else {
- KASSERT(entry == &map->header || entry->end <= hint);
- KASSERT(entry->next == &map->header ||
- hint < entry->next->start);
- if (flags & UVM_FLAG_FIXED) {
+ if (uvm_map_lookup_entry(map, hint, &entry)) {
+ /* "hint" address already in use ... */
+ if (flags & UVM_FLAG_FIXED) {
+ UVMHIST_LOG(maphist, "<- fixed & VA in use",
+ 0, 0, 0, 0);
+ return (NULL);
+ }
+ if (topdown)
+ /* Start from lower gap. */
+ entry = entry->prev;
+ } else if (flags & UVM_FLAG_FIXED) {
if (entry->next->start >= hint + length &&
hint + length > hint)
goto found;