Commit 5191a147 authored by Ingo Molnar's avatar Ingo Molnar

[PATCH] pidhash-2.5.38-A0

This removes the cmpxchg from the PID allocator and replaces it with a
spinlock.  This spinlock is hit only a couple of times per bootup, so
it's not a performance issue.
parent a16435af
...@@ -53,6 +53,8 @@ static pidmap_t pidmap_array[PIDMAP_ENTRIES] = ...@@ -53,6 +53,8 @@ static pidmap_t pidmap_array[PIDMAP_ENTRIES] =
static pidmap_t *map_limit = pidmap_array + PIDMAP_ENTRIES; static pidmap_t *map_limit = pidmap_array + PIDMAP_ENTRIES;
static spinlock_t pidmap_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
inline void free_pidmap(int pid) inline void free_pidmap(int pid)
{ {
pidmap_t *map = pidmap_array + pid / BITS_PER_PAGE; pidmap_t *map = pidmap_array + pid / BITS_PER_PAGE;
...@@ -77,8 +79,13 @@ static inline pidmap_t *next_free_map(pidmap_t *map, int *max_steps) ...@@ -77,8 +79,13 @@ static inline pidmap_t *next_free_map(pidmap_t *map, int *max_steps)
* Free the page if someone raced with us * Free the page if someone raced with us
* installing it: * installing it:
*/ */
if (cmpxchg(&map->page, NULL, (void *) page)) spin_lock(&pidmap_lock);
if (map->page)
free_page(page); free_page(page);
else
map->page = (void *)page;
spin_unlock(&pidmap_lock);
if (!map->page) if (!map->page)
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment