Commit e99b99b4 authored by Robert Olsson's avatar Robert Olsson Committed by David S. Miller

pktgen node allocation

Here is patch to manipulate packet node allocation and implicitly
how packets are DMA'd etc.

The flag NODE_ALLOC enables the function and numa_node_id();
when enabled it can also be explicitly controlled via a new
node parameter

Tested this with 10 Intel 82599 ports w. TYAN S7025 E5520 CPU's.
Was able to TX/DMA ~80 Gbit/s to Ethernet wires.
Signed-off-by: default avatarRobert Olsson <robert.olsson@its.uu.se>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 99fe3c39
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/div64.h> /* do_div */ #include <asm/div64.h> /* do_div */
#define VERSION "2.72" #define VERSION "2.73"
#define IP_NAME_SZ 32 #define IP_NAME_SZ 32
#define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
#define MPLS_STACK_BOTTOM htonl(0x00000100) #define MPLS_STACK_BOTTOM htonl(0x00000100)
...@@ -190,6 +190,7 @@ ...@@ -190,6 +190,7 @@
#define F_IPSEC_ON (1<<12) /* ipsec on for flows */ #define F_IPSEC_ON (1<<12) /* ipsec on for flows */
#define F_QUEUE_MAP_RND (1<<13) /* queue map Random */ #define F_QUEUE_MAP_RND (1<<13) /* queue map Random */
#define F_QUEUE_MAP_CPU (1<<14) /* queue map mirrors smp_processor_id() */ #define F_QUEUE_MAP_CPU (1<<14) /* queue map mirrors smp_processor_id() */
#define F_NODE (1<<15) /* Node memory alloc*/
/* Thread control flag bits */ /* Thread control flag bits */
#define T_STOP (1<<0) /* Stop run */ #define T_STOP (1<<0) /* Stop run */
...@@ -372,6 +373,7 @@ struct pktgen_dev { ...@@ -372,6 +373,7 @@ struct pktgen_dev {
u16 queue_map_min; u16 queue_map_min;
u16 queue_map_max; u16 queue_map_max;
int node; /* Memory node */
#ifdef CONFIG_XFRM #ifdef CONFIG_XFRM
__u8 ipsmode; /* IPSEC mode (config) */ __u8 ipsmode; /* IPSEC mode (config) */
...@@ -607,6 +609,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v) ...@@ -607,6 +609,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
if (pkt_dev->traffic_class) if (pkt_dev->traffic_class)
seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class);
if (pkt_dev->node >= 0)
seq_printf(seq, " node: %d\n", pkt_dev->node);
seq_printf(seq, " Flags: "); seq_printf(seq, " Flags: ");
if (pkt_dev->flags & F_IPV6) if (pkt_dev->flags & F_IPV6)
...@@ -660,6 +665,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v) ...@@ -660,6 +665,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
if (pkt_dev->flags & F_SVID_RND) if (pkt_dev->flags & F_SVID_RND)
seq_printf(seq, "SVID_RND "); seq_printf(seq, "SVID_RND ");
if (pkt_dev->flags & F_NODE)
seq_printf(seq, "NODE_ALLOC ");
seq_puts(seq, "\n"); seq_puts(seq, "\n");
/* not really stopped, more like last-running-at */ /* not really stopped, more like last-running-at */
...@@ -1074,6 +1082,21 @@ static ssize_t pktgen_if_write(struct file *file, ...@@ -1074,6 +1082,21 @@ static ssize_t pktgen_if_write(struct file *file,
pkt_dev->dst_mac_count); pkt_dev->dst_mac_count);
return count; return count;
} }
if (!strcmp(name, "node")) {
len = num_arg(&user_buffer[i], 10, &value);
if (len < 0)
return len;
i += len;
if (node_possible(value)) {
pkt_dev->node = value;
sprintf(pg_result, "OK: node=%d", pkt_dev->node);
}
else
sprintf(pg_result, "ERROR: node not possible");
return count;
}
if (!strcmp(name, "flag")) { if (!strcmp(name, "flag")) {
char f[32]; char f[32];
memset(f, 0, 32); memset(f, 0, 32);
...@@ -1166,12 +1189,18 @@ static ssize_t pktgen_if_write(struct file *file, ...@@ -1166,12 +1189,18 @@ static ssize_t pktgen_if_write(struct file *file,
else if (strcmp(f, "!IPV6") == 0) else if (strcmp(f, "!IPV6") == 0)
pkt_dev->flags &= ~F_IPV6; pkt_dev->flags &= ~F_IPV6;
else if (strcmp(f, "NODE_ALLOC") == 0)
pkt_dev->flags |= F_NODE;
else if (strcmp(f, "!NODE_ALLOC") == 0)
pkt_dev->flags &= ~F_NODE;
else { else {
sprintf(pg_result, sprintf(pg_result,
"Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s", "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s",
f, f,
"IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, " "IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, "
"MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC\n"); "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC, NODE_ALLOC\n");
return count; return count;
} }
sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags);
...@@ -2572,9 +2601,27 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, ...@@ -2572,9 +2601,27 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
mod_cur_headers(pkt_dev); mod_cur_headers(pkt_dev);
datalen = (odev->hard_header_len + 16) & ~0xf; datalen = (odev->hard_header_len + 16) & ~0xf;
skb = __netdev_alloc_skb(odev,
pkt_dev->cur_pkt_size + 64 if (pkt_dev->flags & F_NODE) {
+ datalen + pkt_dev->pkt_overhead, GFP_NOWAIT); int node;
if (pkt_dev->node >= 0)
node = pkt_dev->node;
else
node = numa_node_id();
skb = __alloc_skb(NET_SKB_PAD + pkt_dev->cur_pkt_size + 64
+ datalen + pkt_dev->pkt_overhead, GFP_NOWAIT, 0, node);
if (likely(skb)) {
skb_reserve(skb, NET_SKB_PAD);
skb->dev = odev;
}
}
else
skb = __netdev_alloc_skb(odev,
pkt_dev->cur_pkt_size + 64
+ datalen + pkt_dev->pkt_overhead, GFP_NOWAIT);
if (!skb) { if (!skb) {
sprintf(pkt_dev->result, "No memory"); sprintf(pkt_dev->result, "No memory");
return NULL; return NULL;
...@@ -3674,6 +3721,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) ...@@ -3674,6 +3721,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
pkt_dev->svlan_p = 0; pkt_dev->svlan_p = 0;
pkt_dev->svlan_cfi = 0; pkt_dev->svlan_cfi = 0;
pkt_dev->svlan_id = 0xffff; pkt_dev->svlan_id = 0xffff;
pkt_dev->node = -1;
err = pktgen_setup_dev(pkt_dev, ifname); err = pktgen_setup_dev(pkt_dev, ifname);
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment