aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2013-12-03 13:58:53 -0500
committerJesse Gross <jesse@nicira.com>2014-01-06 18:51:48 -0500
commit663efa3696232300a8ad3a46bb10482fc0b861cf (patch)
treeb47f23f1c21ebc8c0e7deb333a44fe5a7e511b7d
parent5bb506324d150578afadd10c3198ef5b29f5876b (diff)
openvswitch: Silence RCU lockdep checks from flow lookup.
Flow lookup can happen either in packet processing context or userspace context but it was annotated as requiring RCU read lock to be held. This also allows OVS mutex to be held without causing warnings. Reported-by: Justin Pettit <jpettit@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com> Reviewed-by: Thomas Graf <tgraf@redhat.com>
-rw-r--r--net/openvswitch/datapath.c3
-rw-r--r--net/openvswitch/datapath.h2
-rw-r--r--net/openvswitch/flow_table.c2
3 files changed, 4 insertions, 3 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index fcaed98b2c0d..0727aaa2c825 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -701,8 +701,7 @@ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp,
701 if (start) { 701 if (start) {
702 const struct sw_flow_actions *sf_acts; 702 const struct sw_flow_actions *sf_acts;
703 703
704 sf_acts = rcu_dereference_check(flow->sf_acts, 704 sf_acts = rcu_dereference_ovsl(flow->sf_acts);
705 lockdep_ovsl_is_held());
706 705
707 err = ovs_nla_put_actions(sf_acts->actions, 706 err = ovs_nla_put_actions(sf_acts->actions,
708 sf_acts->actions_len, skb); 707 sf_acts->actions_len, skb);
diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h
index 4067ea41be28..ba13be4a680f 100644
--- a/net/openvswitch/datapath.h
+++ b/net/openvswitch/datapath.h
@@ -145,6 +145,8 @@ int lockdep_ovsl_is_held(void);
145#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held())) 145#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held()))
146#define ovsl_dereference(p) \ 146#define ovsl_dereference(p) \
147 rcu_dereference_protected(p, lockdep_ovsl_is_held()) 147 rcu_dereference_protected(p, lockdep_ovsl_is_held())
148#define rcu_dereference_ovsl(p) \
149 rcu_dereference_check(p, lockdep_ovsl_is_held())
148 150
149static inline struct net *ovs_dp_get_net(struct datapath *dp) 151static inline struct net *ovs_dp_get_net(struct datapath *dp)
150{ 152{
diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c
index 261a54e77503..7b9cf2c43813 100644
--- a/net/openvswitch/flow_table.c
+++ b/net/openvswitch/flow_table.c
@@ -433,7 +433,7 @@ struct sw_flow *ovs_flow_tbl_lookup_stats(struct flow_table *tbl,
433 const struct sw_flow_key *key, 433 const struct sw_flow_key *key,
434 u32 *n_mask_hit) 434 u32 *n_mask_hit)
435{ 435{
436 struct table_instance *ti = rcu_dereference(tbl->ti); 436 struct table_instance *ti = rcu_dereference_ovsl(tbl->ti);
437 struct sw_flow_mask *mask; 437 struct sw_flow_mask *mask;
438 struct sw_flow *flow; 438 struct sw_flow *flow;
439 439