22
22
#include <net/phonet/pn_dev.h>
23
23
24
24
struct phonet_routes {
25
- struct mutex lock ;
25
+ spinlock_t lock ;
26
26
struct net_device __rcu * table [64 ];
27
27
};
28
28
@@ -54,7 +54,7 @@ static struct phonet_device *__phonet_device_alloc(struct net_device *dev)
54
54
pnd -> netdev = dev ;
55
55
bitmap_zero (pnd -> addrs , 64 );
56
56
57
- BUG_ON (! mutex_is_locked ( & pndevs -> lock ) );
57
+ lockdep_assert_held ( & pndevs -> lock );
58
58
list_add_rcu (& pnd -> list , & pndevs -> list );
59
59
return pnd ;
60
60
}
@@ -64,7 +64,8 @@ static struct phonet_device *__phonet_get(struct net_device *dev)
64
64
struct phonet_device_list * pndevs = phonet_device_list (dev_net (dev ));
65
65
struct phonet_device * pnd ;
66
66
67
- BUG_ON (!mutex_is_locked (& pndevs -> lock ));
67
+ lockdep_assert_held (& pndevs -> lock );
68
+
68
69
list_for_each_entry (pnd , & pndevs -> list , list ) {
69
70
if (pnd -> netdev == dev )
70
71
return pnd ;
@@ -91,17 +92,22 @@ static void phonet_device_destroy(struct net_device *dev)
91
92
92
93
ASSERT_RTNL ();
93
94
94
- mutex_lock (& pndevs -> lock );
95
+ spin_lock (& pndevs -> lock );
96
+
95
97
pnd = __phonet_get (dev );
96
98
if (pnd )
97
99
list_del_rcu (& pnd -> list );
98
- mutex_unlock (& pndevs -> lock );
100
+
101
+ spin_unlock (& pndevs -> lock );
99
102
100
103
if (pnd ) {
104
+ struct net * net = dev_net (dev );
105
+ u32 ifindex = dev -> ifindex ;
101
106
u8 addr ;
102
107
103
108
for_each_set_bit (addr , pnd -> addrs , 64 )
104
- phonet_address_notify (RTM_DELADDR , dev , addr );
109
+ phonet_address_notify (net , RTM_DELADDR , ifindex , addr );
110
+
105
111
kfree (pnd );
106
112
}
107
113
}
@@ -133,7 +139,8 @@ int phonet_address_add(struct net_device *dev, u8 addr)
133
139
struct phonet_device * pnd ;
134
140
int err = 0 ;
135
141
136
- mutex_lock (& pndevs -> lock );
142
+ spin_lock (& pndevs -> lock );
143
+
137
144
/* Find or create Phonet-specific device data */
138
145
pnd = __phonet_get (dev );
139
146
if (pnd == NULL )
@@ -142,7 +149,9 @@ int phonet_address_add(struct net_device *dev, u8 addr)
142
149
err = - ENOMEM ;
143
150
else if (test_and_set_bit (addr >> 2 , pnd -> addrs ))
144
151
err = - EEXIST ;
145
- mutex_unlock (& pndevs -> lock );
152
+
153
+ spin_unlock (& pndevs -> lock );
154
+
146
155
return err ;
147
156
}
148
157
@@ -152,7 +161,8 @@ int phonet_address_del(struct net_device *dev, u8 addr)
152
161
struct phonet_device * pnd ;
153
162
int err = 0 ;
154
163
155
- mutex_lock (& pndevs -> lock );
164
+ spin_lock (& pndevs -> lock );
165
+
156
166
pnd = __phonet_get (dev );
157
167
if (!pnd || !test_and_clear_bit (addr >> 2 , pnd -> addrs )) {
158
168
err = - EADDRNOTAVAIL ;
@@ -161,7 +171,8 @@ int phonet_address_del(struct net_device *dev, u8 addr)
161
171
list_del_rcu (& pnd -> list );
162
172
else
163
173
pnd = NULL ;
164
- mutex_unlock (& pndevs -> lock );
174
+
175
+ spin_unlock (& pndevs -> lock );
165
176
166
177
if (pnd )
167
178
kfree_rcu (pnd , rcu );
@@ -244,32 +255,39 @@ static int phonet_device_autoconf(struct net_device *dev)
244
255
ret = phonet_address_add (dev , req .ifr_phonet_autoconf .device );
245
256
if (ret )
246
257
return ret ;
247
- phonet_address_notify (RTM_NEWADDR , dev ,
248
- req .ifr_phonet_autoconf .device );
258
+
259
+ phonet_address_notify (dev_net (dev ), RTM_NEWADDR , dev -> ifindex ,
260
+ req .ifr_phonet_autoconf .device );
249
261
return 0 ;
250
262
}
251
263
252
264
static void phonet_route_autodel (struct net_device * dev )
253
265
{
254
- struct phonet_net * pnn = phonet_pernet (dev_net (dev ));
255
- unsigned int i ;
266
+ struct net * net = dev_net (dev );
256
267
DECLARE_BITMAP (deleted , 64 );
268
+ u32 ifindex = dev -> ifindex ;
269
+ struct phonet_net * pnn ;
270
+ unsigned int i ;
271
+
272
+ pnn = phonet_pernet (net );
257
273
258
274
/* Remove left-over Phonet routes */
259
275
bitmap_zero (deleted , 64 );
260
- mutex_lock (& pnn -> routes .lock );
261
- for (i = 0 ; i < 64 ; i ++ )
276
+
277
+ spin_lock (& pnn -> routes .lock );
278
+ for (i = 0 ; i < 64 ; i ++ ) {
262
279
if (rcu_access_pointer (pnn -> routes .table [i ]) == dev ) {
263
280
RCU_INIT_POINTER (pnn -> routes .table [i ], NULL );
264
281
set_bit (i , deleted );
265
282
}
266
- mutex_unlock (& pnn -> routes .lock );
283
+ }
284
+ spin_unlock (& pnn -> routes .lock );
267
285
268
286
if (bitmap_empty (deleted , 64 ))
269
287
return ; /* short-circuit RCU */
270
288
synchronize_rcu ();
271
289
for_each_set_bit (i , deleted , 64 ) {
272
- rtm_phonet_notify (RTM_DELROUTE , dev , i );
290
+ rtm_phonet_notify (net , RTM_DELROUTE , ifindex , i );
273
291
dev_put (dev );
274
292
}
275
293
}
@@ -309,8 +327,8 @@ static int __net_init phonet_init_net(struct net *net)
309
327
return - ENOMEM ;
310
328
311
329
INIT_LIST_HEAD (& pnn -> pndevs .list );
312
- mutex_init (& pnn -> pndevs .lock );
313
- mutex_init (& pnn -> routes .lock );
330
+ spin_lock_init (& pnn -> pndevs .lock );
331
+ spin_lock_init (& pnn -> routes .lock );
314
332
return 0 ;
315
333
}
316
334
@@ -360,13 +378,15 @@ int phonet_route_add(struct net_device *dev, u8 daddr)
360
378
int err = - EEXIST ;
361
379
362
380
daddr = daddr >> 2 ;
363
- mutex_lock (& routes -> lock );
381
+
382
+ spin_lock (& routes -> lock );
364
383
if (routes -> table [daddr ] == NULL ) {
365
384
rcu_assign_pointer (routes -> table [daddr ], dev );
366
385
dev_hold (dev );
367
386
err = 0 ;
368
387
}
369
- mutex_unlock (& routes -> lock );
388
+ spin_unlock (& routes -> lock );
389
+
370
390
return err ;
371
391
}
372
392
@@ -376,12 +396,13 @@ int phonet_route_del(struct net_device *dev, u8 daddr)
376
396
struct phonet_routes * routes = & pnn -> routes ;
377
397
378
398
daddr = daddr >> 2 ;
379
- mutex_lock (& routes -> lock );
399
+
400
+ spin_lock (& routes -> lock );
380
401
if (rcu_access_pointer (routes -> table [daddr ]) == dev )
381
402
RCU_INIT_POINTER (routes -> table [daddr ], NULL );
382
403
else
383
404
dev = NULL ;
384
- mutex_unlock (& routes -> lock );
405
+ spin_unlock (& routes -> lock );
385
406
386
407
if (!dev )
387
408
return - ENOENT ;
0 commit comments