summaryrefslogtreecommitdiff
path: root/trafgen.c
diff options
context:
space:
mode:
authorDaniel Borkmann <dborkman@redhat.com>2013-06-15 13:14:26 +0200
committerDaniel Borkmann <dborkman@redhat.com>2013-06-15 13:14:26 +0200
commit721fb0de29e78a1cfd5d759758c69830333d7699 (patch)
tree05d9435f51ef9746b91e514a7dfd73615422167e /trafgen.c
parent98ed56c545ab58aa747c408ffa7d5a2ff9678618 (diff)
trafgen: fix -n1 bug for packet scheduling
In the current situation, it can happen when we set -n1, that no packet at all will be scheduled. This is due to the case that nearbyint() will for e.g. 2 cpus round to 0 each, and since in __correct_global_delta() we only correct a total delta when a particular CPU is allowed to tx packets (means already has a num > 0), then we correct the delta on the first such CPU. Switch to using round(), so that on 0.5 it will be round to the next higher int, and fix the check to >= 0 in __correct_global_delta() so that a CPU could also get a 0 share of packets. I did a couple of tests with different -n params and cpu(..) configs and this seems to fix that. Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Diffstat (limited to 'trafgen.c')
-rw-r--r--trafgen.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/trafgen.c b/trafgen.c
index 2d99a4b..3b2f471 100644
--- a/trafgen.c
+++ b/trafgen.c
@@ -757,7 +757,7 @@ static void __correct_global_delta(struct ctx *ctx, int cpu, unsigned long orig)
for (cpu_sel = -1, i = 0; i < ctx->cpus; i++) {
if (stats[i].cd_packets > 0) {
if ((long long) stats[i].cd_packets +
- delta_correction > 0) {
+ delta_correction >= 0) {
cpu_sel = i;
break;
}
@@ -797,7 +797,7 @@ static int xmit_packet_precheck(struct ctx *ctx, int cpu)
plen_total = __wait_and_sum_others(ctx, cpu);
if (orig > 0) {
- ctx->num = (unsigned long) nearbyint((1.0 * plen / plen_total) * orig);
+ ctx->num = (unsigned long) round((1.0 * plen / plen_total) * orig);
__set_state_cd(cpu, ctx->num, CPU_STATS_STATE_CHK |
CPU_STATS_STATE_CFG);