Skip to content

Commit

Permalink
geneve: Use GRO cells infrastructure.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jesse Gross authored and David S. Miller committed Aug 29, 2015
1 parent c30da49 commit 8e816df
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion drivers/net/geneve.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/etherdevice.h>
#include <linux/hash.h>
#include <net/dst_metadata.h>
#include <net/gro_cells.h>
#include <net/rtnetlink.h>
#include <net/geneve.h>
#include <net/protocol.h>
Expand Down Expand Up @@ -58,6 +59,7 @@ struct geneve_dev {
struct list_head next; /* geneve's per namespace list */
__be16 dst_port;
bool collect_md;
struct gro_cells gro_cells;
};

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

netif_rx(skb);
gro_cells_receive(&geneve->gro_cells, skb);
return;
drop:
/* Consume bad packet */
Expand All @@ -209,14 +211,27 @@ static void geneve_rx(struct geneve_sock *gs, struct sk_buff *skb)
/* Setup stats when device is created */
static int geneve_init(struct net_device *dev)
{
struct geneve_dev *geneve = netdev_priv(dev);
int err;

dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!dev->tstats)
return -ENOMEM;

err = gro_cells_init(&geneve->gro_cells, dev);
if (err) {
free_percpu(dev->tstats);
return err;
}

return 0;
}

static void geneve_uninit(struct net_device *dev)
{
struct geneve_dev *geneve = netdev_priv(dev);

gro_cells_destroy(&geneve->gro_cells);
free_percpu(dev->tstats);
}

Expand Down

0 comments on commit 8e816df

Please sign in to comment.