diff options
Diffstat (limited to 'debian/patches/0008-xxx-use-a-rbtree-for-reverse-lookups.patch')
-rw-r--r-- | debian/patches/0008-xxx-use-a-rbtree-for-reverse-lookups.patch | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/debian/patches/0008-xxx-use-a-rbtree-for-reverse-lookups.patch b/debian/patches/0008-xxx-use-a-rbtree-for-reverse-lookups.patch new file mode 100644 index 0000000..13ed043 --- /dev/null +++ b/debian/patches/0008-xxx-use-a-rbtree-for-reverse-lookups.patch @@ -0,0 +1,169 @@ +From 3c232d3456bca5d7ac9b67a0e77806e1e2aad4ad Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Sat, 11 Apr 2015 03:11:33 +0200 +Subject: [PATCH gnumach 8/9] xxx use a rbtree for reverse lookups + +--- + ipc/ipc_entry.h | 3 +++ + ipc/ipc_space.c | 3 +-- + ipc/ipc_space.h | 66 ++++++++++++++++++++++++++++++++++++--------------------- + 3 files changed, 46 insertions(+), 26 deletions(-) + +diff --git a/ipc/ipc_entry.h b/ipc/ipc_entry.h +index ee3c2d4..a292638 100644 +--- a/ipc/ipc_entry.h ++++ b/ipc/ipc_entry.h +@@ -41,6 +41,7 @@ + #include <mach/mach_types.h> + #include <mach/port.h> + #include <mach/kern_return.h> ++#include <kern/rbtree.h> + #include <kern/slab.h> + #include <ipc/port.h> + #include <ipc/ipc_table.h> +@@ -71,6 +72,8 @@ typedef struct ipc_entry { + /*XXX ipc_port_request_index_t request;*/ + unsigned int request; + } index; ++ struct rbtree_node tree_node; /* entries in the reverse_map ++ tree (send rights only) */ + } *ipc_entry_t; + + #define IE_NULL ((ipc_entry_t) 0) +diff --git a/ipc/ipc_space.c b/ipc/ipc_space.c +index ea3cb3b..7d3f6cb 100644 +--- a/ipc/ipc_space.c ++++ b/ipc/ipc_space.c +@@ -115,7 +115,7 @@ ipc_space_create( + space->is_active = TRUE; + + rdxtree_init(&space->is_map); +- rdxtree_init(&space->is_reverse_map); ++ rbtree_init(&space->is_reverse_map); + /* The zeroth entry is reserved. */ + rdxtree_insert(&space->is_map, 0, &zero_entry); + space->is_size = 1; +@@ -204,7 +204,6 @@ ipc_space_destroy( + ie_free(entry); + } + rdxtree_remove_all(&space->is_map); +- rdxtree_remove_all(&space->is_reverse_map); + + /* + * Because the space is now dead, +diff --git a/ipc/ipc_space.h b/ipc/ipc_space.h +index 404f708..1ed3afd 100644 +--- a/ipc/ipc_space.h ++++ b/ipc/ipc_space.h +@@ -45,6 +45,7 @@ + #include <machine/vm_param.h> + #include <kern/macro_help.h> + #include <kern/lock.h> ++#include <kern/rbtree.h> + #include <kern/rdxtree.h> + #include <kern/slab.h> + #include <ipc/ipc_entry.h> +@@ -75,7 +76,7 @@ struct ipc_space { + boolean_t is_active; /* is the space alive? */ + struct rdxtree is_map; /* a map of entries */ + size_t is_size; /* number of entries */ +- struct rdxtree is_reverse_map; /* maps objects to entries */ ++ struct rbtree is_reverse_map; /* maps objects to entries */ + ipc_entry_t is_free_list; /* a linked list of free entries */ + size_t is_free_list_size; /* number of free entries */ + #define IS_FREE_LIST_SIZE_LIMIT 64 /* maximum number of entries +@@ -259,13 +260,26 @@ ipc_entry_dealloc( + + /* Reverse lookups. */ + +-/* Cast a pointer to a suitable key. */ +-#define KEY(X) \ +- ({ \ +- assert((((unsigned long) (X)) & 0x07) == 0); \ +- ((unsigned long long) \ +- (((unsigned long) (X) - VM_MIN_KERNEL_ADDRESS) >> 3)); \ +- }) ++/* Red-black tree lookup/insert comparison functions. */ ++static inline int ++ipc_reverse_cmp_lookup(ipc_object_t obj, struct rbtree_node *node) ++{ ++ struct ipc_entry *n = ++ structof(node, struct ipc_entry, tree_node); ++ if ((vm_offset_t) obj < (vm_offset_t) n->ie_object) ++ return -1; ++ if ((vm_offset_t) obj > (vm_offset_t) n->ie_object) ++ return 1; ++ return 0; ++} ++ ++static inline int ++ipc_reverse_cmp_insert(struct rbtree_node *node_n, struct rbtree_node *node_m) ++{ ++ struct ipc_entry *n = ++ structof(node_n, struct ipc_entry, tree_node); ++ return ipc_reverse_cmp_lookup(n->ie_object, node_m); ++} + + /* Insert (OBJ, ENTRY) pair into the reverse mapping. SPACE must + be write-locked. */ +@@ -276,8 +290,9 @@ ipc_reverse_insert(ipc_space_t space, + { + assert(space != IS_NULL); + assert(obj != IO_NULL); +- return (kern_return_t) rdxtree_insert(&space->is_reverse_map, +- KEY(obj), entry); ++ rbtree_insert(&space->is_reverse_map, &entry->tree_node, ++ ipc_reverse_cmp_insert); ++ return KERN_SUCCESS; + } + + /* Remove OBJ from the reverse mapping. SPACE must be +@@ -288,18 +303,16 @@ ipc_reverse_remove(ipc_space_t space, + { + assert(space != IS_NULL); + assert(obj != IO_NULL); +- return rdxtree_remove(&space->is_reverse_map, KEY(obj)); +-} ++ struct rbtree_node *tree_node; + +-/* Remove all entries from the reverse mapping. SPACE must be +- write-locked. */ +-static inline void +-ipc_reverse_remove_all(ipc_space_t space) +-{ +- assert(space != IS_NULL); +- rdxtree_remove_all(&space->is_reverse_map); +- assert(space->is_reverse_map.height == 0); +- assert(space->is_reverse_map.root == NULL); ++ tree_node = rbtree_lookup(&space->is_reverse_map, obj, ++ ipc_reverse_cmp_lookup); ++ if (tree_node == NULL) ++ return NULL; ++ ++ rbtree_remove(&space->is_reverse_map, tree_node); ++ ++ return structof(tree_node, struct ipc_entry, tree_node); + } + + /* Return ENTRY related to OBJ, or NULL if no such entry is found in +@@ -311,9 +324,14 @@ ipc_reverse_lookup(ipc_space_t space, + { + assert(space != IS_NULL); + assert(obj != IO_NULL); +- return rdxtree_lookup(&space->is_reverse_map, KEY(obj)); +-} ++ struct rbtree_node *tree_node; + +-#undef KEY ++ tree_node = rbtree_lookup(&space->is_reverse_map, obj, ++ ipc_reverse_cmp_lookup); ++ if (tree_node == NULL) ++ return NULL; ++ ++ return structof(tree_node, struct ipc_entry, tree_node); ++} + + #endif /* _IPC_IPC_SPACE_H_ */ +-- +2.1.4 + |