Message ID | 27c0ad283f025c2bb71e7ceb71be07f969939429.1276615626.git.richard.cochran@omicron.at |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, Jun 15, 2010 at 10:08 AM, Richard Cochran <richardcochran@gmail.com> wrote: > This patch adds a new networking option to allow hardware time stamps > from PHY devices. Using PHY time stamps will still require adding two > inline function calls to each MAC driver. The CONFIG option makes these > calls safe to add, since the calls become NOOPs when the option is > disabled. > > Signed-off-by: Richard Cochran <richard.cochran@omicron.at> > --- > include/linux/phy.h | 4 ++++ > include/linux/skbuff.h | 32 ++++++++++++++++++++++++++++++++ > net/Kconfig | 11 +++++++++++ > 3 files changed, 47 insertions(+), 0 deletions(-) > [...] > diff --git a/net/Kconfig b/net/Kconfig > index 0d68b40..3fa7ae3 100644 > --- a/net/Kconfig > +++ b/net/Kconfig > @@ -86,6 +86,17 @@ config NETWORK_SECMARK > to nfmark, but designated for security purposes. > If you are unsure how to answer this question, answer N. > > +config NETWORK_PHY_TIMESTAMPING > + bool "Timestamping in PHY devices" > + depends on EXPERIMENTAL > + help > + This allows timestamping of network packets by PHYs with > + hardware timestamping capabilities. This option adds some > + overhead in the transmit and receive paths. Note that this > + option also requires support in the MAC driver. Some overhead? At a brief glance of the series it looks like it could add a lot of overhead, but I'm not fully clear on what the full process is. Can you describe how the hardware timestamping works? I could use an overview of what the kernel has to do. g.
On Tue, Jun 15, 2010 at 10:33:51AM -0600, Grant Likely wrote: > > +config NETWORK_PHY_TIMESTAMPING > Some overhead? At a brief glance of the series it looks like it could > add a lot of overhead, but I'm not fully clear on what the full > process is. Can you describe how the hardware timestamping works? I > could use an overview of what the kernel has to do. First of all, I want to emphasize that this network stack option is purely voluntary. Only those people who know that they have a PTP capable PHY and really want the timestamps will (or should) enable this option. When it is not enabled, it has no effect at all. Hardware timestamping is described in Documentation/networking/timestamping.txt Documentation/networking/timestamping/timestamping.c The PTP subsystem is described in Documentation/ptp/ptp.txt There really is more to say about the issue than appears in those documents, but they are a good starting place for discussion. BTW I am submitting a conference paper on the design on the PTP subsystem. If you would like to have it, just ask me off-list. Richard -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jun 15, 2010 at 06:08:20PM +0200, Richard Cochran wrote: > +static inline void skb_tx_timetamp(struct phy_device *phy, struct sk_buff *skb) > +{ > + union skb_shared_tx *shtx = skb_tx(skb); > + > + if (shtx->hardware && phy && phy->drv->txtstamp) > + phy->drv->txtstamp(phy, skb); > + > + if (shtx->software && !shtx->in_progress) > + skb_tstamp_tx(skb, NULL); > +} I forgot to mention this patch also provides a way to fix the broken software timestamp fallback mode of the SO_TIMESTAMPING API. We would have to add this inline call to every MAC driver in an appropriate spot within the hard_xmit function. It is not too pretty, but providing this as a compile time option will promote standardization of the SO_TIMESTAMPING API for applications. Richard -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Richard Cochran <richardcochran@gmail.com> Date: Tue, 15 Jun 2010 18:08:20 +0200 > +static inline void skb_tx_timetamp(struct phy_device *phy, struct sk_buff *skb) > +{ > + union skb_shared_tx *shtx = skb_tx(skb); > + > + if (shtx->hardware && phy && phy->drv->txtstamp) > + phy->drv->txtstamp(phy, skb); > + > + if (shtx->software && !shtx->in_progress) > + skb_tstamp_tx(skb, NULL); > +} > + > +static inline void skb_rx_timetamp(struct phy_device *phy, struct sk_buff *skb) > +{ > + if (phy && phy->drv->rxtstamp) > + phy->drv->rxtstamp(phy, skb); > +} Since, as you say, this can provide a way to deal with the sw TX timestamping sequencing problem we have right now, I'd rather you implement this from the inside out instead of from the outside in. By this I mean you should provide these inline helpers by default then we can begin to put them into the drivers. You could also split the SW tstamp handling into a seperate inline function, which drivers call immediately once they know they will actually give the packet to the hardware for sending. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/phy.h b/include/linux/phy.h index a5e9df1..7a8caac 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -234,6 +234,8 @@ enum phy_state { PHY_RESUMING }; +struct sk_buff; + /* phy_device: An instance of a PHY * * drv: Pointer to the driver for this PHY instance @@ -404,6 +406,8 @@ struct phy_driver { /* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */ int (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr); + int (*rxtstamp)(struct phy_device *phydev, struct sk_buff *skb); + int (*txtstamp)(struct phy_device *phydev, struct sk_buff *skb); struct device_driver driver; }; diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 645e78d..7b650d4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -29,6 +29,7 @@ #include <linux/rcupdate.h> #include <linux/dmaengine.h> #include <linux/hrtimer.h> +#include <linux/phy.h> /* Don't change this without changing skb_csum_unnecessary! */ #define CHECKSUM_NONE 0 @@ -1942,6 +1943,37 @@ static inline ktime_t net_invalid_timestamp(void) extern void skb_tstamp_tx(struct sk_buff *orig_skb, struct skb_shared_hwtstamps *hwtstamps); +#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING + +static inline void skb_tx_timetamp(struct phy_device *phy, struct sk_buff *skb) +{ + union skb_shared_tx *shtx = skb_tx(skb); + + if (shtx->hardware && phy && phy->drv->txtstamp) + phy->drv->txtstamp(phy, skb); + + if (shtx->software && !shtx->in_progress) + skb_tstamp_tx(skb, NULL); +} + +static inline void skb_rx_timetamp(struct phy_device *phy, struct sk_buff *skb) +{ + if (phy && phy->drv->rxtstamp) + phy->drv->rxtstamp(phy, skb); +} + +#else /* CONFIG_NETWORK_PHY_TIMESTAMPING */ + +static inline void skb_tx_timetamp(struct phy_device *phy, struct sk_buff *skb) +{ +} + +static inline void skb_rx_timetamp(struct phy_device *phy, struct sk_buff *skb) +{ +} + +#endif /* !CONFIG_NETWORK_PHY_TIMESTAMPING */ + extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); extern __sum16 __skb_checksum_complete(struct sk_buff *skb); diff --git a/net/Kconfig b/net/Kconfig index 0d68b40..3fa7ae3 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -86,6 +86,17 @@ config NETWORK_SECMARK to nfmark, but designated for security purposes. If you are unsure how to answer this question, answer N. +config NETWORK_PHY_TIMESTAMPING + bool "Timestamping in PHY devices" + depends on EXPERIMENTAL + help + This allows timestamping of network packets by PHYs with + hardware timestamping capabilities. This option adds some + overhead in the transmit and receive paths. Note that this + option also requires support in the MAC driver. + + If you are unsure how to answer this question, answer N. + menuconfig NETFILTER bool "Network packet filtering framework (Netfilter)" ---help---
This patch adds a new networking option to allow hardware time stamps from PHY devices. Using PHY time stamps will still require adding two inline function calls to each MAC driver. The CONFIG option makes these calls safe to add, since the calls become NOOPs when the option is disabled. Signed-off-by: Richard Cochran <richard.cochran@omicron.at> --- include/linux/phy.h | 4 ++++ include/linux/skbuff.h | 32 ++++++++++++++++++++++++++++++++ net/Kconfig | 11 +++++++++++ 3 files changed, 47 insertions(+), 0 deletions(-)