Skip to content

Commit

Permalink
net: dsa: simplify tree reference counting
Browse files Browse the repository at this point in the history
DSA trees have a refcount used to automatically free the dsa_switch_tree
structure once there is no switch devices inside of it.

The refcount is incremented when a switch is added to the tree, and
decremented when it is removed from it.

But because of kref_init, the refcount is also incremented at
initialization, and when looking up the tree from the list for symmetry.

Thus the current code stores the number of switches plus one, and makes
the switch registration more complex.

To simplify the switch registration function, we reset the refcount to
zero after initialization and don't increment it when looking up a tree.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vivien Didelot authored and David S. Miller committed Nov 5, 2017
1 parent 49463b7 commit 8e5bf97
Showing 1 changed file with 10 additions and 20 deletions.
30 changes: 10 additions & 20 deletions net/dsa/dsa2.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,9 @@ static struct dsa_switch_tree *dsa_get_dst(unsigned int index)
struct dsa_switch_tree *dst;

list_for_each_entry(dst, &dsa_switch_trees, list)
if (dst->index == index) {
kref_get(&dst->refcount);
if (dst->index == index)
return dst;
}

return NULL;
}

Expand All @@ -48,11 +47,6 @@ static void dsa_free_dst(struct kref *ref)
kfree(dst);
}

static void dsa_put_dst(struct dsa_switch_tree *dst)
{
kref_put(&dst->refcount, dsa_free_dst);
}

static struct dsa_switch_tree *dsa_add_dst(unsigned int index)
{
struct dsa_switch_tree *dst;
Expand All @@ -63,7 +57,10 @@ static struct dsa_switch_tree *dsa_add_dst(unsigned int index)
dst->index = index;
INIT_LIST_HEAD(&dst->list);
list_add_tail(&dsa_switch_trees, &dst->list);

/* Initialize the reference counter to the number of switches, not 1 */
kref_init(&dst->refcount);
refcount_set(&dst->refcount.refcount, 0);

return dst;
}
Expand Down Expand Up @@ -739,10 +736,8 @@ static int _dsa_register_switch(struct dsa_switch *ds)
return -ENOMEM;
}

if (dst->ds[index]) {
err = -EBUSY;
goto out;
}
if (dst->ds[index])
return -EBUSY;

ds->dst = dst;
ds->index = index;
Expand All @@ -758,11 +753,9 @@ static int _dsa_register_switch(struct dsa_switch *ds)
if (err < 0)
goto out_del_dst;

if (err == 1) {
/* Not all switches registered yet */
err = 0;
goto out;
}
/* Not all switches registered yet */
if (err == 1)
return 0;

if (dst->applied) {
pr_info("DSA: Disjoint trees?\n");
Expand All @@ -779,13 +772,10 @@ static int _dsa_register_switch(struct dsa_switch *ds)
goto out_del_dst;
}

dsa_put_dst(dst);
return 0;

out_del_dst:
dsa_dst_del_ds(dst, ds, ds->index);
out:
dsa_put_dst(dst);

return err;
}
Expand Down

0 comments on commit 8e5bf97

Please sign in to comment.