| .. | .. |
|---|
| 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)) |
|---|