@@ -1053,6 +1053,12 @@ static inline void sk_wmem_queued_add(struct sock *sk, int val)
10531053 WRITE_ONCE (sk -> sk_wmem_queued , sk -> sk_wmem_queued + val );
10541054}
10551055
1056+ static inline void sk_forward_alloc_add (struct sock * sk , int val )
1057+ {
1058+ /* Paired with lockless reads of sk->sk_forward_alloc */
1059+ WRITE_ONCE (sk -> sk_forward_alloc , sk -> sk_forward_alloc + val );
1060+ }
1061+
10561062void sk_stream_write_space (struct sock * sk );
10571063
10581064/* OOB backlog add */
@@ -1377,7 +1383,7 @@ static inline int sk_forward_alloc_get(const struct sock *sk)
13771383 if (sk -> sk_prot -> forward_alloc_get )
13781384 return sk -> sk_prot -> forward_alloc_get (sk );
13791385#endif
1380- return sk -> sk_forward_alloc ;
1386+ return READ_ONCE ( sk -> sk_forward_alloc ) ;
13811387}
13821388
13831389static inline bool __sk_stream_memory_free (const struct sock * sk , int wake )
@@ -1673,14 +1679,14 @@ static inline void sk_mem_charge(struct sock *sk, int size)
16731679{
16741680 if (!sk_has_account (sk ))
16751681 return ;
1676- sk -> sk_forward_alloc -= size ;
1682+ sk_forward_alloc_add ( sk , - size ) ;
16771683}
16781684
16791685static inline void sk_mem_uncharge (struct sock * sk , int size )
16801686{
16811687 if (!sk_has_account (sk ))
16821688 return ;
1683- sk -> sk_forward_alloc += size ;
1689+ sk_forward_alloc_add ( sk , size ) ;
16841690 sk_mem_reclaim (sk );
16851691}
16861692
@@ -1900,7 +1906,9 @@ struct sockcm_cookie {
19001906static inline void sockcm_init (struct sockcm_cookie * sockc ,
19011907 const struct sock * sk )
19021908{
1903- * sockc = (struct sockcm_cookie ) { .tsflags = sk -> sk_tsflags };
1909+ * sockc = (struct sockcm_cookie ) {
1910+ .tsflags = READ_ONCE (sk -> sk_tsflags )
1911+ };
19041912}
19051913
19061914int __sock_cmsg_send (struct sock * sk , struct cmsghdr * cmsg ,
@@ -2695,20 +2703,20 @@ void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
26952703static inline void
26962704sock_recv_timestamp (struct msghdr * msg , struct sock * sk , struct sk_buff * skb )
26972705{
2698- ktime_t kt = skb -> tstamp ;
26992706 struct skb_shared_hwtstamps * hwtstamps = skb_hwtstamps (skb );
2700-
2707+ u32 tsflags = READ_ONCE (sk -> sk_tsflags );
2708+ ktime_t kt = skb -> tstamp ;
27012709 /*
27022710 * generate control messages if
27032711 * - receive time stamping in software requested
27042712 * - software time stamp available and wanted
27052713 * - hardware time stamps available and wanted
27062714 */
27072715 if (sock_flag (sk , SOCK_RCVTSTAMP ) ||
2708- (sk -> sk_tsflags & SOF_TIMESTAMPING_RX_SOFTWARE ) ||
2709- (kt && sk -> sk_tsflags & SOF_TIMESTAMPING_SOFTWARE ) ||
2716+ (tsflags & SOF_TIMESTAMPING_RX_SOFTWARE ) ||
2717+ (kt && tsflags & SOF_TIMESTAMPING_SOFTWARE ) ||
27102718 (hwtstamps -> hwtstamp &&
2711- (sk -> sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE )))
2719+ (tsflags & SOF_TIMESTAMPING_RAW_HARDWARE )))
27122720 __sock_recv_timestamp (msg , sk , skb );
27132721 else
27142722 sock_write_timestamp (sk , kt );
@@ -2730,7 +2738,8 @@ static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
27302738#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
27312739 SOF_TIMESTAMPING_RAW_HARDWARE)
27322740
2733- if (sk -> sk_flags & FLAGS_RECV_CMSGS || sk -> sk_tsflags & TSFLAGS_ANY )
2741+ if (sk -> sk_flags & FLAGS_RECV_CMSGS ||
2742+ READ_ONCE (sk -> sk_tsflags ) & TSFLAGS_ANY )
27342743 __sock_recv_cmsgs (msg , sk , skb );
27352744 else if (unlikely (sock_flag (sk , SOCK_TIMESTAMP )))
27362745 sock_write_timestamp (sk , skb -> tstamp );
0 commit comments