diff options
author | Willem de Bruijn <willemb@google.com> | 2014-08-04 22:11:48 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 19:35:54 -0400 |
commit | e7fd2885385157d46c85f282fc6d7d297db43e1f (patch) | |
tree | 14e9d00ed87b2b45882c8cb8dd1b9b4d221724f8 /net/core | |
parent | 09c2d251b70723650ba47e83571ff49281320f7c (diff) |
net-timestamp: SCHED timestamp on entering packet scheduler
Kernel transmit latency is often incurred in the packet scheduler.
Introduce a new timestamp on transmission just before entering the
scheduler. When data travels through multiple devices (bonding,
tunneling, ...) each device will export an individual timestamp.
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 4 | ||||
-rw-r--r-- | net/core/skbuff.c | 16 |
2 files changed, 16 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index b370230fe1d3..1c15b189c52b 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -132,6 +132,7 @@ | |||
132 | #include <linux/hashtable.h> | 132 | #include <linux/hashtable.h> |
133 | #include <linux/vmalloc.h> | 133 | #include <linux/vmalloc.h> |
134 | #include <linux/if_macvlan.h> | 134 | #include <linux/if_macvlan.h> |
135 | #include <linux/errqueue.h> | ||
135 | 136 | ||
136 | #include "net-sysfs.h" | 137 | #include "net-sysfs.h" |
137 | 138 | ||
@@ -2876,6 +2877,9 @@ static int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv) | |||
2876 | 2877 | ||
2877 | skb_reset_mac_header(skb); | 2878 | skb_reset_mac_header(skb); |
2878 | 2879 | ||
2880 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) | ||
2881 | __skb_tstamp_tx(skb, NULL, skb->sk, SCM_TSTAMP_SCHED); | ||
2882 | |||
2879 | /* Disable soft irqs for various locks below. Also | 2883 | /* Disable soft irqs for various locks below. Also |
2880 | * stops preemption for RCU. | 2884 | * stops preemption for RCU. |
2881 | */ | 2885 | */ |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 0df4f1d14c5a..9705c0732aab 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -3490,10 +3490,10 @@ int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | |||
3490 | } | 3490 | } |
3491 | EXPORT_SYMBOL(sock_queue_err_skb); | 3491 | EXPORT_SYMBOL(sock_queue_err_skb); |
3492 | 3492 | ||
3493 | void skb_tstamp_tx(struct sk_buff *orig_skb, | 3493 | void __skb_tstamp_tx(struct sk_buff *orig_skb, |
3494 | struct skb_shared_hwtstamps *hwtstamps) | 3494 | struct skb_shared_hwtstamps *hwtstamps, |
3495 | struct sock *sk, int tstype) | ||
3495 | { | 3496 | { |
3496 | struct sock *sk = orig_skb->sk; | ||
3497 | struct sock_exterr_skb *serr; | 3497 | struct sock_exterr_skb *serr; |
3498 | struct sk_buff *skb; | 3498 | struct sk_buff *skb; |
3499 | int err; | 3499 | int err; |
@@ -3521,7 +3521,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, | |||
3521 | memset(serr, 0, sizeof(*serr)); | 3521 | memset(serr, 0, sizeof(*serr)); |
3522 | serr->ee.ee_errno = ENOMSG; | 3522 | serr->ee.ee_errno = ENOMSG; |
3523 | serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; | 3523 | serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; |
3524 | serr->ee.ee_info = SCM_TSTAMP_SND; | 3524 | serr->ee.ee_info = tstype; |
3525 | if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) | 3525 | if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) |
3526 | serr->ee.ee_data = skb_shinfo(skb)->tskey; | 3526 | serr->ee.ee_data = skb_shinfo(skb)->tskey; |
3527 | 3527 | ||
@@ -3530,6 +3530,14 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, | |||
3530 | if (err) | 3530 | if (err) |
3531 | kfree_skb(skb); | 3531 | kfree_skb(skb); |
3532 | } | 3532 | } |
3533 | EXPORT_SYMBOL_GPL(__skb_tstamp_tx); | ||
3534 | |||
3535 | void skb_tstamp_tx(struct sk_buff *orig_skb, | ||
3536 | struct skb_shared_hwtstamps *hwtstamps) | ||
3537 | { | ||
3538 | return __skb_tstamp_tx(orig_skb, hwtstamps, orig_skb->sk, | ||
3539 | SCM_TSTAMP_SND); | ||
3540 | } | ||
3533 | EXPORT_SYMBOL_GPL(skb_tstamp_tx); | 3541 | EXPORT_SYMBOL_GPL(skb_tstamp_tx); |
3534 | 3542 | ||
3535 | void skb_complete_wifi_ack(struct sk_buff *skb, bool acked) | 3543 | void skb_complete_wifi_ack(struct sk_buff *skb, bool acked) |