Commit 59a35d60 authored by Pravin B Shelar's avatar Pravin B Shelar Committed by Jesse Gross

openvswitch: Use RCU lock for dp dump operation.

RCUfy dp-dump operation which is already read-only. This
makes all ovs dump operations lockless.
Signed-off-by: default avatarPravin B Shelar <pshelar@nicira.com>
Signed-off-by: default avatarJesse Gross <jesse@nicira.com>
parent d57170b1
...@@ -951,9 +951,10 @@ static struct genl_ops dp_packet_genl_ops[] = { ...@@ -951,9 +951,10 @@ static struct genl_ops dp_packet_genl_ops[] = {
static void get_dp_stats(struct datapath *dp, struct ovs_dp_stats *stats) static void get_dp_stats(struct datapath *dp, struct ovs_dp_stats *stats)
{ {
struct flow_table *table;
int i; int i;
struct flow_table *table = ovsl_dereference(dp->table);
table = rcu_dereference_check(dp->table, lockdep_ovsl_is_held());
stats->n_flows = ovs_flow_tbl_count(table); stats->n_flows = ovs_flow_tbl_count(table);
stats->n_hit = stats->n_missed = stats->n_lost = 0; stats->n_hit = stats->n_missed = stats->n_lost = 0;
...@@ -1665,7 +1666,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) ...@@ -1665,7 +1666,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
goto err_destroy_local_port; goto err_destroy_local_port;
ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id); ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id);
list_add_tail(&dp->list_node, &ovs_net->dps); list_add_tail_rcu(&dp->list_node, &ovs_net->dps);
ovs_unlock(); ovs_unlock();
...@@ -1703,7 +1704,7 @@ static void __dp_destroy(struct datapath *dp) ...@@ -1703,7 +1704,7 @@ static void __dp_destroy(struct datapath *dp)
ovs_dp_detach_port(vport); ovs_dp_detach_port(vport);
} }
list_del(&dp->list_node); list_del_rcu(&dp->list_node);
/* OVSP_LOCAL is datapath internal port. We need to make sure that /* OVSP_LOCAL is datapath internal port. We need to make sure that
* all port in datapath are destroyed first before freeing datapath. * all port in datapath are destroyed first before freeing datapath.
...@@ -1808,8 +1809,8 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -1808,8 +1809,8 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb)
int skip = cb->args[0]; int skip = cb->args[0];
int i = 0; int i = 0;
ovs_lock(); rcu_read_lock();
list_for_each_entry(dp, &ovs_net->dps, list_node) { list_for_each_entry_rcu(dp, &ovs_net->dps, list_node) {
if (i >= skip && if (i >= skip &&
ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid,
cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh->nlmsg_seq, NLM_F_MULTI,
...@@ -1817,7 +1818,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -1817,7 +1818,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb)
break; break;
i++; i++;
} }
ovs_unlock(); rcu_read_unlock();
cb->args[0] = i; cb->args[0] = i;
......
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