|
|
- diff --git a/datapath/datapath.h b/datapath/datapath.h
- index fdf35f0..02be8be 100644
- --- a/datapath/datapath.h
- +++ b/datapath/datapath.h
- @@ -86,10 +86,8 @@ struct datapath {
- /* Stats. */
- struct dp_stats_percpu __percpu *stats_percpu;
-
- -#ifdef CONFIG_NET_NS
- /* Network namespace ref. */
- - struct net *net;
- -#endif
- + possible_net_t net;
-
- u32 user_features;
- };
- @@ -154,12 +152,12 @@ int lockdep_ovsl_is_held(void);
-
- static inline struct net *ovs_dp_get_net(const struct datapath *dp)
- {
- - return read_pnet(&dp->net);
- + return ovs_compat_read_pnet(&dp->net);
- }
-
- static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
- {
- - write_pnet(&dp->net, net);
- + ovs_compat_write_pnet(&dp->net, net);
- }
-
- struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no);
- diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h
- index b7dbfe3..7763584 100644
- --- a/datapath/linux/compat/include/net/net_namespace.h
- +++ b/datapath/linux/compat/include/net/net_namespace.h
- @@ -51,4 +51,57 @@ static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_p
- #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE)
- #endif /* 2.6.33 */
-
- +/* In recent kernel versions (4.1) this type is defined ; for older versions we have to define it */
- +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
- +#define ovs_compat_read_pnet read_pnet
- +#define ovs_compat_write_pnet write_pnet
- +
- +#if defined(CONFIG_NET_NS) && defined(NETNS_REFCNT_DEBUG)
- +static inline struct net *hold_net(struct net *net)
- +{
- + if (net)
- + atomic_inc(&net->use_count);
- + return net;
- +}
- +
- +static inline void release_net(struct net *net)
- +{
- + if (net)
- + atomic_dec(&net->use_count);
- +}
- +#else
- +static inline struct net *hold_net(struct net *net)
- +{
- + return net;
- +}
- +
- +static inline void release_net(struct net *net)
- +{
- +}
- +#endif
- +
- +#else /* lower than 4.1 */
- +typedef struct {
- +#ifdef CONFIG_NET_NS
- + struct net *net;
- +#endif
- +} possible_net_t;
- +
- +static inline void ovs_compat_write_pnet(possible_net_t *pnet, struct net *net)
- +{
- +#ifdef CONFIG_NET_NS
- + pnet->net = net;
- +#endif
- +}
- +
- +static inline struct net *ovs_compat_read_pnet(const possible_net_t *pnet)
- +{
- +#ifdef CONFIG_NET_NS
- + return pnet->net;
- +#else
- + return &init_net;
- +#endif
- +}
- +#endif /* 4.1.0 */
- +
- #endif /* net/net_namespace.h wrapper */
|