aboutsummaryrefslogtreecommitdiffstats
path: root/net/devlink
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2023-01-05 22:33:54 -0800
committerDavid S. Miller <davem@davemloft.net>2023-01-06 12:56:18 +0000
commitd772781964415c63759572b917e21c4f7ec08d9f (patch)
tree966ea332b2ac0d739f69b466d1e3f6e77ec8788b /net/devlink
parent6b754d7bd007c5f68fbb2d9abd5c00d253b033d0 (diff)
downloadlinux-d772781964415c63759572b917e21c4f7ec08d9f.tar.gz
devlink: bump the instance index directly when iterating
xa_find_after() is designed to handle multi-index entries correctly. If a xarray has two entries one which spans indexes 0-3 and one at index 4 xa_find_after(0) will return the entry at index 4. Having to juggle the two callbacks, however, is unnecessary in case of the devlink xarray, as there is 1:1 relationship with indexes. Always use xa_find() and increment the index manually. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/devlink')
-rw-r--r--net/devlink/core.c31
-rw-r--r--net/devlink/devl_internal.h17
2 files changed, 13 insertions, 35 deletions
diff --git a/net/devlink/core.c b/net/devlink/core.c
index 371d6821315de..88c88b8053e2e 100644
--- a/net/devlink/core.c
+++ b/net/devlink/core.c
@@ -91,16 +91,13 @@ void devlink_put(struct devlink *devlink)
call_rcu(&devlink->rcu, __devlink_put_rcu);
}
-struct devlink *
-devlinks_xa_find_get(struct net *net, unsigned long *indexp,
- void * (*xa_find_fn)(struct xarray *, unsigned long *,
- unsigned long, xa_mark_t))
+struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp)
{
- struct devlink *devlink;
+ struct devlink *devlink = NULL;
rcu_read_lock();
retry:
- devlink = xa_find_fn(&devlinks, indexp, ULONG_MAX, DEVLINK_REGISTERED);
+ devlink = xa_find(&devlinks, indexp, ULONG_MAX, DEVLINK_REGISTERED);
if (!devlink)
goto unlock;
@@ -109,31 +106,21 @@ retry:
* This prevents live-lock of devlink_unregister() wait for completion.
*/
if (xa_get_mark(&devlinks, *indexp, DEVLINK_UNREGISTERING))
- goto retry;
+ goto next;
- /* For a possible retry, the xa_find_after() should be always used */
- xa_find_fn = xa_find_after;
if (!devlink_try_get(devlink))
- goto retry;
+ goto next;
if (!net_eq(devlink_net(devlink), net)) {
devlink_put(devlink);
- goto retry;
+ goto next;
}
unlock:
rcu_read_unlock();
return devlink;
-}
-
-struct devlink *
-devlinks_xa_find_get_first(struct net *net, unsigned long *indexp)
-{
- return devlinks_xa_find_get(net, indexp, xa_find);
-}
-struct devlink *
-devlinks_xa_find_get_next(struct net *net, unsigned long *indexp)
-{
- return devlinks_xa_find_get(net, indexp, xa_find_after);
+next:
+ (*indexp)++;
+ goto retry;
}
/**
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index adf9f6c177dba..14767e8091780 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -82,18 +82,9 @@ extern struct genl_family devlink_nl_family;
* in loop body in order to release the reference.
*/
#define devlinks_xa_for_each_registered_get(net, index, devlink) \
- for (index = 0, \
- devlink = devlinks_xa_find_get_first(net, &index); \
- devlink; devlink = devlinks_xa_find_get_next(net, &index))
-
-struct devlink *
-devlinks_xa_find_get(struct net *net, unsigned long *indexp,
- void * (*xa_find_fn)(struct xarray *, unsigned long *,
- unsigned long, xa_mark_t));
-struct devlink *
-devlinks_xa_find_get_first(struct net *net, unsigned long *indexp);
-struct devlink *
-devlinks_xa_find_get_next(struct net *net, unsigned long *indexp);
+ for (index = 0; (devlink = devlinks_xa_find_get(net, &index)); index++)
+
+struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp);
/* Netlink */
#define DEVLINK_NL_FLAG_NEED_PORT BIT(0)
@@ -135,7 +126,7 @@ struct devlink_gen_cmd {
*/
#define devlink_dump_for_each_instance_get(msg, state, devlink) \
for (; (devlink = devlinks_xa_find_get(sock_net(msg->sk), \
- &state->instance, xa_find)); \
+ &state->instance)); \
state->instance++, state->idx = 0)
extern const struct genl_small_ops devlink_nl_ops[56];