Commit eec62ead authored by Tonghao Zhang's avatar Tonghao Zhang Committed by David S. Miller

net: openvswitch: simplify the ovs_dp_cmd_new

use the specified functions to init resource.
Signed-off-by: default avatarTonghao Zhang <xiangxia.m.yue@gmail.com>
Tested-by: default avatarGreg Rose <gvrose8192@gmail.com>
Acked-by: default avatarPravin B Shelar <pshelar@ovn.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c76bf69
...@@ -1576,6 +1576,31 @@ static int ovs_dp_change(struct datapath *dp, struct nlattr *a[]) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment