mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
devlink: bump the instance index directly when iterating
commit d772781964
upstream.
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>
[ Ido: Moved the changes from core.c and devl_internal.h to leftover.c ]
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
031f06fd75
commit
eff23e59b7
@ -289,15 +289,13 @@ void devl_unlock(struct devlink *devlink)
|
||||
EXPORT_SYMBOL_GPL(devl_unlock);
|
||||
|
||||
static 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))
|
||||
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;
|
||||
|
||||
@ -306,31 +304,20 @@ devlinks_xa_find_get(struct net *net, unsigned long *indexp,
|
||||
* 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;
|
||||
}
|
||||
|
||||
static struct devlink *devlinks_xa_find_get_first(struct net *net,
|
||||
unsigned long *indexp)
|
||||
{
|
||||
return devlinks_xa_find_get(net, indexp, xa_find);
|
||||
}
|
||||
|
||||
static 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;
|
||||
}
|
||||
|
||||
/* Iterate over devlink pointers which were possible to get reference to.
|
||||
@ -338,9 +325,7 @@ static struct devlink *devlinks_xa_find_get_next(struct net *net,
|
||||
* 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))
|
||||
for (index = 0; (devlink = devlinks_xa_find_get(net, &index)); index++)
|
||||
|
||||
static struct devlink *devlink_get_from_attrs(struct net *net,
|
||||
struct nlattr **attrs)
|
||||
|
Loading…
Reference in New Issue
Block a user