mirror of https://gitee.com/openkylin/linux.git
net: openvswitch: simplify the ovs_dp_cmd_new
use the specified functions to init resource. Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> Tested-by: Greg Rose <gvrose8192@gmail.com> Acked-by: Pravin B Shelar <pshelar@ovn.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4c76bf696a
commit
eec62eadd1
|
@ -1576,6 +1576,31 @@ static int ovs_dp_change(struct datapath *dp, struct nlattr *a[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ovs_dp_stats_init(struct datapath *dp)
|
||||||
|
{
|
||||||
|
dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu);
|
||||||
|
if (!dp->stats_percpu)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ovs_dp_vport_init(struct datapath *dp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
dp->ports = kmalloc_array(DP_VPORT_HASH_BUCKETS,
|
||||||
|
sizeof(struct hlist_head),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!dp->ports)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++)
|
||||||
|
INIT_HLIST_HEAD(&dp->ports[i]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
||||||
{
|
{
|
||||||
struct nlattr **a = info->attrs;
|
struct nlattr **a = info->attrs;
|
||||||
|
@ -1584,7 +1609,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
||||||
struct datapath *dp;
|
struct datapath *dp;
|
||||||
struct vport *vport;
|
struct vport *vport;
|
||||||
struct ovs_net *ovs_net;
|
struct ovs_net *ovs_net;
|
||||||
int err, i;
|
int err;
|
||||||
|
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID])
|
if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID])
|
||||||
|
@ -1597,35 +1622,26 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
dp = kzalloc(sizeof(*dp), GFP_KERNEL);
|
dp = kzalloc(sizeof(*dp), GFP_KERNEL);
|
||||||
if (dp == NULL)
|
if (dp == NULL)
|
||||||
goto err_free_reply;
|
goto err_destroy_reply;
|
||||||
|
|
||||||
ovs_dp_set_net(dp, sock_net(skb->sk));
|
ovs_dp_set_net(dp, sock_net(skb->sk));
|
||||||
|
|
||||||
/* Allocate table. */
|
/* Allocate table. */
|
||||||
err = ovs_flow_tbl_init(&dp->table);
|
err = ovs_flow_tbl_init(&dp->table);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_dp;
|
goto err_destroy_dp;
|
||||||
|
|
||||||
dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu);
|
err = ovs_dp_stats_init(dp);
|
||||||
if (!dp->stats_percpu) {
|
if (err)
|
||||||
err = -ENOMEM;
|
|
||||||
goto err_destroy_table;
|
goto err_destroy_table;
|
||||||
}
|
|
||||||
|
|
||||||
dp->ports = kmalloc_array(DP_VPORT_HASH_BUCKETS,
|
err = ovs_dp_vport_init(dp);
|
||||||
sizeof(struct hlist_head),
|
if (err)
|
||||||
GFP_KERNEL);
|
goto err_destroy_stats;
|
||||||
if (!dp->ports) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto err_destroy_percpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++)
|
|
||||||
INIT_HLIST_HEAD(&dp->ports[i]);
|
|
||||||
|
|
||||||
err = ovs_meters_init(dp);
|
err = ovs_meters_init(dp);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_destroy_ports_array;
|
goto err_destroy_ports;
|
||||||
|
|
||||||
/* Set up our datapath device. */
|
/* Set up our datapath device. */
|
||||||
parms.name = nla_data(a[OVS_DP_ATTR_NAME]);
|
parms.name = nla_data(a[OVS_DP_ATTR_NAME]);
|
||||||
|
@ -1675,15 +1691,15 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
|
||||||
err_destroy_meters:
|
err_destroy_meters:
|
||||||
ovs_meters_exit(dp);
|
ovs_meters_exit(dp);
|
||||||
err_destroy_ports_array:
|
err_destroy_ports:
|
||||||
kfree(dp->ports);
|
kfree(dp->ports);
|
||||||
err_destroy_percpu:
|
err_destroy_stats:
|
||||||
free_percpu(dp->stats_percpu);
|
free_percpu(dp->stats_percpu);
|
||||||
err_destroy_table:
|
err_destroy_table:
|
||||||
ovs_flow_tbl_destroy(&dp->table);
|
ovs_flow_tbl_destroy(&dp->table);
|
||||||
err_free_dp:
|
err_destroy_dp:
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
err_free_reply:
|
err_destroy_reply:
|
||||||
kfree_skb(reply);
|
kfree_skb(reply);
|
||||||
err:
|
err:
|
||||||
return err;
|
return err;
|
||||||
|
|
Loading…
Reference in New Issue