X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport-netdev.c;h=72d2928d5f2e95156931e22e6e092bd9fba229dc;hb=9cc8b4e4af67a4871d0c9db67500a0a79a26685f;hp=8e7847efda923f26959238d9d44db20f9e72e67d;hpb=5953c70e61897996e8b05fadea988b3289e133de;p=openvswitch diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index 8e7847ef..72d2928d 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -22,6 +22,9 @@ #include "compat.h" +/* If the native device stats aren't 64 bit use the vport stats tracking instead. */ +#define USE_VPORT_STATS (sizeof(((struct net_device_stats *)0)->rx_bytes) < sizeof(u64)) + static void netdev_port_receive(struct net_bridge_port *, struct sk_buff *); /* @@ -97,6 +100,16 @@ netdev_create(const char *name, const void __user *config) goto error_put; } + /* If we are using the vport stats layer initialize it to the current + * values so we are roughly consistent with the device stats. */ + if (USE_VPORT_STATS) { + struct odp_vport_stats stats; + + err = netdev_get_stats(vport, &stats); + if (!err) + vport_set_stats(vport, &stats); + } + return vport; error_put: @@ -291,7 +304,8 @@ netdev_get_vport(struct net_device *dev) struct vport_ops netdev_vport_ops = { .type = "netdev", - .flags = VPORT_F_REQUIRED, + .flags = (VPORT_F_REQUIRED | + (USE_VPORT_STATS ? VPORT_F_GEN_STATS : 0)), .init = netdev_init, .exit = netdev_exit, .create = netdev_create,