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
@@ -88,9 +88,10 @@ static void br_arp_send(struct net_bridge *br, struct net_bridge_port *p,
|
||||
}
|
||||
}
|
||||
|
||||
static int br_chk_addr_ip(struct net_device *dev, void *data)
|
||||
static int br_chk_addr_ip(struct net_device *dev,
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
__be32 ip = *(__be32 *)data;
|
||||
__be32 ip = *(__be32 *)priv->data;
|
||||
struct in_device *in_dev;
|
||||
__be32 addr = 0;
|
||||
|
||||
@@ -107,11 +108,15 @@ static int br_chk_addr_ip(struct net_device *dev, void *data)
|
||||
|
||||
static bool br_is_local_ip(struct net_device *dev, __be32 ip)
|
||||
{
|
||||
if (br_chk_addr_ip(dev, &ip))
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)&ip,
|
||||
};
|
||||
|
||||
if (br_chk_addr_ip(dev, &priv))
|
||||
return true;
|
||||
|
||||
/* check if ip is configured on upper dev */
|
||||
if (netdev_walk_all_upper_dev_rcu(dev, br_chk_addr_ip, &ip))
|
||||
if (netdev_walk_all_upper_dev_rcu(dev, br_chk_addr_ip, &priv))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -361,9 +366,10 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
|
||||
}
|
||||
}
|
||||
|
||||
static int br_chk_addr_ip6(struct net_device *dev, void *data)
|
||||
static int br_chk_addr_ip6(struct net_device *dev,
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct in6_addr *addr = (struct in6_addr *)data;
|
||||
struct in6_addr *addr = (struct in6_addr *)priv->data;
|
||||
|
||||
if (ipv6_chk_addr(dev_net(dev), addr, dev, 0))
|
||||
return 1;
|
||||
@@ -374,11 +380,15 @@ static int br_chk_addr_ip6(struct net_device *dev, void *data)
|
||||
static bool br_is_local_ip6(struct net_device *dev, struct in6_addr *addr)
|
||||
|
||||
{
|
||||
if (br_chk_addr_ip6(dev, addr))
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)addr,
|
||||
};
|
||||
|
||||
if (br_chk_addr_ip6(dev, &priv))
|
||||
return true;
|
||||
|
||||
/* check if ip is configured on upper dev */
|
||||
if (netdev_walk_all_upper_dev_rcu(dev, br_chk_addr_ip6, addr))
|
||||
if (netdev_walk_all_upper_dev_rcu(dev, br_chk_addr_ip6, &priv))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@@ -1360,7 +1360,7 @@ static int br_vlan_is_bind_vlan_dev(const struct net_device *dev)
|
||||
}
|
||||
|
||||
static int br_vlan_is_bind_vlan_dev_fn(struct net_device *dev,
|
||||
__always_unused void *data)
|
||||
__always_unused struct netdev_nested_priv *priv)
|
||||
{
|
||||
return br_vlan_is_bind_vlan_dev(dev);
|
||||
}
|
||||
@@ -1383,9 +1383,9 @@ struct br_vlan_bind_walk_data {
|
||||
};
|
||||
|
||||
static int br_vlan_match_bind_vlan_dev_fn(struct net_device *dev,
|
||||
void *data_in)
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct br_vlan_bind_walk_data *data = data_in;
|
||||
struct br_vlan_bind_walk_data *data = priv->data;
|
||||
int found = 0;
|
||||
|
||||
if (br_vlan_is_bind_vlan_dev(dev) &&
|
||||
@@ -1403,10 +1403,13 @@ br_vlan_get_upper_bind_vlan_dev(struct net_device *dev, u16 vid)
|
||||
struct br_vlan_bind_walk_data data = {
|
||||
.vid = vid,
|
||||
};
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)&data,
|
||||
};
|
||||
|
||||
rcu_read_lock();
|
||||
netdev_walk_all_upper_dev_rcu(dev, br_vlan_match_bind_vlan_dev_fn,
|
||||
&data);
|
||||
&priv);
|
||||
rcu_read_unlock();
|
||||
|
||||
return data.result;
|
||||
@@ -1487,9 +1490,9 @@ struct br_vlan_link_state_walk_data {
|
||||
};
|
||||
|
||||
static int br_vlan_link_state_change_fn(struct net_device *vlan_dev,
|
||||
void *data_in)
|
||||
struct netdev_nested_priv *priv)
|
||||
{
|
||||
struct br_vlan_link_state_walk_data *data = data_in;
|
||||
struct br_vlan_link_state_walk_data *data = priv->data;
|
||||
|
||||
if (br_vlan_is_bind_vlan_dev(vlan_dev))
|
||||
br_vlan_set_vlan_dev_state(data->br, vlan_dev);
|
||||
@@ -1503,10 +1506,13 @@ static void br_vlan_link_state_change(struct net_device *dev,
|
||||
struct br_vlan_link_state_walk_data data = {
|
||||
.br = br
|
||||
};
|
||||
struct netdev_nested_priv priv = {
|
||||
.data = (void *)&data,
|
||||
};
|
||||
|
||||
rcu_read_lock();
|
||||
netdev_walk_all_upper_dev_rcu(dev, br_vlan_link_state_change_fn,
|
||||
&data);
|
||||
&priv);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user