diff options
author | Patrick McHardy <kaber@trash.net> | 2005-09-06 19:47:50 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-09-06 19:47:50 -0700 |
commit | 0a3f4358ac6283fe3a565183eaf9716de28b6fd0 (patch) | |
tree | c325ab565db7956b966f391714c9155d0aacc83f | |
parent | 48bc41a49c4f3aa760dff84e7f71437f5ed520fe (diff) | |
download | lwn-0a3f4358ac6283fe3a565183eaf9716de28b6fd0.tar.gz lwn-0a3f4358ac6283fe3a565183eaf9716de28b6fd0.zip |
[NET]: proto_unregister: fix sleeping while atomic
proto_unregister holds a lock while calling kmem_cache_destroy, which
can sleep.
Noticed by Daniele Orlandi <daniele@orlandi.com>.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/sock.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index b32b1815ae5a..ac63b56e23b2 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1529,6 +1529,8 @@ EXPORT_SYMBOL(proto_register); void proto_unregister(struct proto *prot) { write_lock(&proto_list_lock); + list_del(&prot->node); + write_unlock(&proto_list_lock); if (prot->slab != NULL) { kmem_cache_destroy(prot->slab); @@ -1550,9 +1552,6 @@ void proto_unregister(struct proto *prot) kfree(name); prot->twsk_slab = NULL; } - - list_del(&prot->node); - write_unlock(&proto_list_lock); } EXPORT_SYMBOL(proto_unregister); |