hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/net/unix/af_unix.c
....@@ -529,7 +529,7 @@
529529 /* Clear state */
530530 unix_state_lock(sk);
531531 sock_orphan(sk);
532
- sk->sk_shutdown = SHUTDOWN_MASK;
532
+ WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
533533 path = u->path;
534534 u->path.dentry = NULL;
535535 u->path.mnt = NULL;
....@@ -547,7 +547,7 @@
547547 if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
548548 unix_state_lock(skpair);
549549 /* No more writes */
550
- skpair->sk_shutdown = SHUTDOWN_MASK;
550
+ WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK);
551551 if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
552552 skpair->sk_err = ECONNRESET;
553553 unix_state_unlock(skpair);
....@@ -587,7 +587,7 @@
587587 * What the above comment does talk about? --ANK(980817)
588588 */
589589
590
- if (unix_tot_inflight)
590
+ if (READ_ONCE(unix_tot_inflight))
591591 unix_gc(); /* Garbage collect fds */
592592 }
593593
....@@ -697,7 +697,7 @@
697697 if (mutex_lock_interruptible(&u->iolock))
698698 return -EINTR;
699699
700
- sk->sk_peek_off = val;
700
+ WRITE_ONCE(sk->sk_peek_off, val);
701701 mutex_unlock(&u->iolock);
702702
703703 return 0;
....@@ -1236,7 +1236,7 @@
12361236
12371237 sched = !sock_flag(other, SOCK_DEAD) &&
12381238 !(other->sk_shutdown & RCV_SHUTDOWN) &&
1239
- unix_recvq_full(other);
1239
+ unix_recvq_full_lockless(other);
12401240
12411241 unix_state_unlock(other);
12421242
....@@ -2008,6 +2008,7 @@
20082008
20092009 if (false) {
20102010 alloc_skb:
2011
+ spin_unlock(&other->sk_receive_queue.lock);
20112012 unix_state_unlock(other);
20122013 mutex_unlock(&unix_sk(other)->iolock);
20132014 newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
....@@ -2047,6 +2048,7 @@
20472048 init_scm = false;
20482049 }
20492050
2051
+ spin_lock(&other->sk_receive_queue.lock);
20502052 skb = skb_peek_tail(&other->sk_receive_queue);
20512053 if (tail && tail == skb) {
20522054 skb = newskb;
....@@ -2077,14 +2079,11 @@
20772079 refcount_add(size, &sk->sk_wmem_alloc);
20782080
20792081 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);
20842083 __skb_queue_tail(&other->sk_receive_queue, newskb);
2085
- spin_unlock(&other->sk_receive_queue.lock);
20862084 }
20872085
2086
+ spin_unlock(&other->sk_receive_queue.lock);
20882087 unix_state_unlock(other);
20892088 mutex_unlock(&unix_sk(other)->iolock);
20902089
....@@ -2581,7 +2580,7 @@
25812580 ++mode;
25822581
25832582 unix_state_lock(sk);
2584
- sk->sk_shutdown |= mode;
2583
+ WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | mode);
25852584 other = unix_peer(sk);
25862585 if (other)
25872586 sock_hold(other);
....@@ -2598,7 +2597,7 @@
25982597 if (mode&SEND_SHUTDOWN)
25992598 peer_mode |= RCV_SHUTDOWN;
26002599 unix_state_lock(other);
2601
- other->sk_shutdown |= peer_mode;
2600
+ WRITE_ONCE(other->sk_shutdown, other->sk_shutdown | peer_mode);
26022601 unix_state_unlock(other);
26032602 other->sk_state_change(other);
26042603 if (peer_mode == SHUTDOWN_MASK)
....@@ -2717,16 +2716,18 @@
27172716 {
27182717 struct sock *sk = sock->sk;
27192718 __poll_t mask;
2719
+ u8 shutdown;
27202720
27212721 sock_poll_wait(file, sock, wait);
27222722 mask = 0;
2723
+ shutdown = READ_ONCE(sk->sk_shutdown);
27232724
27242725 /* exceptional events? */
27252726 if (sk->sk_err)
27262727 mask |= EPOLLERR;
2727
- if (sk->sk_shutdown == SHUTDOWN_MASK)
2728
+ if (shutdown == SHUTDOWN_MASK)
27282729 mask |= EPOLLHUP;
2729
- if (sk->sk_shutdown & RCV_SHUTDOWN)
2730
+ if (shutdown & RCV_SHUTDOWN)
27302731 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
27312732
27322733 /* readable? */
....@@ -2754,18 +2755,20 @@
27542755 struct sock *sk = sock->sk, *other;
27552756 unsigned int writable;
27562757 __poll_t mask;
2758
+ u8 shutdown;
27572759
27582760 sock_poll_wait(file, sock, wait);
27592761 mask = 0;
2762
+ shutdown = READ_ONCE(sk->sk_shutdown);
27602763
27612764 /* exceptional events? */
27622765 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
27632766 mask |= EPOLLERR |
27642767 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
27652768
2766
- if (sk->sk_shutdown & RCV_SHUTDOWN)
2769
+ if (shutdown & RCV_SHUTDOWN)
27672770 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
2768
- if (sk->sk_shutdown == SHUTDOWN_MASK)
2771
+ if (shutdown == SHUTDOWN_MASK)
27692772 mask |= EPOLLHUP;
27702773
27712774 /* readable? */