@@ -70,9 +70,6 @@ static int rmnet_unregister_real_device(struct net_device *real_dev,
70
70
71
71
kfree (port );
72
72
73
- /* release reference on real_dev */
74
- dev_put (real_dev );
75
-
76
73
netdev_dbg (real_dev , "Removed from rmnet\n" );
77
74
return 0 ;
78
75
}
@@ -98,9 +95,6 @@ static int rmnet_register_real_device(struct net_device *real_dev)
98
95
return - EBUSY ;
99
96
}
100
97
101
- /* hold on to real dev for MAP data */
102
- dev_hold (real_dev );
103
-
104
98
for (entry = 0 ; entry < RMNET_MAX_LOGICAL_EP ; entry ++ )
105
99
INIT_HLIST_HEAD (& port -> muxed_ep [entry ]);
106
100
@@ -171,6 +165,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
171
165
if (err )
172
166
goto err1 ;
173
167
168
+ err = netdev_upper_dev_link (real_dev , dev , extack );
169
+ if (err < 0 )
170
+ goto err2 ;
171
+
174
172
port -> rmnet_mode = mode ;
175
173
176
174
hlist_add_head_rcu (& ep -> hlnode , & port -> muxed_ep [mux_id ]);
@@ -187,6 +185,8 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
187
185
188
186
return 0 ;
189
187
188
+ err2 :
189
+ unregister_netdevice (dev );
190
190
err1 :
191
191
rmnet_unregister_real_device (real_dev , port );
192
192
err0 :
@@ -218,33 +218,30 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head)
218
218
rmnet_vnd_dellink (mux_id , port , ep );
219
219
kfree (ep );
220
220
}
221
+ netdev_upper_dev_unlink (real_dev , dev );
221
222
rmnet_unregister_real_device (real_dev , port );
222
223
223
224
unregister_netdevice_queue (dev , head );
224
225
}
225
226
226
- static void rmnet_force_unassociate_device (struct net_device * dev )
227
+ static void rmnet_force_unassociate_device (struct net_device * real_dev )
227
228
{
228
- struct net_device * real_dev = dev ;
229
229
struct hlist_node * tmp_ep ;
230
230
struct rmnet_endpoint * ep ;
231
231
struct rmnet_port * port ;
232
232
unsigned long bkt_ep ;
233
233
LIST_HEAD (list );
234
234
235
- if (!rmnet_is_real_dev_registered (real_dev ))
236
- return ;
237
-
238
235
ASSERT_RTNL ();
239
236
240
- port = rmnet_get_port_rtnl (dev );
237
+ port = rmnet_get_port_rtnl (real_dev );
241
238
242
- rmnet_unregister_bridge (dev , port );
239
+ rmnet_unregister_bridge (real_dev , port );
243
240
244
241
hash_for_each_safe (port -> muxed_ep , bkt_ep , tmp_ep , ep , hlnode ) {
242
+ netdev_upper_dev_unlink (real_dev , ep -> egress_dev );
245
243
unregister_netdevice_queue (ep -> egress_dev , & list );
246
244
rmnet_vnd_dellink (ep -> mux_id , port , ep );
247
-
248
245
hlist_del_init_rcu (& ep -> hlnode );
249
246
kfree (ep );
250
247
}
@@ -257,15 +254,15 @@ static void rmnet_force_unassociate_device(struct net_device *dev)
257
254
static int rmnet_config_notify_cb (struct notifier_block * nb ,
258
255
unsigned long event , void * data )
259
256
{
260
- struct net_device * dev = netdev_notifier_info_to_dev (data );
257
+ struct net_device * real_dev = netdev_notifier_info_to_dev (data );
261
258
262
- if (!dev )
259
+ if (!rmnet_is_real_dev_registered ( real_dev ) )
263
260
return NOTIFY_DONE ;
264
261
265
262
switch (event ) {
266
263
case NETDEV_UNREGISTER :
267
- netdev_dbg (dev , "Kernel unregister\n" );
268
- rmnet_force_unassociate_device (dev );
264
+ netdev_dbg (real_dev , "Kernel unregister\n" );
265
+ rmnet_force_unassociate_device (real_dev );
269
266
break ;
270
267
271
268
default :
@@ -486,8 +483,8 @@ static int __init rmnet_init(void)
486
483
487
484
static void __exit rmnet_exit (void )
488
485
{
489
- unregister_netdevice_notifier (& rmnet_dev_notifier );
490
486
rtnl_link_unregister (& rmnet_link_ops );
487
+ unregister_netdevice_notifier (& rmnet_dev_notifier );
491
488
}
492
489
493
490
module_init (rmnet_init )
0 commit comments