Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -142,7 +142,8 @@ void ovs_flow_stats_get(const struct sw_flow *flow,
	*tcp_flags = 0;
	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]);

		if (stats) {
@@ -165,7 +166,8 @@ void ovs_flow_stats_clear(struct sw_flow *flow)
{
	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]);

		if (stats) {
+3 −2
Original line number Diff line number Diff line
@@ -148,8 +148,9 @@ static void flow_free(struct sw_flow *flow)
		kfree(flow->id.unmasked_key);
	if (flow->sf_acts)
		ovs_nla_free_flow_actions((struct sw_flow_actions __force *)flow->sf_acts);
	for_each_node(node)
		if (flow->stats[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))
		if (node != 0 && flow->stats[node])
			kmem_cache_free(flow_stats_cache,
					(struct flow_stats __force *)flow->stats[node]);
	kmem_cache_free(flow_cache, flow);