X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdatapath.h;h=ad59a3a7b9dd8d6122d152f29174c8e89349ddb4;hb=f40869bdf6feca4d3ff7c59a1fb1f7ac101bc967;hp=9bc98fb76d5c662fe390253cda1a6b0f0f27feef;hpb=7fa0f73fb284b4406bcd085ee62552891b3fa6cd;p=sliver-openvswitch.git diff --git a/datapath/datapath.h b/datapath/datapath.h index 9bc98fb76..ad59a3a7b 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -61,10 +61,9 @@ struct dp_stats_percpu { * struct datapath - datapath for flow-based packet switching * @rcu: RCU callback head for deferred destruction. * @list_node: Element in global 'dps' list. - * @n_flows: Number of flows currently in flow table. - * @table: Current flow table. Protected by genl_lock and RCU. + * @table: Current flow table. Protected by ovs_mutex and RCU. * @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by - * RTNL and RCU. + * ovs_mutex and RCU. * @stats_percpu: Per-CPU datapath statistics. * @net: Reference to net namespace. * @@ -142,9 +141,22 @@ struct dp_upcall_info { struct ovs_net { struct list_head dps; struct vport_net vport_net; + struct work_struct dp_notify_work; }; extern int ovs_net_id; +void ovs_lock(void); +void ovs_unlock(void); + +#ifdef CONFIG_LOCKDEP +int lockdep_ovsl_is_held(void); +#else +#define lockdep_ovsl_is_held() 1 +#endif + +#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held())) +#define ovsl_dereference(p) \ + rcu_dereference_protected(p, lockdep_ovsl_is_held()) static inline struct net *ovs_dp_get_net(struct datapath *dp) { @@ -164,15 +176,15 @@ static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no return ovs_lookup_vport(dp, port_no); } -static inline struct vport *ovs_vport_rtnl_rcu(const struct datapath *dp, int port_no) +static inline struct vport *ovs_vport_ovsl_rcu(const struct datapath *dp, int port_no) { - WARN_ON_ONCE(!rcu_read_lock_held() && !rtnl_is_locked()); + WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); return ovs_lookup_vport(dp, port_no); } -static inline struct vport *ovs_vport_rtnl(const struct datapath *dp, int port_no) +static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_no) { - ASSERT_RTNL(); + ASSERT_OVSL(); return ovs_lookup_vport(dp, port_no); } @@ -189,4 +201,5 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 portid, u32 seq, u8 cmd); int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb); +void ovs_dp_notify_wq(struct work_struct *work); #endif /* datapath.h */