summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-01-04 01:53:01 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-01-04 03:29:09 +0100
commitd7278d1176391dc717293111042c3fcb56e6ca85 (patch)
treef9e2be107b876c59a46cd9d965cf0571e95713b0
parentae7bdaf9ed238500aaa91080126fff356e5e2800 (diff)
vm_map: Avoid linking gaps for vm_copy_t
This does not make sense, and produces incorrect results (since vme_end is 0, etc.) * vm/vm_map.h (_vm_map_clip_start, _vm_map_clip_end): Add link_gap parameter. * vm/vm_map.c (_vm_map_entry_link): Add link_gap parameter, do not call vm_map_gap_insert if it is 0. (vm_map_entry_link): Set link_gap to 1 in _vm_map_entry_link call. (_vm_map_clip_start): Add link_gap parameter, pass it to _vm_map_entry_link call.. (vm_map_clip_start): Set link_gap_to 1 in _vm_map_clip_start call. (vm_map_copy_entry_link): Set link_gap to 0 in _vm_map_entry_link call. (vm_map_copy_clip_start): Set link_gap_to 0 in _vm_map_clip_start call. (_vm_map_entry_unlink): Add unlink_gap parameter, do not call vm_map_gap_remove if it is 0. (vm_map_entry_unlink): Set unlink_gap to 1 in _vm_map_entry_unlink call. (_vm_map_clip_end): Add link_gap parameter, pass it to _vm_map_entry_link call.. (vm_map_clip_end): Set link_gap_to 1 in _vm_map_clip_end call. (vm_map_copy_entry_unlink): Set unlink_gap to 0 in _vm_map_entry_unlink call. (vm_map_copy_clip_end): Set link_gap_to 0 in _vm_map_clip_end call. * vm/vm_kern.c (projected_buffer_deallocate): set link_gap to 1 in _vm_map_clip_start and _vm_map_clip_end calls.
-rw-r--r--vm/vm_kern.c4
-rw-r--r--vm/vm_map.c36
-rw-r--r--vm/vm_map.h6
3 files changed, 26 insertions, 20 deletions
diff --git a/vm/vm_kern.c b/vm/vm_kern.c
index 8ecd2ed9..705b0acb 100644
--- a/vm/vm_kern.c
+++ b/vm/vm_kern.c
@@ -271,9 +271,9 @@ projected_buffer_deallocate(
/*Prepare for deallocation*/
if (entry->vme_start < start)
- _vm_map_clip_start(&map->hdr, entry, start);
+ _vm_map_clip_start(&map->hdr, entry, start, 1);
if (entry->vme_end > end)
- _vm_map_clip_end(&map->hdr, entry, end);
+ _vm_map_clip_end(&map->hdr, entry, end, 1);
if (map->first_free == entry) /*Adjust first_free hint*/
map->first_free = entry->vme_prev;
entry->projected_on = 0; /*Needed to allow deletion*/
diff --git a/vm/vm_map.c b/vm/vm_map.c
index 9bd67474..f8f265c2 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -481,12 +481,12 @@ vm_map_gap_remove(struct vm_map_header *hdr, struct vm_map_entry *entry)
* before using these macros.
*/
#define vm_map_entry_link(map, after_where, entry) \
- _vm_map_entry_link(&(map)->hdr, after_where, entry)
+ _vm_map_entry_link(&(map)->hdr, after_where, entry, 1)
#define vm_map_copy_entry_link(copy, after_where, entry) \
- _vm_map_entry_link(&(copy)->cpy_hdr, after_where, entry)
+ _vm_map_entry_link(&(copy)->cpy_hdr, after_where, entry, 0)
-#define _vm_map_entry_link(hdr, after_where, entry) \
+#define _vm_map_entry_link(hdr, after_where, entry, link_gap) \
MACRO_BEGIN \
(hdr)->nentries++; \
(entry)->vme_prev = (after_where); \
@@ -495,22 +495,24 @@ vm_map_gap_remove(struct vm_map_header *hdr, struct vm_map_entry *entry)
(entry)->vme_next->vme_prev = (entry); \
rbtree_insert(&(hdr)->tree, &(entry)->tree_node, \
vm_map_entry_cmp_insert); \
- vm_map_gap_insert((hdr), (entry)); \
+ if (link_gap) \
+ vm_map_gap_insert((hdr), (entry)); \
MACRO_END
#define vm_map_entry_unlink(map, entry) \
- _vm_map_entry_unlink(&(map)->hdr, entry)
+ _vm_map_entry_unlink(&(map)->hdr, entry, 1)
#define vm_map_copy_entry_unlink(copy, entry) \
- _vm_map_entry_unlink(&(copy)->cpy_hdr, entry)
+ _vm_map_entry_unlink(&(copy)->cpy_hdr, entry, 0)
-#define _vm_map_entry_unlink(hdr, entry) \
+#define _vm_map_entry_unlink(hdr, entry, unlink_gap) \
MACRO_BEGIN \
(hdr)->nentries--; \
(entry)->vme_next->vme_prev = (entry)->vme_prev; \
(entry)->vme_prev->vme_next = (entry)->vme_next; \
rbtree_remove(&(hdr)->tree, &(entry)->tree_node); \
- vm_map_gap_remove((hdr), (entry)); \
+ if (unlink_gap) \
+ vm_map_gap_remove((hdr), (entry)); \
MACRO_END
/*
@@ -1181,13 +1183,13 @@ kern_return_t vm_map_enter(
#define vm_map_clip_start(map, entry, startaddr) \
MACRO_BEGIN \
if ((startaddr) > (entry)->vme_start) \
- _vm_map_clip_start(&(map)->hdr,(entry),(startaddr)); \
+ _vm_map_clip_start(&(map)->hdr,(entry),(startaddr),1); \
MACRO_END
#define vm_map_copy_clip_start(copy, entry, startaddr) \
MACRO_BEGIN \
if ((startaddr) > (entry)->vme_start) \
- _vm_map_clip_start(&(copy)->cpy_hdr,(entry),(startaddr)); \
+ _vm_map_clip_start(&(copy)->cpy_hdr,(entry),(startaddr),0); \
MACRO_END
/*
@@ -1197,7 +1199,8 @@ kern_return_t vm_map_enter(
void _vm_map_clip_start(
struct vm_map_header *map_header,
vm_map_entry_t entry,
- vm_offset_t start)
+ vm_offset_t start,
+ boolean_t link_gap)
{
vm_map_entry_t new_entry;
@@ -1216,7 +1219,7 @@ void _vm_map_clip_start(
entry->offset += (start - entry->vme_start);
entry->vme_start = start;
- _vm_map_entry_link(map_header, entry->vme_prev, new_entry);
+ _vm_map_entry_link(map_header, entry->vme_prev, new_entry, link_gap);
if (entry->is_sub_map)
vm_map_reference(new_entry->object.sub_map);
@@ -1234,13 +1237,13 @@ void _vm_map_clip_start(
#define vm_map_clip_end(map, entry, endaddr) \
MACRO_BEGIN \
if ((endaddr) < (entry)->vme_end) \
- _vm_map_clip_end(&(map)->hdr,(entry),(endaddr)); \
+ _vm_map_clip_end(&(map)->hdr,(entry),(endaddr),1); \
MACRO_END
#define vm_map_copy_clip_end(copy, entry, endaddr) \
MACRO_BEGIN \
if ((endaddr) < (entry)->vme_end) \
- _vm_map_clip_end(&(copy)->cpy_hdr,(entry),(endaddr)); \
+ _vm_map_clip_end(&(copy)->cpy_hdr,(entry),(endaddr),0); \
MACRO_END
/*
@@ -1250,7 +1253,8 @@ void _vm_map_clip_start(
void _vm_map_clip_end(
struct vm_map_header *map_header,
vm_map_entry_t entry,
- vm_offset_t end)
+ vm_offset_t end,
+ boolean_t link_gap)
{
vm_map_entry_t new_entry;
@@ -1265,7 +1269,7 @@ void _vm_map_clip_end(
new_entry->vme_start = entry->vme_end = end;
new_entry->offset += (end - entry->vme_start);
- _vm_map_entry_link(map_header, entry, new_entry);
+ _vm_map_entry_link(map_header, entry, new_entry, link_gap);
if (entry->is_sub_map)
vm_map_reference(new_entry->object.sub_map);
diff --git a/vm/vm_map.h b/vm/vm_map.h
index 2561ec44..57bdf651 100644
--- a/vm/vm_map.h
+++ b/vm/vm_map.h
@@ -560,7 +560,8 @@ extern kern_return_t vm_map_submap(
extern void _vm_map_clip_start(
struct vm_map_header *map_header,
vm_map_entry_t entry,
- vm_offset_t start);
+ vm_offset_t start,
+ boolean_t link_gap);
/*
* vm_map_clip_end: [ internal use only ]
@@ -572,6 +573,7 @@ extern void _vm_map_clip_start(
void _vm_map_clip_end(
struct vm_map_header *map_header,
vm_map_entry_t entry,
- vm_offset_t end);
+ vm_offset_t end,
+ boolean_t link_gap);
#endif /* _VM_VM_MAP_H_ */