diff options
Diffstat (limited to 'kernel/pid.c')
-rw-r--r-- | kernel/pid.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/kernel/pid.c b/kernel/pid.c index 477691576b33..b322cdf401bf 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
@@ -111,10 +111,11 @@ EXPORT_SYMBOL(is_container_init); | |||
111 | 111 | ||
112 | static __cacheline_aligned_in_smp DEFINE_SPINLOCK(pidmap_lock); | 112 | static __cacheline_aligned_in_smp DEFINE_SPINLOCK(pidmap_lock); |
113 | 113 | ||
114 | static void free_pidmap(struct pid_namespace *pid_ns, int pid) | 114 | static void free_pidmap(struct upid *upid) |
115 | { | 115 | { |
116 | struct pidmap *map = pid_ns->pidmap + pid / BITS_PER_PAGE; | 116 | int nr = upid->nr; |
117 | int offset = pid & BITS_PER_PAGE_MASK; | 117 | struct pidmap *map = upid->ns->pidmap + nr / BITS_PER_PAGE; |
118 | int offset = nr & BITS_PER_PAGE_MASK; | ||
118 | 119 | ||
119 | clear_bit(offset, map->page); | 120 | clear_bit(offset, map->page); |
120 | atomic_inc(&map->nr_free); | 121 | atomic_inc(&map->nr_free); |
@@ -232,7 +233,7 @@ void free_pid(struct pid *pid) | |||
232 | spin_unlock_irqrestore(&pidmap_lock, flags); | 233 | spin_unlock_irqrestore(&pidmap_lock, flags); |
233 | 234 | ||
234 | for (i = 0; i <= pid->level; i++) | 235 | for (i = 0; i <= pid->level; i++) |
235 | free_pidmap(pid->numbers[i].ns, pid->numbers[i].nr); | 236 | free_pidmap(pid->numbers + i); |
236 | 237 | ||
237 | call_rcu(&pid->rcu, delayed_put_pid); | 238 | call_rcu(&pid->rcu, delayed_put_pid); |
238 | } | 239 | } |
@@ -278,8 +279,8 @@ out: | |||
278 | return pid; | 279 | return pid; |
279 | 280 | ||
280 | out_free: | 281 | out_free: |
281 | for (i++; i <= ns->level; i++) | 282 | while (++i <= ns->level) |
282 | free_pidmap(pid->numbers[i].ns, pid->numbers[i].nr); | 283 | free_pidmap(pid->numbers + i); |
283 | 284 | ||
284 | kmem_cache_free(ns->pid_cachep, pid); | 285 | kmem_cache_free(ns->pid_cachep, pid); |
285 | pid = NULL; | 286 | pid = NULL; |