From 5c6a865a091868afb740cc346c5b79030d8e81a0 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Fri, 11 Jan 2013 15:41:29 +0100 Subject: [PATCH] trafgen: fix CPU IRQ pinning range with --cpu arg Signed-off-by: Daniel Borkmann --- src/trafgen.c | 2 +- src/xutils.c | 23 +++++++++++++++-------- src/xutils.h | 3 ++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/trafgen.c b/src/trafgen.c index 66702e3b..69d8b460 100644 --- a/src/trafgen.c +++ b/src/trafgen.c @@ -1136,7 +1136,7 @@ int main(int argc, char **argv) } irq = device_irq_number(ctx.device); - device_reset_irq_affinity(irq); + device_set_irq_affinity_list(irq, 0, ctx.cpus - 1); if (ctx.num > 0 && ctx.num <= ctx.cpus) ctx.cpus = 1; diff --git a/src/xutils.c b/src/xutils.c index f1761c2e..45b74b22 100644 --- a/src/xutils.c +++ b/src/xutils.c @@ -639,17 +639,24 @@ int device_irq_number(const char *ifname) return irq; } -void device_reset_irq_affinity(int irq) +int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to) { - int ret; - char cmd[256]; + int ret, fd; + char file[256], list[64]; - slprintf(cmd, sizeof(cmd), - "cat /proc/irq/default_smp_affinity >/proc/irq/%d/smp_affinity", irq); + slprintf(file, sizeof(file), "/proc/irq/%d/smp_affinity_list", irq); + slprintf(list, sizeof(list), "%lu-%lu\n", from, to); - ret = system(cmd); - if (ret < 0) - panic("Cannot execute system(2)!\n"); + fd = open(file, O_WRONLY); + if (fd < 0) { + whine("Cannot open file %s!\n", file); + return -ENOENT; + } + + ret = write(fd, list, strlen(list)); + + close(fd); + return ret; } int device_bind_irq_to_cpu(int irq, int cpu) diff --git a/src/xutils.h b/src/xutils.h index 86623c3c..536fe7f3 100644 --- a/src/xutils.h +++ b/src/xutils.h @@ -50,7 +50,8 @@ extern int device_mtu(const char *ifname); extern int device_address(const char *ifname, int af, struct sockaddr_storage *ss); extern int device_irq_number(const char *ifname); -extern void device_reset_irq_affinity(int irq); +extern int device_set_irq_affinity_list(int irq, unsigned long from, + unsigned long to); extern int device_bind_irq_to_cpu(int irq, int cpu); extern void sock_print_net_stats(int sock, unsigned long skipped); extern int device_ifindex(const char *ifname); -- 2.11.4.GIT