diff options
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", |