.. | .. |
---|
529 | 529 | /* Clear state */ |
---|
530 | 530 | unix_state_lock(sk); |
---|
531 | 531 | sock_orphan(sk); |
---|
532 | | - sk->sk_shutdown = SHUTDOWN_MASK; |
---|
| 532 | + WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); |
---|
533 | 533 | path = u->path; |
---|
534 | 534 | u->path.dentry = NULL; |
---|
535 | 535 | u->path.mnt = NULL; |
---|
.. | .. |
---|
547 | 547 | if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { |
---|
548 | 548 | unix_state_lock(skpair); |
---|
549 | 549 | /* No more writes */ |
---|
550 | | - skpair->sk_shutdown = SHUTDOWN_MASK; |
---|
| 550 | + WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK); |
---|
551 | 551 | if (!skb_queue_empty(&sk->sk_receive_queue) || embrion) |
---|
552 | 552 | skpair->sk_err = ECONNRESET; |
---|
553 | 553 | unix_state_unlock(skpair); |
---|
.. | .. |
---|
587 | 587 | * What the above comment does talk about? --ANK(980817) |
---|
588 | 588 | */ |
---|
589 | 589 | |
---|
590 | | - if (unix_tot_inflight) |
---|
| 590 | + if (READ_ONCE(unix_tot_inflight)) |
---|
591 | 591 | unix_gc(); /* Garbage collect fds */ |
---|
592 | 592 | } |
---|
593 | 593 | |
---|
.. | .. |
---|
697 | 697 | if (mutex_lock_interruptible(&u->iolock)) |
---|
698 | 698 | return -EINTR; |
---|
699 | 699 | |
---|
700 | | - sk->sk_peek_off = val; |
---|
| 700 | + WRITE_ONCE(sk->sk_peek_off, val); |
---|
701 | 701 | mutex_unlock(&u->iolock); |
---|
702 | 702 | |
---|
703 | 703 | return 0; |
---|
.. | .. |
---|
1236 | 1236 | |
---|
1237 | 1237 | sched = !sock_flag(other, SOCK_DEAD) && |
---|
1238 | 1238 | !(other->sk_shutdown & RCV_SHUTDOWN) && |
---|
1239 | | - unix_recvq_full(other); |
---|
| 1239 | + unix_recvq_full_lockless(other); |
---|
1240 | 1240 | |
---|
1241 | 1241 | unix_state_unlock(other); |
---|
1242 | 1242 | |
---|
.. | .. |
---|
2008 | 2008 | |
---|
2009 | 2009 | if (false) { |
---|
2010 | 2010 | alloc_skb: |
---|
| 2011 | + spin_unlock(&other->sk_receive_queue.lock); |
---|
2011 | 2012 | unix_state_unlock(other); |
---|
2012 | 2013 | mutex_unlock(&unix_sk(other)->iolock); |
---|
2013 | 2014 | newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT, |
---|
.. | .. |
---|
2047 | 2048 | init_scm = false; |
---|
2048 | 2049 | } |
---|
2049 | 2050 | |
---|
| 2051 | + spin_lock(&other->sk_receive_queue.lock); |
---|
2050 | 2052 | skb = skb_peek_tail(&other->sk_receive_queue); |
---|
2051 | 2053 | if (tail && tail == skb) { |
---|
2052 | 2054 | skb = newskb; |
---|
.. | .. |
---|
2077 | 2079 | refcount_add(size, &sk->sk_wmem_alloc); |
---|
2078 | 2080 | |
---|
2079 | 2081 | if (newskb) { |
---|
2080 | | - err = unix_scm_to_skb(&scm, skb, false); |
---|
2081 | | - if (err) |
---|
2082 | | - goto err_state_unlock; |
---|
2083 | | - spin_lock(&other->sk_receive_queue.lock); |
---|
| 2082 | + unix_scm_to_skb(&scm, skb, false); |
---|
2084 | 2083 | __skb_queue_tail(&other->sk_receive_queue, newskb); |
---|
2085 | | - spin_unlock(&other->sk_receive_queue.lock); |
---|
2086 | 2084 | } |
---|
2087 | 2085 | |
---|
| 2086 | + spin_unlock(&other->sk_receive_queue.lock); |
---|
2088 | 2087 | unix_state_unlock(other); |
---|
2089 | 2088 | mutex_unlock(&unix_sk(other)->iolock); |
---|
2090 | 2089 | |
---|
.. | .. |
---|
2581 | 2580 | ++mode; |
---|
2582 | 2581 | |
---|
2583 | 2582 | unix_state_lock(sk); |
---|
2584 | | - sk->sk_shutdown |= mode; |
---|
| 2583 | + WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | mode); |
---|
2585 | 2584 | other = unix_peer(sk); |
---|
2586 | 2585 | if (other) |
---|
2587 | 2586 | sock_hold(other); |
---|
.. | .. |
---|
2598 | 2597 | if (mode&SEND_SHUTDOWN) |
---|
2599 | 2598 | peer_mode |= RCV_SHUTDOWN; |
---|
2600 | 2599 | unix_state_lock(other); |
---|
2601 | | - other->sk_shutdown |= peer_mode; |
---|
| 2600 | + WRITE_ONCE(other->sk_shutdown, other->sk_shutdown | peer_mode); |
---|
2602 | 2601 | unix_state_unlock(other); |
---|
2603 | 2602 | other->sk_state_change(other); |
---|
2604 | 2603 | if (peer_mode == SHUTDOWN_MASK) |
---|
.. | .. |
---|
2717 | 2716 | { |
---|
2718 | 2717 | struct sock *sk = sock->sk; |
---|
2719 | 2718 | __poll_t mask; |
---|
| 2719 | + u8 shutdown; |
---|
2720 | 2720 | |
---|
2721 | 2721 | sock_poll_wait(file, sock, wait); |
---|
2722 | 2722 | mask = 0; |
---|
| 2723 | + shutdown = READ_ONCE(sk->sk_shutdown); |
---|
2723 | 2724 | |
---|
2724 | 2725 | /* exceptional events? */ |
---|
2725 | 2726 | if (sk->sk_err) |
---|
2726 | 2727 | mask |= EPOLLERR; |
---|
2727 | | - if (sk->sk_shutdown == SHUTDOWN_MASK) |
---|
| 2728 | + if (shutdown == SHUTDOWN_MASK) |
---|
2728 | 2729 | mask |= EPOLLHUP; |
---|
2729 | | - if (sk->sk_shutdown & RCV_SHUTDOWN) |
---|
| 2730 | + if (shutdown & RCV_SHUTDOWN) |
---|
2730 | 2731 | mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
---|
2731 | 2732 | |
---|
2732 | 2733 | /* readable? */ |
---|
.. | .. |
---|
2754 | 2755 | struct sock *sk = sock->sk, *other; |
---|
2755 | 2756 | unsigned int writable; |
---|
2756 | 2757 | __poll_t mask; |
---|
| 2758 | + u8 shutdown; |
---|
2757 | 2759 | |
---|
2758 | 2760 | sock_poll_wait(file, sock, wait); |
---|
2759 | 2761 | mask = 0; |
---|
| 2762 | + shutdown = READ_ONCE(sk->sk_shutdown); |
---|
2760 | 2763 | |
---|
2761 | 2764 | /* exceptional events? */ |
---|
2762 | 2765 | if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue)) |
---|
2763 | 2766 | mask |= EPOLLERR | |
---|
2764 | 2767 | (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0); |
---|
2765 | 2768 | |
---|
2766 | | - if (sk->sk_shutdown & RCV_SHUTDOWN) |
---|
| 2769 | + if (shutdown & RCV_SHUTDOWN) |
---|
2767 | 2770 | mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
---|
2768 | | - if (sk->sk_shutdown == SHUTDOWN_MASK) |
---|
| 2771 | + if (shutdown == SHUTDOWN_MASK) |
---|
2769 | 2772 | mask |= EPOLLHUP; |
---|
2770 | 2773 | |
---|
2771 | 2774 | /* readable? */ |
---|