Skip to content

Commit

Permalink
rtnetlink: add helpers to dump vf information
Browse files Browse the repository at this point in the history
similar to earlier patches, split out more parts of this function to
better see what is happening and where we assume rtnl is locked.

Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Florian Westphal authored and David S. Miller committed Sep 28, 2017
1 parent 79110a0 commit 250fc3d
Showing 1 changed file with 31 additions and 19 deletions.
50 changes: 31 additions & 19 deletions net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -1211,6 +1211,36 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
return -EMSGSIZE;
}

static noinline_for_stack int rtnl_fill_vf(struct sk_buff *skb,
struct net_device *dev,
u32 ext_filter_mask)
{
struct nlattr *vfinfo;
int i, num_vfs;

if (!dev->dev.parent || ((ext_filter_mask & RTEXT_FILTER_VF) == 0))
return 0;

num_vfs = dev_num_vf(dev->dev.parent);
if (nla_put_u32(skb, IFLA_NUM_VF, num_vfs))
return -EMSGSIZE;

if (!dev->netdev_ops->ndo_get_vf_config)
return 0;

vfinfo = nla_nest_start(skb, IFLA_VFINFO_LIST);
if (!vfinfo)
return -EMSGSIZE;

for (i = 0; i < num_vfs; i++) {
if (rtnl_fill_vfinfo(skb, dev, i, vfinfo))
return -EMSGSIZE;
}

nla_nest_end(skb, vfinfo);
return 0;
}

static int rtnl_fill_link_ifmap(struct sk_buff *skb, struct net_device *dev)
{
struct rtnl_link_ifmap map;
Expand Down Expand Up @@ -1407,27 +1437,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
if (rtnl_fill_stats(skb, dev))
goto nla_put_failure;

if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF) &&
nla_put_u32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)))
if (rtnl_fill_vf(skb, dev, ext_filter_mask))
goto nla_put_failure;

if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent &&
ext_filter_mask & RTEXT_FILTER_VF) {
int i;
struct nlattr *vfinfo;
int num_vfs = dev_num_vf(dev->dev.parent);

vfinfo = nla_nest_start(skb, IFLA_VFINFO_LIST);
if (!vfinfo)
goto nla_put_failure;
for (i = 0; i < num_vfs; i++) {
if (rtnl_fill_vfinfo(skb, dev, i, vfinfo))
goto nla_put_failure;
}

nla_nest_end(skb, vfinfo);
}

if (rtnl_port_fill(skb, dev, ext_filter_mask))
goto nla_put_failure;

Expand Down

0 comments on commit 250fc3d

Please sign in to comment.