Skip to content

Commit

Permalink
net: openvswitch: simplify the ovs_dp_cmd_new
Browse files Browse the repository at this point in the history
use the specified functions to init resource.

Signed-off-by: Tonghao Zhang <[email protected]>
Tested-by: Greg Rose <[email protected]>
Acked-by: Pravin B Shelar <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
xpu22 authored and davem330 committed Nov 4, 2019
1 parent 4c76bf6 commit eec62ea
Showing 1 changed file with 38 additions and 22 deletions.
60 changes: 38 additions & 22 deletions net/openvswitch/datapath.c
Original file line number Diff line number Diff line change
Expand Up @@ -1576,6 +1576,31 @@ static int ovs_dp_change(struct datapath *dp, struct nlattr *a[])
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)
{
struct nlattr **a = info->attrs;
Expand All @@ -1584,7 +1609,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
struct datapath *dp;
struct vport *vport;
struct ovs_net *ovs_net;
int err, i;
int err;

err = -EINVAL;
if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID])
Expand All @@ -1597,35 +1622,26 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
err = -ENOMEM;
dp = kzalloc(sizeof(*dp), GFP_KERNEL);
if (dp == NULL)
goto err_free_reply;
goto err_destroy_reply;

ovs_dp_set_net(dp, sock_net(skb->sk));

/* Allocate table. */
err = ovs_flow_tbl_init(&dp->table);
if (err)
goto err_free_dp;
goto err_destroy_dp;

dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu);
if (!dp->stats_percpu) {
err = -ENOMEM;
err = ovs_dp_stats_init(dp);
if (err)
goto err_destroy_table;
}

dp->ports = kmalloc_array(DP_VPORT_HASH_BUCKETS,
sizeof(struct hlist_head),
GFP_KERNEL);
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_dp_vport_init(dp);
if (err)
goto err_destroy_stats;

err = ovs_meters_init(dp);
if (err)
goto err_destroy_ports_array;
goto err_destroy_ports;

/* Set up our datapath device. */
parms.name = nla_data(a[OVS_DP_ATTR_NAME]);
Expand Down Expand Up @@ -1675,15 +1691,15 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)

err_destroy_meters:
ovs_meters_exit(dp);
err_destroy_ports_array:
err_destroy_ports:
kfree(dp->ports);
err_destroy_percpu:
err_destroy_stats:
free_percpu(dp->stats_percpu);
err_destroy_table:
ovs_flow_tbl_destroy(&dp->table);
err_free_dp:
err_destroy_dp:
kfree(dp);
err_free_reply:
err_destroy_reply:
kfree_skb(reply);
err:
return err;
Expand Down

0 comments on commit eec62ea

Please sign in to comment.