From 4934e7c3735dbd25953c922a1327a875f47046a4 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: 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 2d6e6658..a5fe319f 100644 --- a/ipc/ipc_entry.c +++ b/ipc/ipc_entry.c @@ -51,93 +51,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: @@ -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 5c1f8fd4..b429984b 100644 --- a/ipc/ipc_entry.h +++ b/ipc/ipc_entry.h @@ -96,21 +96,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 20b9d57d..58fe47c4 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. */ -- cgit v1.2.3