aboutsummaryrefslogtreecommitdiffstats
path: root/net/phonet/pn_dev.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/phonet/pn_dev.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'net/phonet/pn_dev.c')
-rw-r--r--net/phonet/pn_dev.c21
1 files changed, 5 insertions, 16 deletions
diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c
index b18e48fae975..d2df8f33160b 100644
--- a/net/phonet/pn_dev.c
+++ b/net/phonet/pn_dev.c
@@ -162,14 +162,6 @@ int phonet_address_add(struct net_device *dev, u8 addr)
162 return err; 162 return err;
163} 163}
164 164
165static void phonet_device_rcu_free(struct rcu_head *head)
166{
167 struct phonet_device *pnd;
168
169 pnd = container_of(head, struct phonet_device, rcu);
170 kfree(pnd);
171}
172
173int phonet_address_del(struct net_device *dev, u8 addr) 165int phonet_address_del(struct net_device *dev, u8 addr)
174{ 166{
175 struct phonet_device_list *pndevs = phonet_device_list(dev_net(dev)); 167 struct phonet_device_list *pndevs = phonet_device_list(dev_net(dev));
@@ -188,7 +180,7 @@ int phonet_address_del(struct net_device *dev, u8 addr)
188 mutex_unlock(&pndevs->lock); 180 mutex_unlock(&pndevs->lock);
189 181
190 if (pnd) 182 if (pnd)
191 call_rcu(&pnd->rcu, phonet_device_rcu_free); 183 kfree_rcu(pnd, rcu);
192 184
193 return err; 185 return err;
194} 186}
@@ -292,8 +284,7 @@ static void phonet_route_autodel(struct net_device *dev)
292 if (bitmap_empty(deleted, 64)) 284 if (bitmap_empty(deleted, 64))
293 return; /* short-circuit RCU */ 285 return; /* short-circuit RCU */
294 synchronize_rcu(); 286 synchronize_rcu();
295 for (i = find_first_bit(deleted, 64); i < 64; 287 for_each_set_bit(i, deleted, 64) {
296 i = find_next_bit(deleted, 64, i + 1)) {
297 rtm_phonet_notify(RTM_DELROUTE, dev, i); 288 rtm_phonet_notify(RTM_DELROUTE, dev, i);
298 dev_put(dev); 289 dev_put(dev);
299 } 290 }
@@ -374,6 +365,7 @@ int __init phonet_device_init(void)
374 if (err) 365 if (err)
375 return err; 366 return err;
376 367
368 proc_net_fops_create(&init_net, "pnresource", 0, &pn_res_seq_fops);
377 register_netdevice_notifier(&phonet_device_notifier); 369 register_netdevice_notifier(&phonet_device_notifier);
378 err = phonet_netlink_register(); 370 err = phonet_netlink_register();
379 if (err) 371 if (err)
@@ -386,6 +378,7 @@ void phonet_device_exit(void)
386 rtnl_unregister_all(PF_PHONET); 378 rtnl_unregister_all(PF_PHONET);
387 unregister_netdevice_notifier(&phonet_device_notifier); 379 unregister_netdevice_notifier(&phonet_device_notifier);
388 unregister_pernet_device(&phonet_net_ops); 380 unregister_pernet_device(&phonet_net_ops);
381 proc_net_remove(&init_net, "pnresource");
389} 382}
390 383
391int phonet_route_add(struct net_device *dev, u8 daddr) 384int phonet_route_add(struct net_device *dev, u8 daddr)
@@ -425,18 +418,14 @@ int phonet_route_del(struct net_device *dev, u8 daddr)
425 return 0; 418 return 0;
426} 419}
427 420
428struct net_device *phonet_route_get(struct net *net, u8 daddr) 421struct net_device *phonet_route_get_rcu(struct net *net, u8 daddr)
429{ 422{
430 struct phonet_net *pnn = phonet_pernet(net); 423 struct phonet_net *pnn = phonet_pernet(net);
431 struct phonet_routes *routes = &pnn->routes; 424 struct phonet_routes *routes = &pnn->routes;
432 struct net_device *dev; 425 struct net_device *dev;
433 426
434 ASSERT_RTNL(); /* no need to hold the device */
435
436 daddr >>= 2; 427 daddr >>= 2;
437 rcu_read_lock();
438 dev = rcu_dereference(routes->table[daddr]); 428 dev = rcu_dereference(routes->table[daddr]);
439 rcu_read_unlock();
440 return dev; 429 return dev;
441} 430}
442 431