diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/phonet/pn_dev.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 21 |
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 | ||
165 | static 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 | |||
173 | int phonet_address_del(struct net_device *dev, u8 addr) | 165 | int 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 | ||
391 | int phonet_route_add(struct net_device *dev, u8 daddr) | 384 | int 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 | ||
428 | struct net_device *phonet_route_get(struct net *net, u8 daddr) | 421 | struct 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 | ||