summaryrefslogtreecommitdiff
path: root/debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch')
-rw-r--r--debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch316
1 files changed, 316 insertions, 0 deletions
diff --git a/debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch b/debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch
new file mode 100644
index 0000000..4235944
--- /dev/null
+++ b/debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch
@@ -0,0 +1,316 @@
+From 473dc16521c38ab7dcda5c63c62f1d7473b7b389 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Wed, 1 Apr 2015 17:17:01 +0200
+Subject: [PATCH gnumach 7/9] ipc: inline key ipc entry lookup functions
+
+Declare functions looking up IPC entries that were previously inlined
+manually with `static inline' so that they will be inlined into the
+fast paths by the compiler.
+
+* ipc/ipc_entry.c (ipc_entry_lookup, ipc_entry_get,
+ipc_entry_dealloc): Move functions...
+* ipc/ipc_space.h: ... here, and declare them as `static inline'.
+* ipc/ipc_entry.h: Drop associated declarations.
+---
+ ipc/ipc_entry.c | 119 -------------------------------------------------------
+ ipc/ipc_entry.h | 9 -----
+ ipc/ipc_space.h | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 120 insertions(+), 128 deletions(-)
+
+diff --git a/ipc/ipc_entry.c b/ipc/ipc_entry.c
+index 2d6e665..a5fe319 100644
+--- a/ipc/ipc_entry.c
++++ b/ipc/ipc_entry.c
+@@ -52,93 +52,6 @@
+ struct kmem_cache ipc_entry_cache;
+
+ /*
+- * Routine: ipc_entry_lookup
+- * Purpose:
+- * Searches for an entry, given its name.
+- * Conditions:
+- * The space must be read or write locked throughout.
+- * The space must be active.
+- */
+-
+-ipc_entry_t
+-ipc_entry_lookup(
+- ipc_space_t space,
+- mach_port_t name)
+-{
+- ipc_entry_t entry;
+-
+- assert(space->is_active);
+- entry = rdxtree_lookup(&space->is_map, (rdxtree_key_t) name);
+- if (entry != IE_NULL
+- && IE_BITS_TYPE(entry->ie_bits) == MACH_PORT_TYPE_NONE)
+- entry = NULL;
+- assert((entry == IE_NULL) || IE_BITS_TYPE(entry->ie_bits));
+- return entry;
+-}
+-
+-/*
+- * Routine: ipc_entry_get
+- * Purpose:
+- * Tries to allocate an entry out of the space.
+- * Conditions:
+- * The space is write-locked and active throughout.
+- * An object may be locked. Will not allocate memory.
+- * Returns:
+- * KERN_SUCCESS A free entry was found.
+- * KERN_NO_SPACE No entry allocated.
+- */
+-
+-kern_return_t
+-ipc_entry_get(
+- ipc_space_t space,
+- mach_port_t *namep,
+- ipc_entry_t *entryp)
+-{
+- mach_port_t new_name;
+- ipc_entry_t free_entry;
+-
+- assert(space->is_active);
+-
+- /* Get entry from the free list. */
+- free_entry = space->is_free_list;
+- if (free_entry == IE_NULL)
+- return KERN_NO_SPACE;
+-
+- space->is_free_list = free_entry->ie_next_free;
+- space->is_free_list_size -= 1;
+-
+- /*
+- * Initialize the new entry. We need only
+- * increment the generation number and clear ie_request.
+- */
+-
+- {
+- mach_port_gen_t gen;
+-
+- assert((free_entry->ie_bits &~ IE_BITS_GEN_MASK) == 0);
+- gen = free_entry->ie_bits + IE_BITS_GEN_ONE;
+- free_entry->ie_bits = gen;
+- free_entry->ie_request = 0;
+- new_name = MACH_PORT_MAKE(free_entry->ie_name, gen);
+- }
+-
+- /*
+- * The new name can't be MACH_PORT_NULL because index
+- * is non-zero. It can't be MACH_PORT_DEAD because
+- * the table isn't allowed to grow big enough.
+- * (See comment in ipc/ipc_table.h.)
+- */
+-
+- assert(MACH_PORT_VALID(new_name));
+- assert(free_entry->ie_object == IO_NULL);
+-
+- space->is_size += 1;
+- *namep = new_name;
+- *entryp = free_entry;
+- return KERN_SUCCESS;
+-}
+-
+-/*
+ * Routine: ipc_entry_alloc
+ * Purpose:
+ * Allocate an entry out of the space.
+@@ -293,38 +206,6 @@ ipc_entry_alloc_name(
+ return KERN_SUCCESS;
+ }
+
+-/*
+- * Routine: ipc_entry_dealloc
+- * Purpose:
+- * Deallocates an entry from a space.
+- * Conditions:
+- * The space must be write-locked throughout.
+- * The space must be active.
+- */
+-
+-void
+-ipc_entry_dealloc(
+- ipc_space_t space,
+- mach_port_t name,
+- ipc_entry_t entry)
+-{
+- assert(space->is_active);
+- assert(entry->ie_object == IO_NULL);
+- assert(entry->ie_request == 0);
+-
+- if (space->is_free_list_size < IS_FREE_LIST_SIZE_LIMIT) {
+- space->is_free_list_size += 1;
+- entry->ie_bits &= IE_BITS_GEN_MASK;
+- entry->ie_next_free = space->is_free_list;
+- space->is_free_list = entry;
+- } else {
+- rdxtree_remove(&space->is_map, (rdxtree_key_t) name);
+- ie_free(entry);
+- }
+- space->is_size -= 1;
+-}
+-
+-
+ #if MACH_KDB
+ #include <ddb/db_output.h>
+ #include <kern/task.h>
+diff --git a/ipc/ipc_entry.h b/ipc/ipc_entry.h
+index 451dc53..ee3c2d4 100644
+--- a/ipc/ipc_entry.h
++++ b/ipc/ipc_entry.h
+@@ -104,21 +104,12 @@ extern struct kmem_cache ipc_entry_cache;
+ #define ie_alloc() ((ipc_entry_t) kmem_cache_alloc(&ipc_entry_cache))
+ #define ie_free(e) kmem_cache_free(&ipc_entry_cache, (vm_offset_t) (e))
+
+-extern ipc_entry_t
+-ipc_entry_lookup(ipc_space_t space, mach_port_t name);
+-
+-extern kern_return_t
+-ipc_entry_get(ipc_space_t space, mach_port_t *namep, ipc_entry_t *entryp);
+-
+ extern kern_return_t
+ ipc_entry_alloc(ipc_space_t space, mach_port_t *namep, ipc_entry_t *entryp);
+
+ extern kern_return_t
+ ipc_entry_alloc_name(ipc_space_t space, mach_port_t name, ipc_entry_t *entryp);
+
+-extern void
+-ipc_entry_dealloc(ipc_space_t space, mach_port_t name, ipc_entry_t entry);
+-
+ ipc_entry_t
+ db_ipc_object_by_name(
+ task_t task,
+diff --git a/ipc/ipc_space.h b/ipc/ipc_space.h
+index c90a2a3..404f708 100644
+--- a/ipc/ipc_space.h
++++ b/ipc/ipc_space.h
+@@ -137,6 +137,126 @@ kern_return_t ipc_space_create(ipc_table_size_t, ipc_space_t *);
+ kern_return_t ipc_space_create_special(struct ipc_space **);
+ void ipc_space_destroy(struct ipc_space *);
+
++/* IPC entry lookups. */
++
++/*
++ * Routine: ipc_entry_lookup
++ * Purpose:
++ * Searches for an entry, given its name.
++ * Conditions:
++ * The space must be read or write locked throughout.
++ * The space must be active.
++ */
++
++static inline ipc_entry_t
++ipc_entry_lookup(
++ ipc_space_t space,
++ mach_port_t name)
++{
++ ipc_entry_t entry;
++
++ assert(space->is_active);
++ entry = rdxtree_lookup(&space->is_map, (rdxtree_key_t) name);
++ if (entry != IE_NULL
++ && IE_BITS_TYPE(entry->ie_bits) == MACH_PORT_TYPE_NONE)
++ entry = NULL;
++ assert((entry == IE_NULL) || IE_BITS_TYPE(entry->ie_bits));
++ return entry;
++}
++
++/*
++ * Routine: ipc_entry_get
++ * Purpose:
++ * Tries to allocate an entry out of the space.
++ * Conditions:
++ * The space is write-locked and active throughout.
++ * An object may be locked. Will not allocate memory.
++ * Returns:
++ * KERN_SUCCESS A free entry was found.
++ * KERN_NO_SPACE No entry allocated.
++ */
++
++static inline kern_return_t
++ipc_entry_get(
++ ipc_space_t space,
++ mach_port_t *namep,
++ ipc_entry_t *entryp)
++{
++ mach_port_t new_name;
++ ipc_entry_t free_entry;
++
++ assert(space->is_active);
++
++ /* Get entry from the free list. */
++ free_entry = space->is_free_list;
++ if (free_entry == IE_NULL)
++ return KERN_NO_SPACE;
++
++ space->is_free_list = free_entry->ie_next_free;
++ space->is_free_list_size -= 1;
++
++ /*
++ * Initialize the new entry. We need only
++ * increment the generation number and clear ie_request.
++ */
++
++ {
++ mach_port_gen_t gen;
++
++ assert((free_entry->ie_bits &~ IE_BITS_GEN_MASK) == 0);
++ gen = free_entry->ie_bits + IE_BITS_GEN_ONE;
++ free_entry->ie_bits = gen;
++ free_entry->ie_request = 0;
++ new_name = MACH_PORT_MAKE(free_entry->ie_name, gen);
++ }
++
++ /*
++ * The new name can't be MACH_PORT_NULL because index
++ * is non-zero. It can't be MACH_PORT_DEAD because
++ * the table isn't allowed to grow big enough.
++ * (See comment in ipc/ipc_table.h.)
++ */
++
++ assert(MACH_PORT_VALID(new_name));
++ assert(free_entry->ie_object == IO_NULL);
++
++ space->is_size += 1;
++ *namep = new_name;
++ *entryp = free_entry;
++ return KERN_SUCCESS;
++}
++
++/*
++ * Routine: ipc_entry_dealloc
++ * Purpose:
++ * Deallocates an entry from a space.
++ * Conditions:
++ * The space must be write-locked throughout.
++ * The space must be active.
++ */
++
++static inline void
++ipc_entry_dealloc(
++ ipc_space_t space,
++ mach_port_t name,
++ ipc_entry_t entry)
++{
++ assert(space->is_active);
++ assert(entry->ie_object == IO_NULL);
++ assert(entry->ie_request == 0);
++
++ if (space->is_free_list_size < IS_FREE_LIST_SIZE_LIMIT) {
++ space->is_free_list_size += 1;
++ entry->ie_bits &= IE_BITS_GEN_MASK;
++ entry->ie_next_free = space->is_free_list;
++ space->is_free_list = entry;
++ } else {
++ rdxtree_remove(&space->is_map, (rdxtree_key_t) name);
++ ie_free(entry);
++ }
++ space->is_size -= 1;
++}
++
+ /* Reverse lookups. */
+
+ /* Cast a pointer to a suitable key. */
+--
+2.1.4
+