aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-03-28 19:11:12 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-28 21:36:42 -0500
commitaa1757f90bea3f598b6e5d04d922a6a60200f1da (patch)
tree4f8f3804b2595031d0b84de7086dc28375290f0d /fs
parent1f09f9749cdde4e69f95d62d96d2e03f50b3353c (diff)
[PATCH] convert sighand_cache to use SLAB_DESTROY_BY_RCU
This patch borrows a clever Hugh's 'struct anon_vma' trick. Without tasklist_lock held we can't trust task->sighand until we locked it and re-checked that it is still the same. But this means we don't need to defer 'kmem_cache_free(sighand)'. We can return the memory to slab immediately, all we need is to be sure that sighand->siglock can't dissapear inside rcu protected section. To do so we need to initialize ->siglock inside ctor function, SLAB_DESTROY_BY_RCU does the rest. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/exec.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/fs/exec.c b/fs/exec.c
index 9046ad2b0614..950ebd43cdc3 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -768,7 +768,6 @@ no_thread_group:
768 /* 768 /*
769 * Move our state over to newsighand and switch it in. 769 * Move our state over to newsighand and switch it in.
770 */ 770 */
771 spin_lock_init(&newsighand->siglock);
772 atomic_set(&newsighand->count, 1); 771 atomic_set(&newsighand->count, 1);
773 memcpy(newsighand->action, oldsighand->action, 772 memcpy(newsighand->action, oldsighand->action,
774 sizeof(newsighand->action)); 773 sizeof(newsighand->action));
@@ -785,7 +784,7 @@ no_thread_group:
785 write_unlock_irq(&tasklist_lock); 784 write_unlock_irq(&tasklist_lock);
786 785
787 if (atomic_dec_and_test(&oldsighand->count)) 786 if (atomic_dec_and_test(&oldsighand->count))
788 sighand_free(oldsighand); 787 kmem_cache_free(sighand_cachep, oldsighand);
789 } 788 }
790 789
791 BUG_ON(!thread_group_leader(current)); 790 BUG_ON(!thread_group_leader(current));