.. | .. |
---|
72 | 72 | |
---|
73 | 73 | DEFINE_COOKIE(net_cookie); |
---|
74 | 74 | |
---|
75 | | -u64 __net_gen_cookie(struct net *net) |
---|
76 | | -{ |
---|
77 | | - while (1) { |
---|
78 | | - u64 res = atomic64_read(&net->net_cookie); |
---|
79 | | - |
---|
80 | | - if (res) |
---|
81 | | - return res; |
---|
82 | | - res = gen_cookie_next(&net_cookie); |
---|
83 | | - atomic64_cmpxchg(&net->net_cookie, 0, res); |
---|
84 | | - } |
---|
85 | | -} |
---|
86 | | - |
---|
87 | 75 | static struct net_generic *net_alloc_generic(void) |
---|
88 | 76 | { |
---|
89 | 77 | struct net_generic *ng; |
---|
.. | .. |
---|
155 | 143 | return 0; |
---|
156 | 144 | |
---|
157 | 145 | if (ops->id && ops->size) { |
---|
158 | | -cleanup: |
---|
159 | 146 | ng = rcu_dereference_protected(net->gen, |
---|
160 | 147 | lockdep_is_held(&pernet_ops_rwsem)); |
---|
161 | 148 | ng->ptr[*ops->id] = NULL; |
---|
162 | 149 | } |
---|
163 | 150 | |
---|
| 151 | +cleanup: |
---|
164 | 152 | kfree(data); |
---|
165 | 153 | |
---|
166 | 154 | out: |
---|
.. | .. |
---|
341 | 329 | refcount_set(&net->count, 1); |
---|
342 | 330 | refcount_set(&net->passive, 1); |
---|
343 | 331 | get_random_bytes(&net->hash_mix, sizeof(u32)); |
---|
| 332 | + preempt_disable(); |
---|
| 333 | + atomic64_set(&net->net_cookie, gen_cookie_next(&net_cookie)); |
---|
| 334 | + preempt_enable(); |
---|
344 | 335 | net->dev_base_seq = 1; |
---|
345 | 336 | net->user_ns = user_ns; |
---|
346 | 337 | idr_init(&net->netns_ids); |
---|
.. | .. |
---|
1127 | 1118 | panic("Could not allocate generic netns"); |
---|
1128 | 1119 | |
---|
1129 | 1120 | rcu_assign_pointer(init_net.gen, ng); |
---|
1130 | | - |
---|
1131 | | - preempt_disable(); |
---|
1132 | | - __net_gen_cookie(&init_net); |
---|
1133 | | - preempt_enable(); |
---|
1134 | 1121 | |
---|
1135 | 1122 | down_write(&pernet_ops_rwsem); |
---|
1136 | 1123 | if (setup_net(&init_net, &init_user_ns)) |
---|