mirror of https://gitee.com/openkylin/linux.git
Merge branch 'possible_net_t'
Eric W. Biederman says: ==================== Introduce possible_net_t The current usage of write_pnet and read_pnet is a little laborious and error prone as you only notice if you failed to include them if are compiling with network namespaces enabled. possible_net_t remedies that by using a type that is 0 bytes when network namespaces are disabled and can only be read and written to with read_pnet and write_pnet. Aka less work and safer for the same effect. I kill hold_net and release_net first as are they are haven't been used since 2008 and are noise at the points where write_pnet and read_pnet are used. I have folded in Eric Dumazets suggestions to improve the killing of hold_net and release net. And respon. I had to respin anyway as there was enough changes elsewhere in the tree the previous version of these patches did not quite apply cleanly. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
20453d88cc
|
@ -1721,9 +1721,7 @@ struct net_device {
|
|||
struct netpoll_info __rcu *npinfo;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *nd_net;
|
||||
#endif
|
||||
possible_net_t nd_net;
|
||||
|
||||
/* mid-layer private */
|
||||
union {
|
||||
|
@ -1863,10 +1861,7 @@ struct net *dev_net(const struct net_device *dev)
|
|||
static inline
|
||||
void dev_net_set(struct net_device *dev, struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
release_net(dev->nd_net);
|
||||
dev->nd_net = hold_net(net);
|
||||
#endif
|
||||
write_pnet(&dev->nd_net, net);
|
||||
}
|
||||
|
||||
static inline bool netdev_uses_dsa(struct net_device *dev)
|
||||
|
|
|
@ -3183,10 +3183,8 @@ struct wiphy {
|
|||
const struct ieee80211_ht_cap *ht_capa_mod_mask;
|
||||
const struct ieee80211_vht_cap *vht_capa_mod_mask;
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
/* the network namespace this phy lives in currently */
|
||||
struct net *_net;
|
||||
#endif
|
||||
possible_net_t _net;
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
const struct iw_handler_def *wext;
|
||||
|
|
|
@ -95,17 +95,10 @@ static inline void fib_rule_get(struct fib_rule *rule)
|
|||
atomic_inc(&rule->refcnt);
|
||||
}
|
||||
|
||||
static inline void fib_rule_put_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct fib_rule *rule = container_of(head, struct fib_rule, rcu);
|
||||
release_net(rule->fr_net);
|
||||
kfree(rule);
|
||||
}
|
||||
|
||||
static inline void fib_rule_put(struct fib_rule *rule)
|
||||
{
|
||||
if (atomic_dec_and_test(&rule->refcnt))
|
||||
call_rcu(&rule->rcu, fib_rule_put_rcu);
|
||||
kfree_rcu(rule, rcu);
|
||||
}
|
||||
|
||||
static inline u32 frh_get_table(struct fib_rule_hdr *frh, struct nlattr **nla)
|
||||
|
|
|
@ -92,9 +92,7 @@ struct genl_info {
|
|||
struct genlmsghdr * genlhdr;
|
||||
void * userhdr;
|
||||
struct nlattr ** attrs;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net * _net;
|
||||
#endif
|
||||
possible_net_t _net;
|
||||
void * user_ptr[2];
|
||||
struct sock * dst_sk;
|
||||
};
|
||||
|
|
|
@ -76,9 +76,7 @@ struct inet_ehash_bucket {
|
|||
* ports are created in O(1) time? I thought so. ;-) -DaveM
|
||||
*/
|
||||
struct inet_bind_bucket {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *ib_net;
|
||||
#endif
|
||||
possible_net_t ib_net;
|
||||
unsigned short port;
|
||||
signed char fastreuse;
|
||||
signed char fastreuseport;
|
||||
|
|
|
@ -47,13 +47,13 @@ static inline struct net *skb_net(const struct sk_buff *skb)
|
|||
* Start with the most likely hit
|
||||
* End with BUG
|
||||
*/
|
||||
if (likely(skb->dev && skb->dev->nd_net))
|
||||
if (likely(skb->dev && dev_net(skb->dev)))
|
||||
return dev_net(skb->dev);
|
||||
if (skb_dst(skb) && skb_dst(skb)->dev)
|
||||
return dev_net(skb_dst(skb)->dev);
|
||||
WARN(skb->sk, "Maybe skb_sknet should be used in %s() at line:%d\n",
|
||||
__func__, __LINE__);
|
||||
if (likely(skb->sk && skb->sk->sk_net))
|
||||
if (likely(skb->sk && sock_net(skb->sk)))
|
||||
return sock_net(skb->sk);
|
||||
pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
|
||||
__func__, __LINE__);
|
||||
|
@ -71,11 +71,11 @@ static inline struct net *skb_sknet(const struct sk_buff *skb)
|
|||
#ifdef CONFIG_NET_NS
|
||||
#ifdef CONFIG_IP_VS_DEBUG
|
||||
/* Start with the most likely hit */
|
||||
if (likely(skb->sk && skb->sk->sk_net))
|
||||
if (likely(skb->sk && sock_net(skb->sk)))
|
||||
return sock_net(skb->sk);
|
||||
WARN(skb->dev, "Maybe skb_net should be used instead in %s() line:%d\n",
|
||||
__func__, __LINE__);
|
||||
if (likely(skb->dev && skb->dev->nd_net))
|
||||
if (likely(skb->dev && dev_net(skb->dev)))
|
||||
return dev_net(skb->dev);
|
||||
pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
|
||||
__func__, __LINE__);
|
||||
|
|
|
@ -65,9 +65,7 @@ enum {
|
|||
};
|
||||
|
||||
struct neigh_parms {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
possible_net_t net;
|
||||
struct net_device *dev;
|
||||
struct list_head list;
|
||||
int (*neigh_setup)(struct neighbour *);
|
||||
|
@ -167,9 +165,7 @@ struct neigh_ops {
|
|||
|
||||
struct pneigh_entry {
|
||||
struct pneigh_entry *next;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
possible_net_t net;
|
||||
struct net_device *dev;
|
||||
u8 flags;
|
||||
u8 key[0];
|
||||
|
|
|
@ -49,11 +49,6 @@ struct net {
|
|||
atomic_t count; /* To decided when the network
|
||||
* namespace should be shut down.
|
||||
*/
|
||||
#ifdef NETNS_REFCNT_DEBUG
|
||||
atomic_t use_count; /* To track references we
|
||||
* destroy on demand
|
||||
*/
|
||||
#endif
|
||||
spinlock_t rules_mod_lock;
|
||||
|
||||
atomic64_t cookie_gen;
|
||||
|
@ -236,48 +231,27 @@ int net_eq(const struct net *net1, const struct net *net2)
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef 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
|
||||
|
||||
typedef struct {
|
||||
#ifdef CONFIG_NET_NS
|
||||
|
||||
static inline void write_pnet(struct net **pnet, struct net *net)
|
||||
{
|
||||
*pnet = net;
|
||||
}
|
||||
|
||||
static inline struct net *read_pnet(struct net * const *pnet)
|
||||
{
|
||||
return *pnet;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define write_pnet(pnet, net) do { (void)(net);} while (0)
|
||||
#define read_pnet(pnet) (&init_net)
|
||||
|
||||
struct net *net;
|
||||
#endif
|
||||
} possible_net_t;
|
||||
|
||||
static inline void write_pnet(possible_net_t *pnet, struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
pnet->net = net;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct net *read_pnet(const possible_net_t *pnet)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
return pnet->net;
|
||||
#else
|
||||
return &init_net;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define for_each_net(VAR) \
|
||||
list_for_each_entry(VAR, &net_namespace_list, list)
|
||||
|
|
|
@ -95,9 +95,8 @@ struct nf_conn {
|
|||
/* Timer function; drops refcnt when it goes off. */
|
||||
struct timer_list timeout;
|
||||
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *ct_net;
|
||||
#endif
|
||||
possible_net_t ct_net;
|
||||
|
||||
/* all members below initialized via memset */
|
||||
u8 __nfct_init_offset[0];
|
||||
|
||||
|
|
|
@ -190,9 +190,7 @@ struct sock_common {
|
|||
struct hlist_nulls_node skc_portaddr_node;
|
||||
};
|
||||
struct proto *skc_prot;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *skc_net;
|
||||
#endif
|
||||
possible_net_t skc_net;
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct in6_addr skc_v6_daddr;
|
||||
|
@ -2204,7 +2202,7 @@ static inline void sk_change_net(struct sock *sk, struct net *net)
|
|||
|
||||
if (!net_eq(current_net, net)) {
|
||||
put_net(current_net);
|
||||
sock_net_set(sk, hold_net(net));
|
||||
sock_net_set(sk, net);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -126,9 +126,7 @@ struct xfrm_state_walk {
|
|||
|
||||
/* Full description of state of transformer. */
|
||||
struct xfrm_state {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *xs_net;
|
||||
#endif
|
||||
possible_net_t xs_net;
|
||||
union {
|
||||
struct hlist_node gclist;
|
||||
struct hlist_node bydst;
|
||||
|
@ -522,9 +520,7 @@ struct xfrm_policy_queue {
|
|||
};
|
||||
|
||||
struct xfrm_policy {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *xp_net;
|
||||
#endif
|
||||
possible_net_t xp_net;
|
||||
struct hlist_node bydst;
|
||||
struct hlist_node byidx;
|
||||
|
||||
|
|
|
@ -940,7 +940,7 @@ p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args)
|
|||
sin_server.sin_family = AF_INET;
|
||||
sin_server.sin_addr.s_addr = in_aton(addr);
|
||||
sin_server.sin_port = htons(opts.port);
|
||||
err = __sock_create(read_pnet(¤t->nsproxy->net_ns), PF_INET,
|
||||
err = __sock_create(current->nsproxy->net_ns, PF_INET,
|
||||
SOCK_STREAM, IPPROTO_TCP, &csocket, 1);
|
||||
if (err) {
|
||||
pr_err("%s (%d): problem creating socket\n",
|
||||
|
@ -988,7 +988,7 @@ p9_fd_create_unix(struct p9_client *client, const char *addr, char *args)
|
|||
|
||||
sun_server.sun_family = PF_UNIX;
|
||||
strcpy(sun_server.sun_path, addr);
|
||||
err = __sock_create(read_pnet(¤t->nsproxy->net_ns), PF_UNIX,
|
||||
err = __sock_create(current->nsproxy->net_ns, PF_UNIX,
|
||||
SOCK_STREAM, 0, &csocket, 1);
|
||||
if (err < 0) {
|
||||
pr_err("%s (%d): problem creating socket\n",
|
||||
|
|
|
@ -6841,8 +6841,6 @@ void free_netdev(struct net_device *dev)
|
|||
{
|
||||
struct napi_struct *p, *n;
|
||||
|
||||
release_net(dev_net(dev));
|
||||
|
||||
netif_free_tx_queues(dev);
|
||||
#ifdef CONFIG_SYSFS
|
||||
kvfree(dev->_rx);
|
||||
|
|
|
@ -31,7 +31,7 @@ int fib_default_rule_add(struct fib_rules_ops *ops,
|
|||
r->pref = pref;
|
||||
r->table = table;
|
||||
r->flags = flags;
|
||||
r->fr_net = hold_net(ops->fro_net);
|
||||
r->fr_net = ops->fro_net;
|
||||
|
||||
r->suppress_prefixlen = -1;
|
||||
r->suppress_ifgroup = -1;
|
||||
|
@ -116,7 +116,6 @@ static int __fib_rules_register(struct fib_rules_ops *ops)
|
|||
if (ops->family == o->family)
|
||||
goto errout;
|
||||
|
||||
hold_net(net);
|
||||
list_add_tail_rcu(&ops->list, &net->rules_ops);
|
||||
err = 0;
|
||||
errout:
|
||||
|
@ -160,15 +159,6 @@ static void fib_rules_cleanup_ops(struct fib_rules_ops *ops)
|
|||
}
|
||||
}
|
||||
|
||||
static void fib_rules_put_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct fib_rules_ops *ops = container_of(head, struct fib_rules_ops, rcu);
|
||||
struct net *net = ops->fro_net;
|
||||
|
||||
release_net(net);
|
||||
kfree(ops);
|
||||
}
|
||||
|
||||
void fib_rules_unregister(struct fib_rules_ops *ops)
|
||||
{
|
||||
struct net *net = ops->fro_net;
|
||||
|
@ -178,7 +168,7 @@ void fib_rules_unregister(struct fib_rules_ops *ops)
|
|||
fib_rules_cleanup_ops(ops);
|
||||
spin_unlock(&net->rules_mod_lock);
|
||||
|
||||
call_rcu(&ops->rcu, fib_rules_put_rcu);
|
||||
kfree_rcu(ops, rcu);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fib_rules_unregister);
|
||||
|
||||
|
@ -303,7 +293,7 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh)
|
|||
err = -ENOMEM;
|
||||
goto errout;
|
||||
}
|
||||
rule->fr_net = hold_net(net);
|
||||
rule->fr_net = net;
|
||||
|
||||
if (tb[FRA_PRIORITY])
|
||||
rule->pref = nla_get_u32(tb[FRA_PRIORITY]);
|
||||
|
@ -423,7 +413,6 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh)
|
|||
return 0;
|
||||
|
||||
errout_free:
|
||||
release_net(rule->fr_net);
|
||||
kfree(rule);
|
||||
errout:
|
||||
rules_ops_put(ops);
|
||||
|
|
|
@ -591,7 +591,7 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
|
|||
if (!n)
|
||||
goto out;
|
||||
|
||||
write_pnet(&n->net, hold_net(net));
|
||||
write_pnet(&n->net, net);
|
||||
memcpy(n->key, pkey, key_len);
|
||||
n->dev = dev;
|
||||
if (dev)
|
||||
|
@ -600,7 +600,6 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
|
|||
if (tbl->pconstructor && tbl->pconstructor(n)) {
|
||||
if (dev)
|
||||
dev_put(dev);
|
||||
release_net(net);
|
||||
kfree(n);
|
||||
n = NULL;
|
||||
goto out;
|
||||
|
@ -634,7 +633,6 @@ int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
|
|||
tbl->pdestructor(n);
|
||||
if (n->dev)
|
||||
dev_put(n->dev);
|
||||
release_net(pneigh_net(n));
|
||||
kfree(n);
|
||||
return 0;
|
||||
}
|
||||
|
@ -657,7 +655,6 @@ static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
|||
tbl->pdestructor(n);
|
||||
if (n->dev)
|
||||
dev_put(n->dev);
|
||||
release_net(pneigh_net(n));
|
||||
kfree(n);
|
||||
continue;
|
||||
}
|
||||
|
@ -1428,11 +1425,10 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
|
|||
neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME));
|
||||
dev_hold(dev);
|
||||
p->dev = dev;
|
||||
write_pnet(&p->net, hold_net(net));
|
||||
write_pnet(&p->net, net);
|
||||
p->sysctl_table = NULL;
|
||||
|
||||
if (ops->ndo_neigh_setup && ops->ndo_neigh_setup(dev, p)) {
|
||||
release_net(net);
|
||||
dev_put(dev);
|
||||
kfree(p);
|
||||
return NULL;
|
||||
|
@ -1472,7 +1468,6 @@ EXPORT_SYMBOL(neigh_parms_release);
|
|||
|
||||
static void neigh_parms_destroy(struct neigh_parms *parms)
|
||||
{
|
||||
release_net(neigh_parms_net(parms));
|
||||
kfree(parms);
|
||||
}
|
||||
|
||||
|
|
|
@ -236,10 +236,6 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
|
|||
net->user_ns = user_ns;
|
||||
idr_init(&net->netns_ids);
|
||||
|
||||
#ifdef NETNS_REFCNT_DEBUG
|
||||
atomic_set(&net->use_count, 0);
|
||||
#endif
|
||||
|
||||
list_for_each_entry(ops, &pernet_list, list) {
|
||||
error = ops_init(ops, net);
|
||||
if (error < 0)
|
||||
|
@ -294,13 +290,6 @@ static struct net *net_alloc(void)
|
|||
|
||||
static void net_free(struct net *net)
|
||||
{
|
||||
#ifdef NETNS_REFCNT_DEBUG
|
||||
if (unlikely(atomic_read(&net->use_count) != 0)) {
|
||||
pr_emerg("network namespace not free! Usage: %d\n",
|
||||
atomic_read(&net->use_count));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
kfree(rcu_access_pointer(net->gen));
|
||||
kmem_cache_free(net_cachep, net);
|
||||
}
|
||||
|
|
|
@ -1455,7 +1455,6 @@ void sk_release_kernel(struct sock *sk)
|
|||
|
||||
sock_hold(sk);
|
||||
sock_release(sk->sk_socket);
|
||||
release_net(sock_net(sk));
|
||||
sock_net_set(sk, get_net(&init_net));
|
||||
sock_put(sk);
|
||||
}
|
||||
|
|
|
@ -213,7 +213,6 @@ static void free_fib_info_rcu(struct rcu_head *head)
|
|||
rt_fibinfo_free(&nexthop_nh->nh_rth_input);
|
||||
} endfor_nexthops(fi);
|
||||
|
||||
release_net(fi->fib_net);
|
||||
if (fi->fib_metrics != (u32 *) dst_default_metrics)
|
||||
kfree(fi->fib_metrics);
|
||||
kfree(fi);
|
||||
|
@ -814,7 +813,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
|
|||
} else
|
||||
fi->fib_metrics = (u32 *) dst_default_metrics;
|
||||
|
||||
fi->fib_net = hold_net(net);
|
||||
fi->fib_net = net;
|
||||
fi->fib_protocol = cfg->fc_protocol;
|
||||
fi->fib_scope = cfg->fc_scope;
|
||||
fi->fib_flags = cfg->fc_flags;
|
||||
|
|
|
@ -61,7 +61,7 @@ struct inet_bind_bucket *inet_bind_bucket_create(struct kmem_cache *cachep,
|
|||
struct inet_bind_bucket *tb = kmem_cache_alloc(cachep, GFP_ATOMIC);
|
||||
|
||||
if (tb != NULL) {
|
||||
write_pnet(&tb->ib_net, hold_net(net));
|
||||
write_pnet(&tb->ib_net, net);
|
||||
tb->port = snum;
|
||||
tb->fastreuse = 0;
|
||||
tb->fastreuseport = 0;
|
||||
|
@ -79,7 +79,6 @@ void inet_bind_bucket_destroy(struct kmem_cache *cachep, struct inet_bind_bucket
|
|||
{
|
||||
if (hlist_empty(&tb->owners)) {
|
||||
__hlist_del(&tb->node);
|
||||
release_net(ib_net(tb));
|
||||
kmem_cache_free(cachep, tb);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,7 +98,6 @@ void inet_twsk_free(struct inet_timewait_sock *tw)
|
|||
#ifdef SOCK_REFCNT_DEBUG
|
||||
pr_debug("%s timewait_sock %p released\n", tw->tw_prot->name, tw);
|
||||
#endif
|
||||
release_net(twsk_net(tw));
|
||||
kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw);
|
||||
module_put(owner);
|
||||
}
|
||||
|
@ -196,7 +195,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int stat
|
|||
tw->tw_transparent = inet->transparent;
|
||||
tw->tw_prot = sk->sk_prot_creator;
|
||||
atomic64_set(&tw->tw_cookie, atomic64_read(&sk->sk_cookie));
|
||||
twsk_net_set(tw, hold_net(sock_net(sk)));
|
||||
twsk_net_set(tw, sock_net(sk));
|
||||
/*
|
||||
* Because we use RCU lookups, we should not set tw_refcnt
|
||||
* to a non null value before everything is setup for this
|
||||
|
|
|
@ -73,9 +73,7 @@
|
|||
|
||||
struct mr_table {
|
||||
struct list_head list;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
possible_net_t net;
|
||||
u32 id;
|
||||
struct sock __rcu *mroute_sk;
|
||||
struct timer_list ipmr_expire_timer;
|
||||
|
|
|
@ -29,9 +29,7 @@
|
|||
* Policy Table
|
||||
*/
|
||||
struct ip6addrlbl_entry {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *lbl_net;
|
||||
#endif
|
||||
possible_net_t lbl_net;
|
||||
struct in6_addr prefix;
|
||||
int prefixlen;
|
||||
int ifindex;
|
||||
|
@ -129,9 +127,6 @@ static const __net_initconst struct ip6addrlbl_init_table
|
|||
/* Object management */
|
||||
static inline void ip6addrlbl_free(struct ip6addrlbl_entry *p)
|
||||
{
|
||||
#ifdef CONFIG_NET_NS
|
||||
release_net(p->lbl_net);
|
||||
#endif
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
|
@ -240,9 +235,7 @@ static struct ip6addrlbl_entry *ip6addrlbl_alloc(struct net *net,
|
|||
newp->addrtype = addrtype;
|
||||
newp->label = label;
|
||||
INIT_HLIST_NODE(&newp->list);
|
||||
#ifdef CONFIG_NET_NS
|
||||
newp->lbl_net = hold_net(net);
|
||||
#endif
|
||||
write_pnet(&newp->lbl_net, net);
|
||||
atomic_set(&newp->refcnt, 1);
|
||||
return newp;
|
||||
}
|
||||
|
|
|
@ -100,7 +100,6 @@ static void fl_free(struct ip6_flowlabel *fl)
|
|||
if (fl) {
|
||||
if (fl->share == IPV6_FL_S_PROCESS)
|
||||
put_pid(fl->owner.pid);
|
||||
release_net(fl->fl_net);
|
||||
kfree(fl->opt);
|
||||
kfree_rcu(fl, rcu);
|
||||
}
|
||||
|
@ -403,7 +402,7 @@ fl_create(struct net *net, struct sock *sk, struct in6_flowlabel_req *freq,
|
|||
}
|
||||
}
|
||||
|
||||
fl->fl_net = hold_net(net);
|
||||
fl->fl_net = net;
|
||||
fl->expires = jiffies;
|
||||
err = fl6_renew(fl, freq->flr_linger, freq->flr_expires);
|
||||
if (err)
|
||||
|
|
|
@ -56,9 +56,7 @@
|
|||
|
||||
struct mr6_table {
|
||||
struct list_head list;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
possible_net_t net;
|
||||
u32 id;
|
||||
struct sock *mroute6_sk;
|
||||
struct timer_list ipmr_expire_timer;
|
||||
|
|
|
@ -203,7 +203,6 @@ static void destroy_dp_rcu(struct rcu_head *rcu)
|
|||
|
||||
ovs_flow_tbl_destroy(&dp->table);
|
||||
free_percpu(dp->stats_percpu);
|
||||
release_net(ovs_dp_get_net(dp));
|
||||
kfree(dp->ports);
|
||||
kfree(dp);
|
||||
}
|
||||
|
@ -1501,7 +1500,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|||
if (dp == NULL)
|
||||
goto err_free_reply;
|
||||
|
||||
ovs_dp_set_net(dp, hold_net(sock_net(skb->sk)));
|
||||
ovs_dp_set_net(dp, sock_net(skb->sk));
|
||||
|
||||
/* Allocate table. */
|
||||
err = ovs_flow_tbl_init(&dp->table);
|
||||
|
@ -1575,7 +1574,6 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|||
err_destroy_table:
|
||||
ovs_flow_tbl_destroy(&dp->table);
|
||||
err_free_dp:
|
||||
release_net(ovs_dp_get_net(dp));
|
||||
kfree(dp);
|
||||
err_free_reply:
|
||||
kfree_skb(reply);
|
||||
|
|
|
@ -84,10 +84,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;
|
||||
};
|
||||
|
|
|
@ -74,9 +74,7 @@ extern struct mutex fanout_mutex;
|
|||
#define PACKET_FANOUT_MAX 256
|
||||
|
||||
struct packet_fanout {
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *net;
|
||||
#endif
|
||||
possible_net_t net;
|
||||
unsigned int num_members;
|
||||
u16 id;
|
||||
u8 type;
|
||||
|
|
Loading…
Reference in New Issue