Message ID | 20230407142042.11901-1-peter@n8pjl.ca (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] ax25: exit linked-list searches earlier | expand |
On Fri, Apr 07, 2023 at 10:20:42AM -0400, Peter Lafreniere wrote: > diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c > index b7c4d656a94b..ed2cab200589 100644 > --- a/net/ax25/ax25_route.c > +++ b/net/ax25/ax25_route.c > @@ -364,6 +364,9 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) > if (ax25cmp(&ax25_rt->callsign, &null_ax25_address) == 0 && ax25_rt->dev == dev) > ax25_def_rt = ax25_rt; > } > + > + if (ax25_spe_rt != NULL) > + break; Better to just return directly. diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c index b7c4d656a94b..a8a3ab8c92f6 100644 --- a/net/ax25/ax25_route.c +++ b/net/ax25/ax25_route.c @@ -364,13 +364,12 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) if (ax25cmp(&ax25_rt->callsign, &null_ax25_address) == 0 && ax25_rt->dev == dev) ax25_def_rt = ax25_rt; } - } - ax25_rt = ax25_def_rt; - if (ax25_spe_rt != NULL) - ax25_rt = ax25_spe_rt; + if (ax25_spe_rt) + return ax25_spe_rt; + } - return ax25_rt; + return ax25_def_rt; } /*
diff --git a/net/ax25/ax25_dev.c b/net/ax25/ax25_dev.c index c5462486dbca..8186faea6b0d 100644 --- a/net/ax25/ax25_dev.c +++ b/net/ax25/ax25_dev.c @@ -34,11 +34,13 @@ ax25_dev *ax25_addr_ax25dev(ax25_address *addr) ax25_dev *ax25_dev, *res = NULL; spin_lock_bh(&ax25_dev_lock); - for (ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) + for (ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) { if (ax25cmp(addr, (const ax25_address *)ax25_dev->dev->dev_addr) == 0) { res = ax25_dev; ax25_dev_hold(ax25_dev); + break; } + } spin_unlock_bh(&ax25_dev_lock); return res; diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c index b7c4d656a94b..ed2cab200589 100644 --- a/net/ax25/ax25_route.c +++ b/net/ax25/ax25_route.c @@ -364,6 +364,9 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) if (ax25cmp(&ax25_rt->callsign, &null_ax25_address) == 0 && ax25_rt->dev == dev) ax25_def_rt = ax25_rt; } + + if (ax25_spe_rt != NULL) + break; } ax25_rt = ax25_def_rt;
There's no need to loop until the end of the list if we have a result. Device callsigns are unique, so there can only be one dev returned from ax25_addr_ax25dev(). If not, there would be inconsistencies based on order of insertion, and refcount leaks. Same reasoning for ax25_get_route() as above. Signed-off-by: Peter Lafreniere <peter@n8pjl.ca> --- net/ax25/ax25_dev.c | 4 +++- net/ax25/ax25_route.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-)