diff options
author | Sage Weil <sage@newdream.net> | 2010-04-13 17:07:07 -0400 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-04-13 17:07:07 -0400 |
commit | a6a5349d17f2a5c37079826f1a1474c3d08c6b53 (patch) | |
tree | 3b37dadbf297abdd65b3f63ac8e94a6137098198 /fs/ceph/messenger.c | |
parent | e1e4dd0caa63e166afa46a1ccc947bebb4f66bcf (diff) |
ceph: use separate class for ceph sockets' sk_lock
Use a separate class for ceph sockets to prevent lockdep confusion.
Because ceph sockets only get passed kernel pointers, there is no
dependency from sk_lock -> mmap_sem. If we share the same class as other
sockets, lockdep detects a circular dependency from
mmap_sem (page fault) -> fs mutex -> sk_lock -> mmap_sem
because dependencies are noted from both ceph and user contexts. Using
a separate class prevents the sk_lock(ceph) -> mmap_sem dependency and
makes lockdep happy.
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/messenger.c')
-rw-r--r-- | fs/ceph/messenger.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index f35b4945a9c3..5c75d5d32b27 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
@@ -29,6 +29,10 @@ static char tag_msg = CEPH_MSGR_TAG_MSG; | |||
29 | static char tag_ack = CEPH_MSGR_TAG_ACK; | 29 | static char tag_ack = CEPH_MSGR_TAG_ACK; |
30 | static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE; | 30 | static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE; |
31 | 31 | ||
32 | #ifdef CONFIG_LOCKDEP | ||
33 | static struct lock_class_key socket_class; | ||
34 | #endif | ||
35 | |||
32 | 36 | ||
33 | static void queue_con(struct ceph_connection *con); | 37 | static void queue_con(struct ceph_connection *con); |
34 | static void con_work(struct work_struct *); | 38 | static void con_work(struct work_struct *); |
@@ -227,6 +231,10 @@ static struct socket *ceph_tcp_connect(struct ceph_connection *con) | |||
227 | con->sock = sock; | 231 | con->sock = sock; |
228 | sock->sk->sk_allocation = GFP_NOFS; | 232 | sock->sk->sk_allocation = GFP_NOFS; |
229 | 233 | ||
234 | #ifdef CONFIG_LOCKDEP | ||
235 | lockdep_set_class(&sock->sk->sk_lock, &socket_class); | ||
236 | #endif | ||
237 | |||
230 | set_sock_callbacks(sock, con); | 238 | set_sock_callbacks(sock, con); |
231 | 239 | ||
232 | dout("connect %s\n", pr_addr(&con->peer_addr.in_addr)); | 240 | dout("connect %s\n", pr_addr(&con->peer_addr.in_addr)); |