Skip to content

Commit 8e816df

Browse files
jessegrossdavem330
authored andcommitted
geneve: Use GRO cells infrastructure.
Geneve can benefit from GRO at the device level in a manner similar to other tunnels, especially as hardware offloads are still emerging. After this patch, aggregated frames are seen on the tunnel interface. Single stream throughput nearly doubles in ideal circumstances (on old hardware). Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c30da49 commit 8e816df

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

drivers/net/geneve.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/etherdevice.h>
1717
#include <linux/hash.h>
1818
#include <net/dst_metadata.h>
19+
#include <net/gro_cells.h>
1920
#include <net/rtnetlink.h>
2021
#include <net/geneve.h>
2122
#include <net/protocol.h>
@@ -58,6 +59,7 @@ struct geneve_dev {
5859
struct list_head next; /* geneve's per namespace list */
5960
__be16 dst_port;
6061
bool collect_md;
62+
struct gro_cells gro_cells;
6163
};
6264

6365
struct geneve_sock {
@@ -199,7 +201,7 @@ static void geneve_rx(struct geneve_sock *gs, struct sk_buff *skb)
199201
stats->rx_bytes += skb->len;
200202
u64_stats_update_end(&stats->syncp);
201203

202-
netif_rx(skb);
204+
gro_cells_receive(&geneve->gro_cells, skb);
203205
return;
204206
drop:
205207
/* Consume bad packet */
@@ -209,14 +211,27 @@ static void geneve_rx(struct geneve_sock *gs, struct sk_buff *skb)
209211
/* Setup stats when device is created */
210212
static int geneve_init(struct net_device *dev)
211213
{
214+
struct geneve_dev *geneve = netdev_priv(dev);
215+
int err;
216+
212217
dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
213218
if (!dev->tstats)
214219
return -ENOMEM;
220+
221+
err = gro_cells_init(&geneve->gro_cells, dev);
222+
if (err) {
223+
free_percpu(dev->tstats);
224+
return err;
225+
}
226+
215227
return 0;
216228
}
217229

218230
static void geneve_uninit(struct net_device *dev)
219231
{
232+
struct geneve_dev *geneve = netdev_priv(dev);
233+
234+
gro_cells_destroy(&geneve->gro_cells);
220235
free_percpu(dev->tstats);
221236
}
222237

0 commit comments

Comments
 (0)