diff mbox

[1/2] pktgen: increasing transmission granularity

Message ID 4C10A735.20405@gmail.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Daniel Turull June 10, 2010, 8:49 a.m. UTC
This patch increases the granularity of the rate generated by pktgen.
The previous version of pktgen uses micro seconds (udelay) resolution when it 
was delayed causing gaps in the rates. It is changed to nanosecond (ndelay).
Now any rate is possible.

Also it allows to set, the desired rate in Mb/s or packets per second.

The documentation has been updated.

Signed-off-by: Daniel Turull <daniel.turull@gmail.com>

---

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

Robert Olsson June 10, 2010, 5:21 p.m. UTC | #1
Thanks,

So with this improved rate control we could do RFC2544-like testing as well.

Cheers
					--ro


Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>


Daniel Turull writes:
 > This patch increases the granularity of the rate generated by pktgen.
 > The previous version of pktgen uses micro seconds (udelay) resolution when it 
 > was delayed causing gaps in the rates. It is changed to nanosecond (ndelay).
 > Now any rate is possible.
 > 
 > Also it allows to set, the desired rate in Mb/s or packets per second.

 > 
 > The documentation has been updated.
 > 
 > Signed-off-by: Daniel Turull <daniel.turull@gmail.com>
 > 
 > ---
 > 
 > diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt
 > index 61bb645..75e4fd7 100644
 > --- a/Documentation/networking/pktgen.txt
 > +++ b/Documentation/networking/pktgen.txt
 > @@ -151,6 +151,8 @@ Examples:
 >  
 >   pgset stop    	          aborts injection. Also, ^C aborts generator.
 >  
 > + pgset "rate 300M"        set rate to 300 Mb/s
 > + pgset "ratep 1000000"    set rate to 1Mpps
 >  
 >  Example scripts
 >  ===============
 > @@ -241,6 +243,9 @@ src6
 >  flows
 >  flowlen
 >  
 > +rate
 > +ratep
 > +
 >  References:
 >  ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
 >  ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
 > diff --git a/net/core/pktgen.c b/net/core/pktgen.c
 > index 1dacd7b..6428653 100644
 > --- a/net/core/pktgen.c
 > +++ b/net/core/pktgen.c
 > @@ -169,7 +169,7 @@
 >  #include <asm/dma.h>
 >  #include <asm/div64.h>		/* do_div */
 >  
 > -#define VERSION 	"2.73"
 > +#define VERSION	"2.74"
 >  #define IP_NAME_SZ 32
 >  #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
 >  #define MPLS_STACK_BOTTOM htonl(0x00000100)
 > @@ -980,6 +980,40 @@ static ssize_t pktgen_if_write(struct file *file,
 >  			(unsigned long long) pkt_dev->delay);
 >  		return count;
 >  	}
 > +	if (!strcmp(name, "rate")) {
 > +		len = num_arg(&user_buffer[i], 10, &value);
 > +		if (len < 0)
 > +			return len;
 > +
 > +		i += len;
 > +		if (!value)
 > +			return len;
 > +		pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value;
 > +		if (debug)
 > +			printk(KERN_INFO
 > +				 "pktgen: Delay set at: %llu ns\n",
 > +					pkt_dev->delay);
 > +
 > +		sprintf(pg_result, "OK: rate=%lu", value);
 > +		return count;
 > +	}
 > +	if (!strcmp(name, "ratep")) {
 > +		len = num_arg(&user_buffer[i], 10, &value);
 > +		if (len < 0)
 > +			return len;
 > +
 > +		i += len;
 > +		if (!value)
 > +			return len;
 > +		pkt_dev->delay = NSEC_PER_SEC/value;
 > +		if (debug)
 > +			printk(KERN_INFO
 > +				 "pktgen: Delay set at: %llu ns\n",
 > +					pkt_dev->delay);
 > +
 > +		sprintf(pg_result, "OK: rate=%lu", value);
 > +		return count;
 > +	}
 >  	if (!strcmp(name, "udp_src_min")) {
 >  		len = num_arg(&user_buffer[i], 10, &value);
 >  		if (len < 0)
 > @@ -2142,15 +2176,15 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
 >  	hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
 >  	hrtimer_set_expires(&t.timer, spin_until);
 >  
 > -	remaining = ktime_to_us(hrtimer_expires_remaining(&t.timer));
 > +	remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
 >  	if (remaining <= 0) {
 >  		pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay);
 >  		return;
 >  	}
 >  
 >  	start_time = ktime_now();
 > -	if (remaining < 100)
 > -		udelay(remaining); 	/* really small just spin */
 > +	if (remaining < 100000)
 > +		ndelay(remaining);	/* really small just spin */
 >  	else {
 >  		/* see do_nanosleep */
 >  		hrtimer_init_sleeper(&t, current);
--
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
David Miller June 12, 2010, 1:40 a.m. UTC | #2
From: Robert Olsson <robert@herjulf.net>
Date: Thu, 10 Jun 2010 19:21:25 +0200

> So with this improved rate control we could do RFC2544-like testing as well.
>
> Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>

Applied, thanks everyone.
--
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 mbox

Patch

diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt
index 61bb645..75e4fd7 100644
--- a/Documentation/networking/pktgen.txt
+++ b/Documentation/networking/pktgen.txt
@@ -151,6 +151,8 @@  Examples:
 
  pgset stop    	          aborts injection. Also, ^C aborts generator.
 
+ pgset "rate 300M"        set rate to 300 Mb/s
+ pgset "ratep 1000000"    set rate to 1Mpps
 
 Example scripts
 ===============
@@ -241,6 +243,9 @@  src6
 flows
 flowlen
 
+rate
+ratep
+
 References:
 ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
 ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 1dacd7b..6428653 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -169,7 +169,7 @@ 
 #include <asm/dma.h>
 #include <asm/div64.h>		/* do_div */
 
-#define VERSION 	"2.73"
+#define VERSION	"2.74"
 #define IP_NAME_SZ 32
 #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
 #define MPLS_STACK_BOTTOM htonl(0x00000100)
@@ -980,6 +980,40 @@  static ssize_t pktgen_if_write(struct file *file,
 			(unsigned long long) pkt_dev->delay);
 		return count;
 	}
+	if (!strcmp(name, "rate")) {
+		len = num_arg(&user_buffer[i], 10, &value);
+		if (len < 0)
+			return len;
+
+		i += len;
+		if (!value)
+			return len;
+		pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value;
+		if (debug)
+			printk(KERN_INFO
+				 "pktgen: Delay set at: %llu ns\n",
+					pkt_dev->delay);
+
+		sprintf(pg_result, "OK: rate=%lu", value);
+		return count;
+	}
+	if (!strcmp(name, "ratep")) {
+		len = num_arg(&user_buffer[i], 10, &value);
+		if (len < 0)
+			return len;
+
+		i += len;
+		if (!value)
+			return len;
+		pkt_dev->delay = NSEC_PER_SEC/value;
+		if (debug)
+			printk(KERN_INFO
+				 "pktgen: Delay set at: %llu ns\n",
+					pkt_dev->delay);
+
+		sprintf(pg_result, "OK: rate=%lu", value);
+		return count;
+	}
 	if (!strcmp(name, "udp_src_min")) {
 		len = num_arg(&user_buffer[i], 10, &value);
 		if (len < 0)
@@ -2142,15 +2176,15 @@  static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
 	hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
 	hrtimer_set_expires(&t.timer, spin_until);
 
-	remaining = ktime_to_us(hrtimer_expires_remaining(&t.timer));
+	remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
 	if (remaining <= 0) {
 		pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay);
 		return;
 	}
 
 	start_time = ktime_now();
-	if (remaining < 100)
-		udelay(remaining); 	/* really small just spin */
+	if (remaining < 100000)
+		ndelay(remaining);	/* really small just spin */
 	else {
 		/* see do_nanosleep */
 		hrtimer_init_sleeper(&t, current);