mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
net: dsa: remove the "dsa_to_port in a loop" antipattern from the core
Ever since Vivien's conversion of the ds->ports array into a dst->ports list, and the introduction of dsa_to_port, iterations through the ports of a switch became quadratic whenever dsa_to_port was needed. dsa_to_port can either be called directly, or indirectly through the dsa_is_{user,cpu,dsa,unused}_port helpers. Use the newly introduced dsa_switch_for_each_port() iteration macro that works with the iterator variable being a struct dsa_port *dp directly, and not an int i. It is an expensive variable to go from i to dp, but cheap to go from dp to i. This macro iterates through the entire ds->dst->ports list and filters by the ports belonging just to the switch provided as argument. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
82b318983c
commit
d0004a020b
6 changed files with 45 additions and 56 deletions
|
@ -802,17 +802,16 @@ static int dsa_switch_setup_tag_protocol(struct dsa_switch *ds)
|
|||
{
|
||||
const struct dsa_device_ops *tag_ops = ds->dst->tag_ops;
|
||||
struct dsa_switch_tree *dst = ds->dst;
|
||||
int port, err;
|
||||
struct dsa_port *cpu_dp;
|
||||
int err;
|
||||
|
||||
if (tag_ops->proto == dst->default_proto)
|
||||
return 0;
|
||||
|
||||
for (port = 0; port < ds->num_ports; port++) {
|
||||
if (!dsa_is_cpu_port(ds, port))
|
||||
continue;
|
||||
|
||||
dsa_switch_for_each_cpu_port(cpu_dp, ds) {
|
||||
rtnl_lock();
|
||||
err = ds->ops->change_tag_protocol(ds, port, tag_ops->proto);
|
||||
err = ds->ops->change_tag_protocol(ds, cpu_dp->index,
|
||||
tag_ops->proto);
|
||||
rtnl_unlock();
|
||||
if (err) {
|
||||
dev_err(ds->dev, "Unable to use tag protocol \"%s\": %pe\n",
|
||||
|
@ -1150,7 +1149,7 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst,
|
|||
goto out_unlock;
|
||||
|
||||
list_for_each_entry(dp, &dst->ports, list) {
|
||||
if (!dsa_is_user_port(dp->ds, dp->index))
|
||||
if (!dsa_port_is_user(dp))
|
||||
continue;
|
||||
|
||||
if (dp->slave->flags & IFF_UP)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue