From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robert Olsson Subject: Re: [PATCH 1/2] pktgen: increasing transmission granularity Date: Thu, 10 Jun 2010 19:21:25 +0200 Message-ID: <19473.7957.743957.808639@gargle.gargle.HOWL> References: <4C064533.6070709@gmail.com> <20100609.135040.193710199.davem@davemloft.net> <4C10A735.20405@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Cc: David Miller , netdev@vger.kernel.org, robert@herjulf.net, jens.laas@its.uu.se To: Daniel Turull Return-path: Received: from smtp-gw21.han.skanova.net ([81.236.55.21]:51151 "EHLO smtp-gw21.han.skanova.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759254Ab0FJR0Z (ORCPT ); Thu, 10 Jun 2010 13:26:25 -0400 In-Reply-To: <4C10A735.20405@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: Thanks, So with this improved rate control we could do RFC2544-like testing as well. Cheers --ro Signed-off-by: Robert Olsson 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 > > --- > > 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 > #include /* 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);