net: Clear mono_delivery_time bit in __skb_tstamp_tx()
In __skb_tstamp_tx(), it may clone the egress skb and queues the clone to the sk_error_queue. The outgoing skb may have the mono delivery_time while the (rcv) timestamp is expected for the clone, so the skb->mono_delivery_time bit needs to be cleared from the clone. This patch adds the skb->mono_delivery_time clearing to the existing __net_timestamp() and use it in __skb_tstamp_tx(). The __net_timestamp() fast path usage in dev.c is changed to directly call ktime_get_real() since the mono_delivery_time bit is not set at that point. Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
27942a1520
commit
d93376f503
|
@ -3981,6 +3981,7 @@ static inline void skb_get_new_timestampns(const struct sk_buff *skb,
|
|||
static inline void __net_timestamp(struct sk_buff *skb)
|
||||
{
|
||||
skb->tstamp = ktime_get_real();
|
||||
skb->mono_delivery_time = 0;
|
||||
}
|
||||
|
||||
static inline ktime_t net_timedelta(ktime_t t)
|
||||
|
|
|
@ -2111,13 +2111,13 @@ static inline void net_timestamp_set(struct sk_buff *skb)
|
|||
skb->tstamp = 0;
|
||||
skb->mono_delivery_time = 0;
|
||||
if (static_branch_unlikely(&netstamp_needed_key))
|
||||
__net_timestamp(skb);
|
||||
skb->tstamp = ktime_get_real();
|
||||
}
|
||||
|
||||
#define net_timestamp_check(COND, SKB) \
|
||||
if (static_branch_unlikely(&netstamp_needed_key)) { \
|
||||
if ((COND) && !(SKB)->tstamp) \
|
||||
__net_timestamp(SKB); \
|
||||
(SKB)->tstamp = ktime_get_real(); \
|
||||
} \
|
||||
|
||||
bool is_skb_forwardable(const struct net_device *dev, const struct sk_buff *skb)
|
||||
|
|
|
@ -4851,7 +4851,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb,
|
|||
if (hwtstamps)
|
||||
*skb_hwtstamps(skb) = *hwtstamps;
|
||||
else
|
||||
skb->tstamp = ktime_get_real();
|
||||
__net_timestamp(skb);
|
||||
|
||||
__skb_complete_tx_timestamp(skb, sk, tstype, opt_stats);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue