diff options
| author | Andy Zhou <azhou@ovn.org> | 2017-11-10 15:09:41 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-11-12 20:37:07 -0500 |
| commit | 9602c01e57f7b868d748c2ba2aef0efa64b71ffc (patch) | |
| tree | 113c332f91bbf2002fa0f06f42b2b90bc7a6e585 /net/openvswitch | |
| parent | 5794040647de4011598a6d005fdad95d24fd385b (diff) | |
openvswitch: export get_dp() API.
Later patches will invoke get_dp() outside of datapath.c. Export it.
Signed-off-by: Andy Zhou <azhou@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch')
| -rw-r--r-- | net/openvswitch/datapath.c | 29 | ||||
| -rw-r--r-- | net/openvswitch/datapath.h | 31 |
2 files changed, 31 insertions, 29 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 4d38ac044cee..6e098035bb8f 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -142,35 +142,6 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *, | |||
| 142 | const struct dp_upcall_info *, | 142 | const struct dp_upcall_info *, |
| 143 | uint32_t cutlen); | 143 | uint32_t cutlen); |
| 144 | 144 | ||
| 145 | /* Must be called with rcu_read_lock. */ | ||
| 146 | static struct datapath *get_dp_rcu(struct net *net, int dp_ifindex) | ||
| 147 | { | ||
| 148 | struct net_device *dev = dev_get_by_index_rcu(net, dp_ifindex); | ||
| 149 | |||
| 150 | if (dev) { | ||
| 151 | struct vport *vport = ovs_internal_dev_get_vport(dev); | ||
| 152 | if (vport) | ||
| 153 | return vport->dp; | ||
| 154 | } | ||
| 155 | |||
| 156 | return NULL; | ||
| 157 | } | ||
| 158 | |||
| 159 | /* The caller must hold either ovs_mutex or rcu_read_lock to keep the | ||
| 160 | * returned dp pointer valid. | ||
| 161 | */ | ||
| 162 | static inline struct datapath *get_dp(struct net *net, int dp_ifindex) | ||
| 163 | { | ||
| 164 | struct datapath *dp; | ||
| 165 | |||
| 166 | WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); | ||
| 167 | rcu_read_lock(); | ||
| 168 | dp = get_dp_rcu(net, dp_ifindex); | ||
| 169 | rcu_read_unlock(); | ||
| 170 | |||
| 171 | return dp; | ||
| 172 | } | ||
| 173 | |||
| 174 | /* Must be called with rcu_read_lock or ovs_mutex. */ | 145 | /* Must be called with rcu_read_lock or ovs_mutex. */ |
| 175 | const char *ovs_dp_name(const struct datapath *dp) | 146 | const char *ovs_dp_name(const struct datapath *dp) |
| 176 | { | 147 | { |
diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h index 4a104ef9e12c..954c4ed465a5 100644 --- a/net/openvswitch/datapath.h +++ b/net/openvswitch/datapath.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include "conntrack.h" | 30 | #include "conntrack.h" |
| 31 | #include "flow.h" | 31 | #include "flow.h" |
| 32 | #include "flow_table.h" | 32 | #include "flow_table.h" |
| 33 | #include "vport-internal_dev.h" | ||
| 33 | 34 | ||
| 34 | #define DP_MAX_PORTS USHRT_MAX | 35 | #define DP_MAX_PORTS USHRT_MAX |
| 35 | #define DP_VPORT_HASH_BUCKETS 1024 | 36 | #define DP_VPORT_HASH_BUCKETS 1024 |
| @@ -190,6 +191,36 @@ static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_n | |||
| 190 | return ovs_lookup_vport(dp, port_no); | 191 | return ovs_lookup_vport(dp, port_no); |
| 191 | } | 192 | } |
| 192 | 193 | ||
| 194 | /* Must be called with rcu_read_lock. */ | ||
| 195 | static inline struct datapath *get_dp_rcu(struct net *net, int dp_ifindex) | ||
| 196 | { | ||
| 197 | struct net_device *dev = dev_get_by_index_rcu(net, dp_ifindex); | ||
| 198 | |||
| 199 | if (dev) { | ||
| 200 | struct vport *vport = ovs_internal_dev_get_vport(dev); | ||
| 201 | |||
| 202 | if (vport) | ||
| 203 | return vport->dp; | ||
| 204 | } | ||
| 205 | |||
| 206 | return NULL; | ||
| 207 | } | ||
| 208 | |||
| 209 | /* The caller must hold either ovs_mutex or rcu_read_lock to keep the | ||
| 210 | * returned dp pointer valid. | ||
| 211 | */ | ||
| 212 | static inline struct datapath *get_dp(struct net *net, int dp_ifindex) | ||
| 213 | { | ||
| 214 | struct datapath *dp; | ||
| 215 | |||
| 216 | WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); | ||
| 217 | rcu_read_lock(); | ||
| 218 | dp = get_dp_rcu(net, dp_ifindex); | ||
| 219 | rcu_read_unlock(); | ||
| 220 | |||
| 221 | return dp; | ||
| 222 | } | ||
| 223 | |||
| 193 | extern struct notifier_block ovs_dp_device_notifier; | 224 | extern struct notifier_block ovs_dp_device_notifier; |
| 194 | extern struct genl_family dp_vport_genl_family; | 225 | extern struct genl_family dp_vport_genl_family; |
| 195 | 226 | ||
