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>
This commit is contained in:
parent
e1e4dd0caa
commit
a6a5349d17
|
@ -29,6 +29,10 @@ static char tag_msg = CEPH_MSGR_TAG_MSG;
|
||||||
static char tag_ack = CEPH_MSGR_TAG_ACK;
|
static char tag_ack = CEPH_MSGR_TAG_ACK;
|
||||||
static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE;
|
static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE;
|
||||||
|
|
||||||
|
#ifdef CONFIG_LOCKDEP
|
||||||
|
static struct lock_class_key socket_class;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void queue_con(struct ceph_connection *con);
|
static void queue_con(struct ceph_connection *con);
|
||||||
static void con_work(struct work_struct *);
|
static void con_work(struct work_struct *);
|
||||||
|
@ -227,6 +231,10 @@ static struct socket *ceph_tcp_connect(struct ceph_connection *con)
|
||||||
con->sock = sock;
|
con->sock = sock;
|
||||||
sock->sk->sk_allocation = GFP_NOFS;
|
sock->sk->sk_allocation = GFP_NOFS;
|
||||||
|
|
||||||
|
#ifdef CONFIG_LOCKDEP
|
||||||
|
lockdep_set_class(&sock->sk->sk_lock, &socket_class);
|
||||||
|
#endif
|
||||||
|
|
||||||
set_sock_callbacks(sock, con);
|
set_sock_callbacks(sock, con);
|
||||||
|
|
||||||
dout("connect %s\n", pr_addr(&con->peer_addr.in_addr));
|
dout("connect %s\n", pr_addr(&con->peer_addr.in_addr));
|
||||||
|
|
Loading…
Reference in New Issue