net: core: introduce struct netdev_nested_priv for nested interface infrastructure
Functions related to nested interface infrastructure such as
netdev_walk_all_{ upper | lower }_dev() pass both private functions
and "data" pointer to handle their own things.
At this point, the data pointer type is void *.
In order to make it easier to expand common variables and functions,
this new netdev_nested_priv structure is added.
In the following patch, a new member variable will be added into this
struct to fix the lockdep issue.
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
fe8300fd8d
commit
eff7423365
@@ -6812,9 +6812,10 @@ static struct netdev_adjacent *__netdev_find_adj(struct net_device *adj_dev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ____netdev_has_upper_dev(struct net_device *upper_dev, void *data)
|
||||
static int ____netdev_has_upper_dev(struct net_device *upper_dev,
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *dev = data;
|
||||
struct net_device *dev = (struct net_device *)priv->data;
|
||||
|
||||
return upper_dev == dev;
|
||||
}
|
||||
@@ -6831,10 +6832,14 @@ static int ____netdev_has_upper_dev(struct net_device *upper_dev, void *data)
|
||||
bool netdev_has_upper_dev(struct net_device *dev,
|
||||
struct net_device *upper_dev)
|
||||
{
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)upper_dev,
|
||||
};
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
return netdev_walk_all_upper_dev_rcu(dev, ____netdev_has_upper_dev,
|
||||
upper_dev);
|
||||
&priv);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_has_upper_dev);
|
||||
|
||||
@@ -6851,8 +6856,12 @@ EXPORT_SYMBOL(netdev_has_upper_dev);
|
||||
bool netdev_has_upper_dev_all_rcu(struct net_device *dev,
|
||||
struct net_device *upper_dev)
|
||||
{
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)upper_dev,
|
||||
};
|
||||
|
||||
return !!netdev_walk_all_upper_dev_rcu(dev, ____netdev_has_upper_dev,
|
||||
upper_dev);
|
||||
&priv);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_has_upper_dev_all_rcu);
|
||||
|
||||
@@ -6997,8 +7006,8 @@ static struct net_device *netdev_next_upper_dev_rcu(struct net_device *dev,
|
||||
|
||||
static int __netdev_walk_all_upper_dev(struct net_device *dev,
|
||||
int (*fn)(struct net_device *dev,
|
||||
void *data),
|
||||
void *data)
|
||||
struct netdev_nested_priv *priv),
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *udev, *next, *now, *dev_stack[MAX_NEST_DEV + 1];
|
||||
struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1];
|
||||
@@ -7010,7 +7019,7 @@ static int __netdev_walk_all_upper_dev(struct net_device *dev,
|
||||
|
||||
while (1) {
|
||||
if (now != dev) {
|
||||
ret = fn(now, data);
|
||||
ret = fn(now, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -7046,8 +7055,8 @@ static int __netdev_walk_all_upper_dev(struct net_device *dev,
|
||||
|
||||
int netdev_walk_all_upper_dev_rcu(struct net_device *dev,
|
||||
int (*fn)(struct net_device *dev,
|
||||
void *data),
|
||||
void *data)
|
||||
struct netdev_nested_priv *priv),
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *udev, *next, *now, *dev_stack[MAX_NEST_DEV + 1];
|
||||
struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1];
|
||||
@@ -7058,7 +7067,7 @@ int netdev_walk_all_upper_dev_rcu(struct net_device *dev,
|
||||
|
||||
while (1) {
|
||||
if (now != dev) {
|
||||
ret = fn(now, data);
|
||||
ret = fn(now, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -7094,10 +7103,14 @@ EXPORT_SYMBOL_GPL(netdev_walk_all_upper_dev_rcu);
|
||||
static bool __netdev_has_upper_dev(struct net_device *dev,
|
||||
struct net_device *upper_dev)
|
||||
{
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)upper_dev,
|
||||
};
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
return __netdev_walk_all_upper_dev(dev, ____netdev_has_upper_dev,
|
||||
upper_dev);
|
||||
&priv);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -7215,8 +7228,8 @@ static struct net_device *__netdev_next_lower_dev(struct net_device *dev,
|
||||
|
||||
int netdev_walk_all_lower_dev(struct net_device *dev,
|
||||
int (*fn)(struct net_device *dev,
|
||||
void *data),
|
||||
void *data)
|
||||
struct netdev_nested_priv *priv),
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *ldev, *next, *now, *dev_stack[MAX_NEST_DEV + 1];
|
||||
struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1];
|
||||
@@ -7227,7 +7240,7 @@ int netdev_walk_all_lower_dev(struct net_device *dev,
|
||||
|
||||
while (1) {
|
||||
if (now != dev) {
|
||||
ret = fn(now, data);
|
||||
ret = fn(now, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -7262,8 +7275,8 @@ EXPORT_SYMBOL_GPL(netdev_walk_all_lower_dev);
|
||||
|
||||
static int __netdev_walk_all_lower_dev(struct net_device *dev,
|
||||
int (*fn)(struct net_device *dev,
|
||||
void *data),
|
||||
void *data)
|
||||
struct netdev_nested_priv *priv),
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *ldev, *next, *now, *dev_stack[MAX_NEST_DEV + 1];
|
||||
struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1];
|
||||
@@ -7275,7 +7288,7 @@ static int __netdev_walk_all_lower_dev(struct net_device *dev,
|
||||
|
||||
while (1) {
|
||||
if (now != dev) {
|
||||
ret = fn(now, data);
|
||||
ret = fn(now, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -7364,13 +7377,15 @@ static u8 __netdev_lower_depth(struct net_device *dev)
|
||||
return max_depth;
|
||||
}
|
||||
|
||||
static int __netdev_update_upper_level(struct net_device *dev, void *data)
|
||||
static int __netdev_update_upper_level(struct net_device *dev,
|
||||
struct netdev_nested_priv *__unused)
|
||||
{
|
||||
dev->upper_level = __netdev_upper_depth(dev) + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __netdev_update_lower_level(struct net_device *dev, void *data)
|
||||
static int __netdev_update_lower_level(struct net_device *dev,
|
||||
struct netdev_nested_priv *__unused)
|
||||
{
|
||||
dev->lower_level = __netdev_lower_depth(dev) + 1;
|
||||
return 0;
|
||||
@@ -7378,8 +7393,8 @@ static int __netdev_update_lower_level(struct net_device *dev, void *data)
|
||||
|
||||
int netdev_walk_all_lower_dev_rcu(struct net_device *dev,
|
||||
int (*fn)(struct net_device *dev,
|
||||
void *data),
|
||||
void *data)
|
||||
struct netdev_nested_priv *priv),
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct net_device *ldev, *next, *now, *dev_stack[MAX_NEST_DEV + 1];
|
||||
struct list_head *niter, *iter, *iter_stack[MAX_NEST_DEV + 1];
|
||||
@@ -7390,7 +7405,7 @@ int netdev_walk_all_lower_dev_rcu(struct net_device *dev,
|
||||
|
||||
while (1) {
|
||||
if (now != dev) {
|
||||
ret = fn(now, data);
|
||||
ret = fn(now, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user