Skip to content

Commit 1e1d04e

Browse files
strssndktndavem330
authored andcommitted
net: introduce lockdep_is_held and update various places to use it
The socket is either locked if we hold the slock spin_lock for lock_sock_fast and unlock_sock_fast or we own the lock (sk_lock.owned != 0). Check for this and at the same time improve that the current thread/cpu is really holding the lock. Signed-off-by: Hannes Frederic Sowa <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 61881cf commit 1e1d04e

File tree

10 files changed

+26
-17
lines changed

10 files changed

+26
-17
lines changed

include/net/sock.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,14 @@ do { \
13601360
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
13611361
} while (0)
13621362

1363+
static bool lockdep_sock_is_held(const struct sock *csk)
1364+
{
1365+
struct sock *sk = (struct sock *)csk;
1366+
1367+
return lockdep_is_held(&sk->sk_lock) ||
1368+
lockdep_is_held(&sk->sk_lock.slock);
1369+
}
1370+
13631371
void lock_sock_nested(struct sock *sk, int subclass);
13641372

13651373
static inline void lock_sock(struct sock *sk)
@@ -1598,8 +1606,8 @@ static inline void sk_rethink_txhash(struct sock *sk)
15981606
static inline struct dst_entry *
15991607
__sk_dst_get(struct sock *sk)
16001608
{
1601-
return rcu_dereference_check(sk->sk_dst_cache, sock_owned_by_user(sk) ||
1602-
lockdep_is_held(&sk->sk_lock.slock));
1609+
return rcu_dereference_check(sk->sk_dst_cache,
1610+
lockdep_sock_is_held(sk));
16031611
}
16041612

16051613
static inline struct dst_entry *

net/dccp/ipv4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
6262
nexthop = daddr = usin->sin_addr.s_addr;
6363

6464
inet_opt = rcu_dereference_protected(inet->inet_opt,
65-
sock_owned_by_user(sk));
65+
lockdep_sock_is_held(sk));
6666
if (inet_opt != NULL && inet_opt->opt.srr) {
6767
if (daddr == 0)
6868
return -EINVAL;

net/dccp/ipv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
868868
fl6.fl6_sport = inet->inet_sport;
869869
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
870870

871-
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
871+
opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
872872
final_p = fl6_update_dst(&fl6, opt, &final);
873873

874874
dst = ip6_dst_lookup_flow(sk, &fl6, final_p);

net/ipv4/af_inet.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1107,7 +1107,7 @@ static int inet_sk_reselect_saddr(struct sock *sk)
11071107
struct ip_options_rcu *inet_opt;
11081108

11091109
inet_opt = rcu_dereference_protected(inet->inet_opt,
1110-
sock_owned_by_user(sk));
1110+
lockdep_sock_is_held(sk));
11111111
if (inet_opt && inet_opt->opt.srr)
11121112
daddr = inet_opt->opt.faddr;
11131113

net/ipv4/cipso_ipv4.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,8 @@ int cipso_v4_sock_setattr(struct sock *sk,
19331933

19341934
sk_inet = inet_sk(sk);
19351935

1936-
old = rcu_dereference_protected(sk_inet->inet_opt, sock_owned_by_user(sk));
1936+
old = rcu_dereference_protected(sk_inet->inet_opt,
1937+
lockdep_sock_is_held(sk));
19371938
if (sk_inet->is_icsk) {
19381939
sk_conn = inet_csk(sk);
19391940
if (old)

net/ipv4/ip_sockglue.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
642642
if (err)
643643
break;
644644
old = rcu_dereference_protected(inet->inet_opt,
645-
sock_owned_by_user(sk));
645+
lockdep_sock_is_held(sk));
646646
if (inet->is_icsk) {
647647
struct inet_connection_sock *icsk = inet_csk(sk);
648648
#if IS_ENABLED(CONFIG_IPV6)
@@ -1302,7 +1302,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
13021302
struct ip_options_rcu *inet_opt;
13031303

13041304
inet_opt = rcu_dereference_protected(inet->inet_opt,
1305-
sock_owned_by_user(sk));
1305+
lockdep_sock_is_held(sk));
13061306
opt->optlen = 0;
13071307
if (inet_opt)
13081308
memcpy(optbuf, &inet_opt->opt,

net/ipv4/tcp_ipv4.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
157157

158158
nexthop = daddr = usin->sin_addr.s_addr;
159159
inet_opt = rcu_dereference_protected(inet->inet_opt,
160-
sock_owned_by_user(sk));
160+
lockdep_sock_is_held(sk));
161161
if (inet_opt && inet_opt->opt.srr) {
162162
if (!daddr)
163163
return -EINVAL;
@@ -882,8 +882,7 @@ struct tcp_md5sig_key *tcp_md5_do_lookup(const struct sock *sk,
882882

883883
/* caller either holds rcu_read_lock() or socket lock */
884884
md5sig = rcu_dereference_check(tp->md5sig_info,
885-
sock_owned_by_user(sk) ||
886-
lockdep_is_held((spinlock_t *)&sk->sk_lock.slock));
885+
lockdep_sock_is_held(sk));
887886
if (!md5sig)
888887
return NULL;
889888
#if IS_ENABLED(CONFIG_IPV6)
@@ -928,8 +927,7 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
928927
}
929928

930929
md5sig = rcu_dereference_protected(tp->md5sig_info,
931-
sock_owned_by_user(sk) ||
932-
lockdep_is_held(&sk->sk_lock.slock));
930+
lockdep_sock_is_held(sk));
933931
if (!md5sig) {
934932
md5sig = kmalloc(sizeof(*md5sig), gfp);
935933
if (!md5sig)

net/ipv6/ipv6_sockglue.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
407407
if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
408408
break;
409409

410-
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
410+
opt = rcu_dereference_protected(np->opt,
411+
lockdep_sock_is_held(sk));
411412
opt = ipv6_renew_options(sk, opt, optname,
412413
(struct ipv6_opt_hdr __user *)optval,
413414
optlen);
@@ -1124,7 +1125,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
11241125
struct ipv6_txoptions *opt;
11251126

11261127
lock_sock(sk);
1127-
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
1128+
opt = rcu_dereference_protected(np->opt,
1129+
lockdep_sock_is_held(sk));
11281130
len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len);
11291131
release_sock(sk);
11301132
/* check if ipv6_getsockopt_sticky() returns err code */

net/ipv6/tcp_ipv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
234234
fl6.fl6_dport = usin->sin6_port;
235235
fl6.fl6_sport = inet->inet_sport;
236236

237-
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
237+
opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
238238
final_p = fl6_update_dst(&fl6, opt, &final);
239239

240240
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));

net/socket.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ static int sock_fasync(int fd, struct file *filp, int on)
10461046
return -EINVAL;
10471047

10481048
lock_sock(sk);
1049-
wq = rcu_dereference_protected(sock->wq, sock_owned_by_user(sk));
1049+
wq = rcu_dereference_protected(sock->wq, lockdep_sock_is_held(sk));
10501050
fasync_helper(fd, filp, on, &wq->fasync_list);
10511051

10521052
if (!wq->fasync_list)

0 commit comments

Comments
 (0)