diff options
author | Michal Marek <mmarek@suse.cz> | 2014-01-02 08:02:06 -0500 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2014-01-02 08:02:06 -0500 |
commit | 37e2c2a775fc887acd1432908478dfd532f7f00f (patch) | |
tree | e51ebc699d8e262fd47e0913be6a711cb1a7b565 /drivers/net/xen-netfront.c | |
parent | 1c8ddae09f4c102b97c9086cc70347e89468a547 (diff) | |
parent | 6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae (diff) |
Merge commit v3.13-rc1 into kbuild/misc
Diffstat (limited to 'drivers/net/xen-netfront.c')
-rw-r--r-- | drivers/net/xen-netfront.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 36808bf25677..e59acb1daa23 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -277,12 +277,13 @@ static void xennet_alloc_rx_buffers(struct net_device *dev) | |||
277 | if (!page) { | 277 | if (!page) { |
278 | kfree_skb(skb); | 278 | kfree_skb(skb); |
279 | no_skb: | 279 | no_skb: |
280 | /* Any skbuffs queued for refill? Force them out. */ | ||
281 | if (i != 0) | ||
282 | goto refill; | ||
283 | /* Could not allocate any skbuffs. Try again later. */ | 280 | /* Could not allocate any skbuffs. Try again later. */ |
284 | mod_timer(&np->rx_refill_timer, | 281 | mod_timer(&np->rx_refill_timer, |
285 | jiffies + (HZ/10)); | 282 | jiffies + (HZ/10)); |
283 | |||
284 | /* Any skbuffs queued for refill? Force them out. */ | ||
285 | if (i != 0) | ||
286 | goto refill; | ||
286 | break; | 287 | break; |
287 | } | 288 | } |
288 | 289 | ||
@@ -952,7 +953,7 @@ static int handle_incoming_queue(struct net_device *dev, | |||
952 | u64_stats_update_end(&stats->syncp); | 953 | u64_stats_update_end(&stats->syncp); |
953 | 954 | ||
954 | /* Pass it up. */ | 955 | /* Pass it up. */ |
955 | netif_receive_skb(skb); | 956 | napi_gro_receive(&np->napi, skb); |
956 | } | 957 | } |
957 | 958 | ||
958 | return packets_dropped; | 959 | return packets_dropped; |
@@ -1051,6 +1052,8 @@ err: | |||
1051 | if (work_done < budget) { | 1052 | if (work_done < budget) { |
1052 | int more_to_do = 0; | 1053 | int more_to_do = 0; |
1053 | 1054 | ||
1055 | napi_gro_flush(napi, false); | ||
1056 | |||
1054 | local_irq_save(flags); | 1057 | local_irq_save(flags); |
1055 | 1058 | ||
1056 | RING_FINAL_CHECK_FOR_RESPONSES(&np->rx, more_to_do); | 1059 | RING_FINAL_CHECK_FOR_RESPONSES(&np->rx, more_to_do); |
@@ -1338,6 +1341,12 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) | |||
1338 | if (np->stats == NULL) | 1341 | if (np->stats == NULL) |
1339 | goto exit; | 1342 | goto exit; |
1340 | 1343 | ||
1344 | for_each_possible_cpu(i) { | ||
1345 | struct netfront_stats *xen_nf_stats; | ||
1346 | xen_nf_stats = per_cpu_ptr(np->stats, i); | ||
1347 | u64_stats_init(&xen_nf_stats->syncp); | ||
1348 | } | ||
1349 | |||
1341 | /* Initialise tx_skbs as a free chain containing every entry. */ | 1350 | /* Initialise tx_skbs as a free chain containing every entry. */ |
1342 | np->tx_skb_freelist = 0; | 1351 | np->tx_skb_freelist = 0; |
1343 | for (i = 0; i < NET_TX_RING_SIZE; i++) { | 1352 | for (i = 0; i < NET_TX_RING_SIZE; i++) { |