diff options
| author | James Morris <jmorris@namei.org> | 2009-03-23 19:52:46 -0400 |
|---|---|---|
| committer | James Morris <jmorris@namei.org> | 2009-03-23 19:52:46 -0400 |
| commit | 703a3cd72817e99201cef84a8a7aecc60b2b3581 (patch) | |
| tree | 3e943755178ff410694722bb031f523136fbc432 /net/core/dev.c | |
| parent | df7f54c012b92ec93d56b68547351dcdf8a163d3 (diff) | |
| parent | 8e0ee43bc2c3e19db56a4adaa9a9b04ce885cd84 (diff) | |
Merge branch 'master' into next
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 78 |
1 files changed, 46 insertions, 32 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 5379b0c1190a..e3fe5c705606 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1090,7 +1090,7 @@ int dev_open(struct net_device *dev) | |||
| 1090 | /* | 1090 | /* |
| 1091 | * Enable NET_DMA | 1091 | * Enable NET_DMA |
| 1092 | */ | 1092 | */ |
| 1093 | dmaengine_get(); | 1093 | net_dmaengine_get(); |
| 1094 | 1094 | ||
| 1095 | /* | 1095 | /* |
| 1096 | * Initialize multicasting status | 1096 | * Initialize multicasting status |
| @@ -1172,7 +1172,7 @@ int dev_close(struct net_device *dev) | |||
| 1172 | /* | 1172 | /* |
| 1173 | * Shutdown NET_DMA | 1173 | * Shutdown NET_DMA |
| 1174 | */ | 1174 | */ |
| 1175 | dmaengine_put(); | 1175 | net_dmaengine_put(); |
| 1176 | 1176 | ||
| 1177 | return 0; | 1177 | return 0; |
| 1178 | } | 1178 | } |
| @@ -2267,12 +2267,6 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2267 | 2267 | ||
| 2268 | rcu_read_lock(); | 2268 | rcu_read_lock(); |
| 2269 | 2269 | ||
| 2270 | /* Don't receive packets in an exiting network namespace */ | ||
| 2271 | if (!net_alive(dev_net(skb->dev))) { | ||
| 2272 | kfree_skb(skb); | ||
| 2273 | goto out; | ||
| 2274 | } | ||
| 2275 | |||
| 2276 | #ifdef CONFIG_NET_CLS_ACT | 2270 | #ifdef CONFIG_NET_CLS_ACT |
| 2277 | if (skb->tc_verd & TC_NCLS) { | 2271 | if (skb->tc_verd & TC_NCLS) { |
| 2278 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); | 2272 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); |
| @@ -2488,6 +2482,9 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
| 2488 | 2482 | ||
| 2489 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 2483 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) |
| 2490 | { | 2484 | { |
| 2485 | if (netpoll_receive_skb(skb)) | ||
| 2486 | return NET_RX_DROP; | ||
| 2487 | |||
| 2491 | switch (__napi_gro_receive(napi, skb)) { | 2488 | switch (__napi_gro_receive(napi, skb)) { |
| 2492 | case -1: | 2489 | case -1: |
| 2493 | return netif_receive_skb(skb); | 2490 | return netif_receive_skb(skb); |
| @@ -2558,6 +2555,9 @@ int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info) | |||
| 2558 | if (!skb) | 2555 | if (!skb) |
| 2559 | goto out; | 2556 | goto out; |
| 2560 | 2557 | ||
| 2558 | if (netpoll_receive_skb(skb)) | ||
| 2559 | goto out; | ||
| 2560 | |||
| 2561 | err = NET_RX_SUCCESS; | 2561 | err = NET_RX_SUCCESS; |
| 2562 | 2562 | ||
| 2563 | switch (__napi_gro_receive(napi, skb)) { | 2563 | switch (__napi_gro_receive(napi, skb)) { |
| @@ -2588,9 +2588,9 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
| 2588 | local_irq_disable(); | 2588 | local_irq_disable(); |
| 2589 | skb = __skb_dequeue(&queue->input_pkt_queue); | 2589 | skb = __skb_dequeue(&queue->input_pkt_queue); |
| 2590 | if (!skb) { | 2590 | if (!skb) { |
| 2591 | __napi_complete(napi); | ||
| 2592 | local_irq_enable(); | 2591 | local_irq_enable(); |
| 2593 | break; | 2592 | napi_complete(napi); |
| 2593 | goto out; | ||
| 2594 | } | 2594 | } |
| 2595 | local_irq_enable(); | 2595 | local_irq_enable(); |
| 2596 | 2596 | ||
| @@ -2599,6 +2599,7 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
| 2599 | 2599 | ||
| 2600 | napi_gro_flush(napi); | 2600 | napi_gro_flush(napi); |
| 2601 | 2601 | ||
| 2602 | out: | ||
| 2602 | return work; | 2603 | return work; |
| 2603 | } | 2604 | } |
| 2604 | 2605 | ||
| @@ -2671,7 +2672,7 @@ void netif_napi_del(struct napi_struct *napi) | |||
| 2671 | struct sk_buff *skb, *next; | 2672 | struct sk_buff *skb, *next; |
| 2672 | 2673 | ||
| 2673 | list_del_init(&napi->dev_list); | 2674 | list_del_init(&napi->dev_list); |
| 2674 | kfree(napi->skb); | 2675 | kfree_skb(napi->skb); |
| 2675 | 2676 | ||
| 2676 | for (skb = napi->gro_list; skb; skb = next) { | 2677 | for (skb = napi->gro_list; skb; skb = next) { |
| 2677 | next = skb->next; | 2678 | next = skb->next; |
| @@ -4282,6 +4283,39 @@ unsigned long netdev_fix_features(unsigned long features, const char *name) | |||
| 4282 | } | 4283 | } |
| 4283 | EXPORT_SYMBOL(netdev_fix_features); | 4284 | EXPORT_SYMBOL(netdev_fix_features); |
| 4284 | 4285 | ||
| 4286 | /* Some devices need to (re-)set their netdev_ops inside | ||
| 4287 | * ->init() or similar. If that happens, we have to setup | ||
| 4288 | * the compat pointers again. | ||
| 4289 | */ | ||
| 4290 | void netdev_resync_ops(struct net_device *dev) | ||
| 4291 | { | ||
| 4292 | #ifdef CONFIG_COMPAT_NET_DEV_OPS | ||
| 4293 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 4294 | |||
| 4295 | dev->init = ops->ndo_init; | ||
| 4296 | dev->uninit = ops->ndo_uninit; | ||
| 4297 | dev->open = ops->ndo_open; | ||
| 4298 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
| 4299 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
| 4300 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
| 4301 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
| 4302 | dev->validate_addr = ops->ndo_validate_addr; | ||
| 4303 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
| 4304 | dev->set_config = ops->ndo_set_config; | ||
| 4305 | dev->change_mtu = ops->ndo_change_mtu; | ||
| 4306 | dev->neigh_setup = ops->ndo_neigh_setup; | ||
| 4307 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
| 4308 | dev->get_stats = ops->ndo_get_stats; | ||
| 4309 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
| 4310 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
| 4311 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
| 4312 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 4313 | dev->poll_controller = ops->ndo_poll_controller; | ||
| 4314 | #endif | ||
| 4315 | #endif | ||
| 4316 | } | ||
| 4317 | EXPORT_SYMBOL(netdev_resync_ops); | ||
| 4318 | |||
| 4285 | /** | 4319 | /** |
| 4286 | * register_netdevice - register a network device | 4320 | * register_netdevice - register a network device |
| 4287 | * @dev: device to register | 4321 | * @dev: device to register |
| @@ -4326,27 +4360,7 @@ int register_netdevice(struct net_device *dev) | |||
| 4326 | * This is temporary until all network devices are converted. | 4360 | * This is temporary until all network devices are converted. |
| 4327 | */ | 4361 | */ |
| 4328 | if (dev->netdev_ops) { | 4362 | if (dev->netdev_ops) { |
| 4329 | const struct net_device_ops *ops = dev->netdev_ops; | 4363 | netdev_resync_ops(dev); |
| 4330 | |||
| 4331 | dev->init = ops->ndo_init; | ||
| 4332 | dev->uninit = ops->ndo_uninit; | ||
| 4333 | dev->open = ops->ndo_open; | ||
| 4334 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
| 4335 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
| 4336 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
| 4337 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
| 4338 | dev->validate_addr = ops->ndo_validate_addr; | ||
| 4339 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
| 4340 | dev->set_config = ops->ndo_set_config; | ||
| 4341 | dev->change_mtu = ops->ndo_change_mtu; | ||
| 4342 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
| 4343 | dev->get_stats = ops->ndo_get_stats; | ||
| 4344 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
| 4345 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
| 4346 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
| 4347 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 4348 | dev->poll_controller = ops->ndo_poll_controller; | ||
| 4349 | #endif | ||
| 4350 | } else { | 4364 | } else { |
| 4351 | char drivername[64]; | 4365 | char drivername[64]; |
| 4352 | pr_info("%s (%s): not using net_device_ops yet\n", | 4366 | pr_info("%s (%s): not using net_device_ops yet\n", |
