mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-05-02 18:17:50 -04:00
net: annotate data-races around sk->sk_tsflags
sk->sk_tsflags can be read locklessly, add corresponding annotations.
Fixes: b9f40e21ef ("net-timestamp: move timestamp flags out of sk_flags")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
9531e4a83f
commit
e3390b30a5
13
net/socket.c
13
net/socket.c
@@ -825,7 +825,7 @@ static bool skb_is_swtx_tstamp(const struct sk_buff *skb, int false_tstamp)
|
||||
|
||||
static ktime_t get_timestamp(struct sock *sk, struct sk_buff *skb, int *if_index)
|
||||
{
|
||||
bool cycles = sk->sk_tsflags & SOF_TIMESTAMPING_BIND_PHC;
|
||||
bool cycles = READ_ONCE(sk->sk_tsflags) & SOF_TIMESTAMPING_BIND_PHC;
|
||||
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
|
||||
struct net_device *orig_dev;
|
||||
ktime_t hwtstamp;
|
||||
@@ -877,12 +877,12 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP);
|
||||
int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW);
|
||||
struct scm_timestamping_internal tss;
|
||||
|
||||
int empty = 1, false_tstamp = 0;
|
||||
struct skb_shared_hwtstamps *shhwtstamps =
|
||||
skb_hwtstamps(skb);
|
||||
int if_index;
|
||||
ktime_t hwtstamp;
|
||||
u32 tsflags;
|
||||
|
||||
/* Race occurred between timestamp enabling and packet
|
||||
receiving. Fill in the current time for now. */
|
||||
@@ -924,11 +924,12 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
}
|
||||
|
||||
memset(&tss, 0, sizeof(tss));
|
||||
if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
|
||||
tsflags = READ_ONCE(sk->sk_tsflags);
|
||||
if ((tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
|
||||
ktime_to_timespec64_cond(skb->tstamp, tss.ts + 0))
|
||||
empty = 0;
|
||||
if (shhwtstamps &&
|
||||
(sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
|
||||
(tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
|
||||
!skb_is_swtx_tstamp(skb, false_tstamp)) {
|
||||
if_index = 0;
|
||||
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP_NETDEV)
|
||||
@@ -936,14 +937,14 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
else
|
||||
hwtstamp = shhwtstamps->hwtstamp;
|
||||
|
||||
if (sk->sk_tsflags & SOF_TIMESTAMPING_BIND_PHC)
|
||||
if (tsflags & SOF_TIMESTAMPING_BIND_PHC)
|
||||
hwtstamp = ptp_convert_timestamp(&hwtstamp,
|
||||
sk->sk_bind_phc);
|
||||
|
||||
if (ktime_to_timespec64_cond(hwtstamp, tss.ts + 2)) {
|
||||
empty = 0;
|
||||
|
||||
if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) &&
|
||||
if ((tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) &&
|
||||
!skb_is_err_queue(skb))
|
||||
put_ts_pktinfo(msg, skb, if_index);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user