From e1f5eff1bc535368306700e97a4e6b7dea3d4eb7 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Mon, 13 Apr 2015 16:29:00 +0200 Subject: add patch series --- ...ipc-inline-key-ipc-entry-lookup-functions.patch | 316 +++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch (limited to 'debian/patches/0007-ipc-inline-key-ipc-entry-lookup-functions.patch') 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 + #include +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 + -- cgit v1.2.3