summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2019-10-25 11:46:24 -0700
committerBen Pfaff <blp@ovn.org>2019-10-31 10:06:14 -0700
commit75ad1cd6e94a06d09646ebd03097eedf39b0c6db (patch)
tree769a6adca89ee998e4004bb6d12f9666e1966867
parentcd7ea52172a02ccfcb6eed339ca18d96a16e4e0e (diff)
downloadopenvswitch-75ad1cd6e94a06d09646ebd03097eedf39b0c6db.tar.gz
Avoid indeterminate statistics in offload implementations.
A lot of the offload implementations didn't bother to initialize the statistics they were supposed to return. I don't know whether any of the callers actually use them, but it looked wrong. Found by inspection. Acked-by: Ilya Maximets <i.maximets@ovn.org> Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r--lib/netdev-dummy.c10
-rw-r--r--lib/netdev-offload-dpdk.c10
-rw-r--r--lib/netdev-offload-tc.c5
3 files changed, 20 insertions, 5 deletions
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 95e1a329a..71df29184 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -1434,7 +1434,7 @@ netdev_dummy_flow_put(struct netdev *netdev, struct match *match,
struct nlattr *actions OVS_UNUSED,
size_t actions_len OVS_UNUSED,
const ovs_u128 *ufid, struct offload_info *info,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct netdev_dummy *dev = netdev_dummy_cast(netdev);
struct offloaded_flow *off_flow;
@@ -1476,12 +1476,15 @@ netdev_dummy_flow_put(struct netdev *netdev, struct match *match,
ds_destroy(&ds);
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return 0;
}
static int
netdev_dummy_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct netdev_dummy *dev = netdev_dummy_cast(netdev);
struct offloaded_flow *off_flow;
@@ -1521,6 +1524,9 @@ exit:
ds_destroy(&ds);
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return error ? -1 : 0;
}
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 01e900461..96794dc4d 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -710,7 +710,7 @@ static int
netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match,
struct nlattr *actions, size_t actions_len,
const ovs_u128 *ufid, struct offload_info *info,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct rte_flow *rte_flow;
int ret;
@@ -732,13 +732,16 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match,
return ret;
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return netdev_offload_dpdk_add_flow(netdev, match, actions,
actions_len, ufid, info);
}
static int
netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct rte_flow *rte_flow = ufid_to_rte_flow_find(ufid);
@@ -746,6 +749,9 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
return -1;
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return netdev_offload_dpdk_destroy_flow(netdev, ufid, rte_flow);
}
diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index f6d1abb2e..c5b9cbdb2 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1143,7 +1143,7 @@ static int
netdev_tc_flow_put(struct netdev *netdev, struct match *match,
struct nlattr *actions, size_t actions_len,
const ovs_u128 *ufid, struct offload_info *info,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
enum tc_qdisc_hook hook = get_tc_qdisc_hook(netdev);
@@ -1448,6 +1448,9 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
err = tc_replace_flower(ifindex, prio, handle, &flower, block_id, hook);
if (!err) {
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
add_ufid_tc_mapping(ufid, flower.prio, flower.handle, netdev, ifindex);
}