Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −6
Original line number Original line Diff line number Diff line
@@ -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)
		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)
				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)
	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)
			break;
			break;
		i++;
		i++;
	}
	}
	ovs_unlock();
	rcu_read_unlock();


	cb->args[0] = i;
	cb->args[0] = i;