Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a09785a2 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds
Browse files

[PATCH] lockdep: annotate af_unix locking



Teach special (recursive) locking code to the lock validator.  Also splits
af_unix's sk_receive_queue.lock class from the other networking skb-queue
locks.  Has no effect on non-lockdep kernels.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent da21f24d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -67,6 +67,9 @@ struct unix_skb_parms {
#define unix_state_rlock(s)	spin_lock(&unix_sk(s)->lock)
#define unix_state_runlock(s)	spin_unlock(&unix_sk(s)->lock)
#define unix_state_wlock(s)	spin_lock(&unix_sk(s)->lock)
#define unix_state_wlock_nested(s) \
				spin_lock_nested(&unix_sk(s)->lock, \
				SINGLE_DEPTH_NESTING)
#define unix_state_wunlock(s)	spin_unlock(&unix_sk(s)->lock)

#ifdef __KERNEL__
+11 −1
Original line number Diff line number Diff line
@@ -565,6 +565,14 @@ static struct proto unix_proto = {
	.obj_size = sizeof(struct unix_sock),
};

/*
 * AF_UNIX sockets do not interact with hardware, hence they
 * dont trigger interrupts - so it's safe for them to have
 * bh-unsafe locking for their sk_receive_queue.lock. Split off
 * this special lock-class by reinitializing the spinlock key:
 */
static struct lock_class_key af_unix_sk_receive_queue_lock_key;

static struct sock * unix_create1(struct socket *sock)
{
	struct sock *sk = NULL;
@@ -580,6 +588,8 @@ static struct sock * unix_create1(struct socket *sock)
	atomic_inc(&unix_nr_socks);

	sock_init_data(sock,sk);
	lockdep_set_class(&sk->sk_receive_queue.lock,
				&af_unix_sk_receive_queue_lock_key);

	sk->sk_write_space	= unix_write_space;
	sk->sk_max_ack_backlog	= sysctl_unix_max_dgram_qlen;
@@ -1045,7 +1055,7 @@ restart:
		goto out_unlock;
	}

	unix_state_wlock(sk);
	unix_state_wlock_nested(sk);

	if (sk->sk_state != st) {
		unix_state_wunlock(sk);