mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
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 <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
61881cfb5a
commit
1e1d04e678
@ -1360,6 +1360,14 @@ do { \
|
|||||||
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
|
lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
static bool lockdep_sock_is_held(const struct sock *csk)
|
||||||
|
{
|
||||||
|
struct sock *sk = (struct sock *)csk;
|
||||||
|
|
||||||
|
return lockdep_is_held(&sk->sk_lock) ||
|
||||||
|
lockdep_is_held(&sk->sk_lock.slock);
|
||||||
|
}
|
||||||
|
|
||||||
void lock_sock_nested(struct sock *sk, int subclass);
|
void lock_sock_nested(struct sock *sk, int subclass);
|
||||||
|
|
||||||
static inline void lock_sock(struct sock *sk)
|
static inline void lock_sock(struct sock *sk)
|
||||||
@ -1598,8 +1606,8 @@ static inline void sk_rethink_txhash(struct sock *sk)
|
|||||||
static inline struct dst_entry *
|
static inline struct dst_entry *
|
||||||
__sk_dst_get(struct sock *sk)
|
__sk_dst_get(struct sock *sk)
|
||||||
{
|
{
|
||||||
return rcu_dereference_check(sk->sk_dst_cache, sock_owned_by_user(sk) ||
|
return rcu_dereference_check(sk->sk_dst_cache,
|
||||||
lockdep_is_held(&sk->sk_lock.slock));
|
lockdep_sock_is_held(sk));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct dst_entry *
|
static inline struct dst_entry *
|
||||||
|
@ -62,7 +62,7 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|||||||
nexthop = daddr = usin->sin_addr.s_addr;
|
nexthop = daddr = usin->sin_addr.s_addr;
|
||||||
|
|
||||||
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
||||||
sock_owned_by_user(sk));
|
lockdep_sock_is_held(sk));
|
||||||
if (inet_opt != NULL && inet_opt->opt.srr) {
|
if (inet_opt != NULL && inet_opt->opt.srr) {
|
||||||
if (daddr == 0)
|
if (daddr == 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -868,7 +868,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||||||
fl6.fl6_sport = inet->inet_sport;
|
fl6.fl6_sport = inet->inet_sport;
|
||||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||||
|
|
||||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
|
||||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||||
|
|
||||||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
|
dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
|
||||||
|
@ -1107,7 +1107,7 @@ static int inet_sk_reselect_saddr(struct sock *sk)
|
|||||||
struct ip_options_rcu *inet_opt;
|
struct ip_options_rcu *inet_opt;
|
||||||
|
|
||||||
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
||||||
sock_owned_by_user(sk));
|
lockdep_sock_is_held(sk));
|
||||||
if (inet_opt && inet_opt->opt.srr)
|
if (inet_opt && inet_opt->opt.srr)
|
||||||
daddr = inet_opt->opt.faddr;
|
daddr = inet_opt->opt.faddr;
|
||||||
|
|
||||||
|
@ -1933,7 +1933,8 @@ int cipso_v4_sock_setattr(struct sock *sk,
|
|||||||
|
|
||||||
sk_inet = inet_sk(sk);
|
sk_inet = inet_sk(sk);
|
||||||
|
|
||||||
old = rcu_dereference_protected(sk_inet->inet_opt, sock_owned_by_user(sk));
|
old = rcu_dereference_protected(sk_inet->inet_opt,
|
||||||
|
lockdep_sock_is_held(sk));
|
||||||
if (sk_inet->is_icsk) {
|
if (sk_inet->is_icsk) {
|
||||||
sk_conn = inet_csk(sk);
|
sk_conn = inet_csk(sk);
|
||||||
if (old)
|
if (old)
|
||||||
|
@ -642,7 +642,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
|||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
old = rcu_dereference_protected(inet->inet_opt,
|
old = rcu_dereference_protected(inet->inet_opt,
|
||||||
sock_owned_by_user(sk));
|
lockdep_sock_is_held(sk));
|
||||||
if (inet->is_icsk) {
|
if (inet->is_icsk) {
|
||||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
@ -1302,7 +1302,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
|
|||||||
struct ip_options_rcu *inet_opt;
|
struct ip_options_rcu *inet_opt;
|
||||||
|
|
||||||
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
||||||
sock_owned_by_user(sk));
|
lockdep_sock_is_held(sk));
|
||||||
opt->optlen = 0;
|
opt->optlen = 0;
|
||||||
if (inet_opt)
|
if (inet_opt)
|
||||||
memcpy(optbuf, &inet_opt->opt,
|
memcpy(optbuf, &inet_opt->opt,
|
||||||
|
@ -157,7 +157,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|||||||
|
|
||||||
nexthop = daddr = usin->sin_addr.s_addr;
|
nexthop = daddr = usin->sin_addr.s_addr;
|
||||||
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
inet_opt = rcu_dereference_protected(inet->inet_opt,
|
||||||
sock_owned_by_user(sk));
|
lockdep_sock_is_held(sk));
|
||||||
if (inet_opt && inet_opt->opt.srr) {
|
if (inet_opt && inet_opt->opt.srr) {
|
||||||
if (!daddr)
|
if (!daddr)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -882,8 +882,7 @@ struct tcp_md5sig_key *tcp_md5_do_lookup(const struct sock *sk,
|
|||||||
|
|
||||||
/* caller either holds rcu_read_lock() or socket lock */
|
/* caller either holds rcu_read_lock() or socket lock */
|
||||||
md5sig = rcu_dereference_check(tp->md5sig_info,
|
md5sig = rcu_dereference_check(tp->md5sig_info,
|
||||||
sock_owned_by_user(sk) ||
|
lockdep_sock_is_held(sk));
|
||||||
lockdep_is_held((spinlock_t *)&sk->sk_lock.slock));
|
|
||||||
if (!md5sig)
|
if (!md5sig)
|
||||||
return NULL;
|
return NULL;
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
@ -928,8 +927,7 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
||||||
sock_owned_by_user(sk) ||
|
lockdep_sock_is_held(sk));
|
||||||
lockdep_is_held(&sk->sk_lock.slock));
|
|
||||||
if (!md5sig) {
|
if (!md5sig) {
|
||||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||||
if (!md5sig)
|
if (!md5sig)
|
||||||
|
@ -407,7 +407,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||||||
if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
|
if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
opt = rcu_dereference_protected(np->opt,
|
||||||
|
lockdep_sock_is_held(sk));
|
||||||
opt = ipv6_renew_options(sk, opt, optname,
|
opt = ipv6_renew_options(sk, opt, optname,
|
||||||
(struct ipv6_opt_hdr __user *)optval,
|
(struct ipv6_opt_hdr __user *)optval,
|
||||||
optlen);
|
optlen);
|
||||||
@ -1124,7 +1125,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||||||
struct ipv6_txoptions *opt;
|
struct ipv6_txoptions *opt;
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
opt = rcu_dereference_protected(np->opt,
|
||||||
|
lockdep_sock_is_held(sk));
|
||||||
len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len);
|
len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len);
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
/* check if ipv6_getsockopt_sticky() returns err code */
|
/* check if ipv6_getsockopt_sticky() returns err code */
|
||||||
|
@ -234,7 +234,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||||||
fl6.fl6_dport = usin->sin6_port;
|
fl6.fl6_dport = usin->sin6_port;
|
||||||
fl6.fl6_sport = inet->inet_sport;
|
fl6.fl6_sport = inet->inet_sport;
|
||||||
|
|
||||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
|
||||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||||
|
|
||||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||||
|
@ -1046,7 +1046,7 @@ static int sock_fasync(int fd, struct file *filp, int on)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
wq = rcu_dereference_protected(sock->wq, sock_owned_by_user(sk));
|
wq = rcu_dereference_protected(sock->wq, lockdep_sock_is_held(sk));
|
||||||
fasync_helper(fd, filp, on, &wq->fasync_list);
|
fasync_helper(fd, filp, on, &wq->fasync_list);
|
||||||
|
|
||||||
if (!wq->fasync_list)
|
if (!wq->fasync_list)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user