@@ -807,18 +807,21 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
807
807
{
808
808
struct sock * sk = sock -> sk ;
809
809
__poll_t mask ;
810
+ u8 shutdown ;
810
811
811
812
sock_poll_wait (file , sock , wait );
812
813
mask = 0 ;
813
814
814
815
/* exceptional events? */
815
- if (sk -> sk_err || !skb_queue_empty_lockless (& sk -> sk_error_queue ))
816
+ if (READ_ONCE (sk -> sk_err ) ||
817
+ !skb_queue_empty_lockless (& sk -> sk_error_queue ))
816
818
mask |= EPOLLERR |
817
819
(sock_flag (sk , SOCK_SELECT_ERR_QUEUE ) ? EPOLLPRI : 0 );
818
820
819
- if (sk -> sk_shutdown & RCV_SHUTDOWN )
821
+ shutdown = READ_ONCE (sk -> sk_shutdown );
822
+ if (shutdown & RCV_SHUTDOWN )
820
823
mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM ;
821
- if (sk -> sk_shutdown == SHUTDOWN_MASK )
824
+ if (shutdown == SHUTDOWN_MASK )
822
825
mask |= EPOLLHUP ;
823
826
824
827
/* readable? */
@@ -827,10 +830,12 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
827
830
828
831
/* Connection-based need to check for termination and startup */
829
832
if (connection_based (sk )) {
830
- if (sk -> sk_state == TCP_CLOSE )
833
+ int state = READ_ONCE (sk -> sk_state );
834
+
835
+ if (state == TCP_CLOSE )
831
836
mask |= EPOLLHUP ;
832
837
/* connection hasn't started yet? */
833
- if (sk -> sk_state == TCP_SYN_SENT )
838
+ if (state == TCP_SYN_SENT )
834
839
return mask ;
835
840
}
836
841
0 commit comments