diff mbox

[net-next] pktgen: add flag NO_TIMESTAMP to disable timestamping

Message ID 20140828161447.6652.59388.stgit@dragon
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Jesper Dangaard Brouer Aug. 28, 2014, 4:14 p.m. UTC
Then testing the TX limits of the stack, then it is useful to
be-able to disable the do_gettimeofday() timetamping on every packet.

This implements a pktgen flag NO_TIMESTAMP which will disable this
call to do_gettimeofday().

The performance change on (my system E5-2695) with skb_clone=0, goes
from TX 2,423,751 pps to 2,567,165 pps with flag NO_TIMESTAMP. Thus,
the cost of do_gettimeofday() or saving is approx 23 nanosec.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
---

 net/core/pktgen.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)


--
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

Comments

Eric Dumazet Aug. 29, 2014, 4:17 p.m. UTC | #1
On Thu, 2014-08-28 at 18:14 +0200, Jesper Dangaard Brouer wrote:
> Then testing the TX limits of the stack, then it is useful to
> be-able to disable the do_gettimeofday() timetamping on every packet.
> 
> This implements a pktgen flag NO_TIMESTAMP which will disable this
> call to do_gettimeofday().
> 
> The performance change on (my system E5-2695) with skb_clone=0, goes
> from TX 2,423,751 pps to 2,567,165 pps with flag NO_TIMESTAMP. Thus,
> the cost of do_gettimeofday() or saving is approx 23 nanosec.

I guess using local_clock() would provide an accurate and less expensive
timestamp, if a timestamp is needed.



--
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
Jesper Dangaard Brouer Aug. 29, 2014, 7:02 p.m. UTC | #2
On Fri, 29 Aug 2014 09:17:06 -0700
Eric Dumazet <eric.dumazet@gmail.com> wrote:

> On Thu, 2014-08-28 at 18:14 +0200, Jesper Dangaard Brouer wrote:
> > Then testing the TX limits of the stack, then it is useful to
> > be-able to disable the do_gettimeofday() timetamping on every packet.
> > 
> > This implements a pktgen flag NO_TIMESTAMP which will disable this
> > call to do_gettimeofday().
> > 
> > The performance change on (my system E5-2695) with skb_clone=0, goes
> > from TX 2,423,751 pps to 2,567,165 pps with flag NO_TIMESTAMP. Thus,
> > the cost of do_gettimeofday() or saving is approx 23 nanosec.
> 
> I guess using local_clock() would provide an accurate and less expensive
> timestamp, if a timestamp is needed.

Sure, but I don't need this timestamp, thus I added an option to disable it.
David Miller Sept. 2, 2014, 1:07 a.m. UTC | #3
From: Jesper Dangaard Brouer <brouer@redhat.com>
Date: Thu, 28 Aug 2014 18:14:47 +0200

> Then testing the TX limits of the stack, then it is useful to
> be-able to disable the do_gettimeofday() timetamping on every packet.
> 
> This implements a pktgen flag NO_TIMESTAMP which will disable this
> call to do_gettimeofday().
> 
> The performance change on (my system E5-2695) with skb_clone=0, goes
> from TX 2,423,751 pps to 2,567,165 pps with flag NO_TIMESTAMP. Thus,
> the cost of do_gettimeofday() or saving is approx 23 nanosec.
> 
> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>

This is fine, applied, thanks!
--
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
Ben Greear April 1, 2015, 4:48 p.m. UTC | #4
On 08/28/2014 09:14 AM, Jesper Dangaard Brouer wrote:
> Then testing the TX limits of the stack, then it is useful to
> be-able to disable the do_gettimeofday() timetamping on every packet.
> 
> This implements a pktgen flag NO_TIMESTAMP which will disable this
> call to do_gettimeofday().
> 
> The performance change on (my system E5-2695) with skb_clone=0, goes
> from TX 2,423,751 pps to 2,567,165 pps with flag NO_TIMESTAMP. Thus,
> the cost of do_gettimeofday() or saving is approx 23 nanosec.
> 
> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>

> +		else if (strcmp(f, "NO_TIMESTAMP") == 0)
> +			pkt_dev->flags |= F_NO_TIMESTAMP;
> +

While porting pktgen changes into my own modified pktgen logic, I noticed
that there is no handling for !NO_TIMESTAMP, so it seems you cannot
disable this once it is enabled?

Thanks,
Ben
diff mbox

Patch

diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 83e2b4b..d9acc16 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -202,6 +202,7 @@ 
 #define F_QUEUE_MAP_CPU (1<<14)	/* queue map mirrors smp_processor_id() */
 #define F_NODE          (1<<15)	/* Node memory alloc*/
 #define F_UDPCSUM       (1<<16)	/* Include UDP checksum */
+#define F_NO_TIMESTAMP  (1<<17)	/* Don't timestamp packets (default TS) */
 
 /* Thread control flag bits */
 #define T_STOP        (1<<0)	/* Stop run */
@@ -638,6 +639,9 @@  static int pktgen_if_show(struct seq_file *seq, void *v)
 	if (pkt_dev->flags & F_UDPCSUM)
 		seq_puts(seq, "UDPCSUM  ");
 
+	if (pkt_dev->flags & F_NO_TIMESTAMP)
+		seq_puts(seq, "NO_TIMESTAMP  ");
+
 	if (pkt_dev->flags & F_MPLS_RND)
 		seq_puts(seq,  "MPLS_RND  ");
 
@@ -1243,6 +1247,9 @@  static ssize_t pktgen_if_write(struct file *file,
 		else if (strcmp(f, "!UDPCSUM") == 0)
 			pkt_dev->flags &= ~F_UDPCSUM;
 
+		else if (strcmp(f, "NO_TIMESTAMP") == 0)
+			pkt_dev->flags |= F_NO_TIMESTAMP;
+
 		else {
 			sprintf(pg_result,
 				"Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
@@ -1251,6 +1258,7 @@  static ssize_t pktgen_if_write(struct file *file,
 				"MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, "
 				"MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, "
 				"QUEUE_MAP_RND, QUEUE_MAP_CPU, UDPCSUM, "
+				"NO_TIMESTAMP, "
 #ifdef CONFIG_XFRM
 				"IPSEC, "
 #endif
@@ -2685,9 +2693,14 @@  static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,
 	pgh->pgh_magic = htonl(PKTGEN_MAGIC);
 	pgh->seq_num = htonl(pkt_dev->seq_num);
 
-	do_gettimeofday(&timestamp);
-	pgh->tv_sec = htonl(timestamp.tv_sec);
-	pgh->tv_usec = htonl(timestamp.tv_usec);
+	if (pkt_dev->flags & F_NO_TIMESTAMP) {
+		pgh->tv_sec = 0;
+		pgh->tv_usec = 0;
+	} else {
+		do_gettimeofday(&timestamp);
+		pgh->tv_sec = htonl(timestamp.tv_sec);
+		pgh->tv_usec = htonl(timestamp.tv_usec);
+	}
 }
 
 static struct sk_buff *pktgen_alloc_skb(struct net_device *dev,