summaryrefslogtreecommitdiffstats
path: root/lib/objagg.c
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2019-02-14 15:39:07 +0100
committerDavid S. Miller <davem@davemloft.net>2019-02-14 12:41:54 -0500
commitfa8ba2cba7f9c75b84f82d174658d959d25d4561 (patch)
tree8518fc3aa981b96dad1c2b4a2060da0075819820 /lib/objagg.c
parente0c6d1d8591ffae75e1bcfd36fa9d411c29f9ef3 (diff)
downloadlinux-stable-fa8ba2cba7f9c75b84f82d174658d959d25d4561.tar.gz
linux-stable-fa8ba2cba7f9c75b84f82d174658d959d25d4561.tar.bz2
linux-stable-fa8ba2cba7f9c75b84f82d174658d959d25d4561.zip
lib: objagg: fix handling of object with 0 users when assembling hints
It is possible that there might be an originally parent object with 0 direct users that is in hints no longer considered as parent. Then the weight of this object is 0 and current code ignores him. That's why the total amount of hint objects might be lower than for the original objagg and WARN_ON is hit. Fix this be considering 0 weight valid. Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation") Signed-off-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib/objagg.c')
-rw-r--r--lib/objagg.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/objagg.c b/lib/objagg.c
index d552ec9c60ed..576be22e86de 100644
--- a/lib/objagg.c
+++ b/lib/objagg.c
@@ -744,8 +744,6 @@ static unsigned int objagg_tmp_graph_node_weight(struct objagg_tmp_graph *graph,
* that this node can represent with delta.
*/
- if (node->crossed_out)
- return 0;
for (j = 0; j < graph->nodes_count; j++) {
if (!objagg_tmp_graph_is_edge(graph, index, j))
continue;
@@ -759,14 +757,18 @@ static unsigned int objagg_tmp_graph_node_weight(struct objagg_tmp_graph *graph,
static int objagg_tmp_graph_node_max_weight(struct objagg_tmp_graph *graph)
{
+ struct objagg_tmp_node *node;
unsigned int max_weight = 0;
unsigned int weight;
int max_index = -1;
int i;
for (i = 0; i < graph->nodes_count; i++) {
+ node = &graph->nodes[i];
+ if (node->crossed_out)
+ continue;
weight = objagg_tmp_graph_node_weight(graph, i);
- if (weight > max_weight) {
+ if (weight >= max_weight) {
max_weight = weight;
max_index = i;
}