Commit 40773966 authored by Thadeu Lima de Souza Cascardo's avatar Thadeu Lima de Souza Cascardo Committed by David S. Miller

openvswitch: fix flow stats accounting when node 0 is not possible

On a system with only node 1 as possible, all statistics is going to be
accounted on node 0 as it will have a single writer.

However, when getting and clearing the statistics, node 0 is not going
to be considered, as it's not a possible node.

Tested that statistics are not zero on a system with only node 1
possible. Also compile-tested with CONFIG_NUMA off.
Signed-off-by: default avatarThadeu Lima de Souza Cascardo <cascardo@redhat.com>
Acked-by: default avatarPravin B Shelar <pshelar@ovn.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 829ff348
...@@ -142,7 +142,8 @@ void ovs_flow_stats_get(const struct sw_flow *flow, ...@@ -142,7 +142,8 @@ void ovs_flow_stats_get(const struct sw_flow *flow,
*tcp_flags = 0; *tcp_flags = 0;
memset(ovs_stats, 0, sizeof(*ovs_stats)); memset(ovs_stats, 0, sizeof(*ovs_stats));
for_each_node(node) { /* We open code this to make sure node 0 is always considered */
for (node = 0; node < MAX_NUMNODES; node = next_node(node, node_possible_map)) {
struct flow_stats *stats = rcu_dereference_ovsl(flow->stats[node]); struct flow_stats *stats = rcu_dereference_ovsl(flow->stats[node]);
if (stats) { if (stats) {
...@@ -165,7 +166,8 @@ void ovs_flow_stats_clear(struct sw_flow *flow) ...@@ -165,7 +166,8 @@ void ovs_flow_stats_clear(struct sw_flow *flow)
{ {
int node; int node;
for_each_node(node) { /* We open code this to make sure node 0 is always considered */
for (node = 0; node < MAX_NUMNODES; node = next_node(node, node_possible_map)) {
struct flow_stats *stats = ovsl_dereference(flow->stats[node]); struct flow_stats *stats = ovsl_dereference(flow->stats[node]);
if (stats) { if (stats) {
......
...@@ -148,8 +148,9 @@ static void flow_free(struct sw_flow *flow) ...@@ -148,8 +148,9 @@ static void flow_free(struct sw_flow *flow)
kfree(flow->id.unmasked_key); kfree(flow->id.unmasked_key);
if (flow->sf_acts) if (flow->sf_acts)
ovs_nla_free_flow_actions((struct sw_flow_actions __force *)flow->sf_acts); ovs_nla_free_flow_actions((struct sw_flow_actions __force *)flow->sf_acts);
for_each_node(node) /* We open code this to make sure node 0 is always considered */
if (flow->stats[node]) for (node = 0; node < MAX_NUMNODES; node = next_node(node, node_possible_map))
if (node != 0 && flow->stats[node])
kmem_cache_free(flow_stats_cache, kmem_cache_free(flow_stats_cache,
(struct flow_stats __force *)flow->stats[node]); (struct flow_stats __force *)flow->stats[node]);
kmem_cache_free(flow_cache, flow); kmem_cache_free(flow_cache, flow);
......
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