On Tue, 4 Sep 2007 06:35:25 +0100 Stephen Hemminger <[EMAIL PROTECTED]> wrote:
> Andi mentioned he did something like this already, but never > submitted it. > > The dhcp client application uses AF_PACKET with a packet filter to > receive data. The application doesn't even use timestamps, but because > the AF_PACKET API has timestamps, they get turned on globally which > causes an expensive time of day lookup for every packet received > on any system that uses the standard DHCP client. > > The fix is to not enable the timestamp (but use if if available). > This causes the time lookup to only occur on those packets > that are destined for the AF_PACKET socket. > The timestamping occurs after packet filtering > so all packets dropped by filtering to not cause a clock call. > > The one downside of this a a few microseconds additional delay > added from the normal timestamping location (netif_rx) until the > receive callback in AF_PACKET. But since the offset is fairly consistent > it should not upset applications that do want really use timestamps, > like wireshark. This patch seems the correct fix for this longstanding problem. Please note that if wireshark/tcpdump processes really want precise timestamps, they still can ask this by using setsockopt(SO_TIMESTAMP or SO_TIMESTAMPNS) on their private socket. (We already know that running a sniffer has a cost anyway) > > Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]> > > > --- a/net/packet/af_packet.c 2007-07-23 09:31:26.000000000 +0100 > +++ b/net/packet/af_packet.c 2007-09-03 14:55:00.000000000 +0100 > @@ -640,11 +640,10 @@ static int tpacket_rcv(struct sk_buff *s > h->tp_snaplen = snaplen; > h->tp_mac = macoff; > h->tp_net = netoff; > - if (skb->tstamp.tv64 == 0) { > - __net_timestamp(skb); > - sock_enable_timestamp(sk); > - } > - tv = ktime_to_timeval(skb->tstamp); > + if (skb->tstamp.tv64) > + tv = ktime_to_timeval(skb->tstamp); > + else > + do_gettimeofday(&tv); > h->tp_sec = tv.tv_sec; > h->tp_usec = tv.tv_usec; > - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html