diff options
author | David S. Miller <davem@davemloft.net> | 2009-09-25 14:09:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-25 14:09:08 -0400 |
commit | a91eba5b9db4c09f53c8f23327915c7c75d3235f (patch) | |
tree | 12e9336f873772b1c0880e7110234852589370bf /drivers/net | |
parent | b8273570f802a7658827dcb077b0b517ba75a289 (diff) | |
parent | 0aea51c37fc5868cd723f670af9056c2ef694fee (diff) |
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-davem
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/virtio_net.c | 229 |
1 files changed, 88 insertions, 141 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5c498d2b043f..d445845f2779 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* A simple network driver using virtio. | 1 | /* A network driver using virtio. |
2 | * | 2 | * |
3 | * Copyright 2007 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation | 3 | * Copyright 2007 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation |
4 | * | 4 | * |
@@ -48,19 +48,9 @@ struct virtnet_info | |||
48 | struct napi_struct napi; | 48 | struct napi_struct napi; |
49 | unsigned int status; | 49 | unsigned int status; |
50 | 50 | ||
51 | /* The skb we couldn't send because buffers were full. */ | ||
52 | struct sk_buff *last_xmit_skb; | ||
53 | |||
54 | /* If we need to free in a timer, this is it. */ | ||
55 | struct timer_list xmit_free_timer; | ||
56 | |||
57 | /* Number of input buffers, and max we've ever had. */ | 51 | /* Number of input buffers, and max we've ever had. */ |
58 | unsigned int num, max; | 52 | unsigned int num, max; |
59 | 53 | ||
60 | /* For cleaning up after transmission. */ | ||
61 | struct tasklet_struct tasklet; | ||
62 | bool free_in_tasklet; | ||
63 | |||
64 | /* I like... big packets and I cannot lie! */ | 54 | /* I like... big packets and I cannot lie! */ |
65 | bool big_packets; | 55 | bool big_packets; |
66 | 56 | ||
@@ -78,9 +68,17 @@ struct virtnet_info | |||
78 | struct page *pages; | 68 | struct page *pages; |
79 | }; | 69 | }; |
80 | 70 | ||
81 | static inline void *skb_vnet_hdr(struct sk_buff *skb) | 71 | struct skb_vnet_hdr { |
72 | union { | ||
73 | struct virtio_net_hdr hdr; | ||
74 | struct virtio_net_hdr_mrg_rxbuf mhdr; | ||
75 | }; | ||
76 | unsigned int num_sg; | ||
77 | }; | ||
78 | |||
79 | static inline struct skb_vnet_hdr *skb_vnet_hdr(struct sk_buff *skb) | ||
82 | { | 80 | { |
83 | return (struct virtio_net_hdr *)skb->cb; | 81 | return (struct skb_vnet_hdr *)skb->cb; |
84 | } | 82 | } |
85 | 83 | ||
86 | static void give_a_page(struct virtnet_info *vi, struct page *page) | 84 | static void give_a_page(struct virtnet_info *vi, struct page *page) |
@@ -119,17 +117,13 @@ static void skb_xmit_done(struct virtqueue *svq) | |||
119 | 117 | ||
120 | /* We were probably waiting for more output buffers. */ | 118 | /* We were probably waiting for more output buffers. */ |
121 | netif_wake_queue(vi->dev); | 119 | netif_wake_queue(vi->dev); |
122 | |||
123 | /* Make sure we re-xmit last_xmit_skb: if there are no more packets | ||
124 | * queued, start_xmit won't be called. */ | ||
125 | tasklet_schedule(&vi->tasklet); | ||
126 | } | 120 | } |
127 | 121 | ||
128 | static void receive_skb(struct net_device *dev, struct sk_buff *skb, | 122 | static void receive_skb(struct net_device *dev, struct sk_buff *skb, |
129 | unsigned len) | 123 | unsigned len) |
130 | { | 124 | { |
131 | struct virtnet_info *vi = netdev_priv(dev); | 125 | struct virtnet_info *vi = netdev_priv(dev); |
132 | struct virtio_net_hdr *hdr = skb_vnet_hdr(skb); | 126 | struct skb_vnet_hdr *hdr = skb_vnet_hdr(skb); |
133 | int err; | 127 | int err; |
134 | int i; | 128 | int i; |
135 | 129 | ||
@@ -140,7 +134,6 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
140 | } | 134 | } |
141 | 135 | ||
142 | if (vi->mergeable_rx_bufs) { | 136 | if (vi->mergeable_rx_bufs) { |
143 | struct virtio_net_hdr_mrg_rxbuf *mhdr = skb_vnet_hdr(skb); | ||
144 | unsigned int copy; | 137 | unsigned int copy; |
145 | char *p = page_address(skb_shinfo(skb)->frags[0].page); | 138 | char *p = page_address(skb_shinfo(skb)->frags[0].page); |
146 | 139 | ||
@@ -148,8 +141,8 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
148 | len = PAGE_SIZE; | 141 | len = PAGE_SIZE; |
149 | len -= sizeof(struct virtio_net_hdr_mrg_rxbuf); | 142 | len -= sizeof(struct virtio_net_hdr_mrg_rxbuf); |
150 | 143 | ||
151 | memcpy(hdr, p, sizeof(*mhdr)); | 144 | memcpy(&hdr->mhdr, p, sizeof(hdr->mhdr)); |
152 | p += sizeof(*mhdr); | 145 | p += sizeof(hdr->mhdr); |
153 | 146 | ||
154 | copy = len; | 147 | copy = len; |
155 | if (copy > skb_tailroom(skb)) | 148 | if (copy > skb_tailroom(skb)) |
@@ -164,13 +157,13 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
164 | skb_shinfo(skb)->nr_frags--; | 157 | skb_shinfo(skb)->nr_frags--; |
165 | } else { | 158 | } else { |
166 | skb_shinfo(skb)->frags[0].page_offset += | 159 | skb_shinfo(skb)->frags[0].page_offset += |
167 | sizeof(*mhdr) + copy; | 160 | sizeof(hdr->mhdr) + copy; |
168 | skb_shinfo(skb)->frags[0].size = len; | 161 | skb_shinfo(skb)->frags[0].size = len; |
169 | skb->data_len += len; | 162 | skb->data_len += len; |
170 | skb->len += len; | 163 | skb->len += len; |
171 | } | 164 | } |
172 | 165 | ||
173 | while (--mhdr->num_buffers) { | 166 | while (--hdr->mhdr.num_buffers) { |
174 | struct sk_buff *nskb; | 167 | struct sk_buff *nskb; |
175 | 168 | ||
176 | i = skb_shinfo(skb)->nr_frags; | 169 | i = skb_shinfo(skb)->nr_frags; |
@@ -184,7 +177,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
184 | nskb = vi->rvq->vq_ops->get_buf(vi->rvq, &len); | 177 | nskb = vi->rvq->vq_ops->get_buf(vi->rvq, &len); |
185 | if (!nskb) { | 178 | if (!nskb) { |
186 | pr_debug("%s: rx error: %d buffers missing\n", | 179 | pr_debug("%s: rx error: %d buffers missing\n", |
187 | dev->name, mhdr->num_buffers); | 180 | dev->name, hdr->mhdr.num_buffers); |
188 | dev->stats.rx_length_errors++; | 181 | dev->stats.rx_length_errors++; |
189 | goto drop; | 182 | goto drop; |
190 | } | 183 | } |
@@ -205,7 +198,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
205 | skb->len += len; | 198 | skb->len += len; |
206 | } | 199 | } |
207 | } else { | 200 | } else { |
208 | len -= sizeof(struct virtio_net_hdr); | 201 | len -= sizeof(hdr->hdr); |
209 | 202 | ||
210 | if (len <= MAX_PACKET_LEN) | 203 | if (len <= MAX_PACKET_LEN) |
211 | trim_pages(vi, skb); | 204 | trim_pages(vi, skb); |
@@ -223,9 +216,11 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
223 | dev->stats.rx_bytes += skb->len; | 216 | dev->stats.rx_bytes += skb->len; |
224 | dev->stats.rx_packets++; | 217 | dev->stats.rx_packets++; |
225 | 218 | ||
226 | if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { | 219 | if (hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { |
227 | pr_debug("Needs csum!\n"); | 220 | pr_debug("Needs csum!\n"); |
228 | if (!skb_partial_csum_set(skb,hdr->csum_start,hdr->csum_offset)) | 221 | if (!skb_partial_csum_set(skb, |
222 | hdr->hdr.csum_start, | ||
223 | hdr->hdr.csum_offset)) | ||
229 | goto frame_err; | 224 | goto frame_err; |
230 | } | 225 | } |
231 | 226 | ||
@@ -233,9 +228,9 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
233 | pr_debug("Receiving skb proto 0x%04x len %i type %i\n", | 228 | pr_debug("Receiving skb proto 0x%04x len %i type %i\n", |
234 | ntohs(skb->protocol), skb->len, skb->pkt_type); | 229 | ntohs(skb->protocol), skb->len, skb->pkt_type); |
235 | 230 | ||
236 | if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { | 231 | if (hdr->hdr.gso_type != VIRTIO_NET_HDR_GSO_NONE) { |
237 | pr_debug("GSO!\n"); | 232 | pr_debug("GSO!\n"); |
238 | switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | 233 | switch (hdr->hdr.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { |
239 | case VIRTIO_NET_HDR_GSO_TCPV4: | 234 | case VIRTIO_NET_HDR_GSO_TCPV4: |
240 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 235 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; |
241 | break; | 236 | break; |
@@ -248,14 +243,14 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
248 | default: | 243 | default: |
249 | if (net_ratelimit()) | 244 | if (net_ratelimit()) |
250 | printk(KERN_WARNING "%s: bad gso type %u.\n", | 245 | printk(KERN_WARNING "%s: bad gso type %u.\n", |
251 | dev->name, hdr->gso_type); | 246 | dev->name, hdr->hdr.gso_type); |
252 | goto frame_err; | 247 | goto frame_err; |
253 | } | 248 | } |
254 | 249 | ||
255 | if (hdr->gso_type & VIRTIO_NET_HDR_GSO_ECN) | 250 | if (hdr->hdr.gso_type & VIRTIO_NET_HDR_GSO_ECN) |
256 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; | 251 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; |
257 | 252 | ||
258 | skb_shinfo(skb)->gso_size = hdr->gso_size; | 253 | skb_shinfo(skb)->gso_size = hdr->hdr.gso_size; |
259 | if (skb_shinfo(skb)->gso_size == 0) { | 254 | if (skb_shinfo(skb)->gso_size == 0) { |
260 | if (net_ratelimit()) | 255 | if (net_ratelimit()) |
261 | printk(KERN_WARNING "%s: zero gso size.\n", | 256 | printk(KERN_WARNING "%s: zero gso size.\n", |
@@ -285,8 +280,8 @@ static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp) | |||
285 | bool oom = false; | 280 | bool oom = false; |
286 | 281 | ||
287 | sg_init_table(sg, 2+MAX_SKB_FRAGS); | 282 | sg_init_table(sg, 2+MAX_SKB_FRAGS); |
288 | for (;;) { | 283 | do { |
289 | struct virtio_net_hdr *hdr; | 284 | struct skb_vnet_hdr *hdr; |
290 | 285 | ||
291 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN); | 286 | skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN); |
292 | if (unlikely(!skb)) { | 287 | if (unlikely(!skb)) { |
@@ -298,7 +293,7 @@ static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp) | |||
298 | skb_put(skb, MAX_PACKET_LEN); | 293 | skb_put(skb, MAX_PACKET_LEN); |
299 | 294 | ||
300 | hdr = skb_vnet_hdr(skb); | 295 | hdr = skb_vnet_hdr(skb); |
301 | sg_set_buf(sg, hdr, sizeof(*hdr)); | 296 | sg_set_buf(sg, &hdr->hdr, sizeof(hdr->hdr)); |
302 | 297 | ||
303 | if (vi->big_packets) { | 298 | if (vi->big_packets) { |
304 | for (i = 0; i < MAX_SKB_FRAGS; i++) { | 299 | for (i = 0; i < MAX_SKB_FRAGS; i++) { |
@@ -328,7 +323,7 @@ static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp) | |||
328 | break; | 323 | break; |
329 | } | 324 | } |
330 | vi->num++; | 325 | vi->num++; |
331 | } | 326 | } while (err >= num); |
332 | if (unlikely(vi->num > vi->max)) | 327 | if (unlikely(vi->num > vi->max)) |
333 | vi->max = vi->num; | 328 | vi->max = vi->num; |
334 | vi->rvq->vq_ops->kick(vi->rvq); | 329 | vi->rvq->vq_ops->kick(vi->rvq); |
@@ -346,7 +341,7 @@ static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp) | |||
346 | if (!vi->mergeable_rx_bufs) | 341 | if (!vi->mergeable_rx_bufs) |
347 | return try_fill_recv_maxbufs(vi, gfp); | 342 | return try_fill_recv_maxbufs(vi, gfp); |
348 | 343 | ||
349 | for (;;) { | 344 | do { |
350 | skb_frag_t *f; | 345 | skb_frag_t *f; |
351 | 346 | ||
352 | skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN); | 347 | skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN); |
@@ -380,7 +375,7 @@ static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp) | |||
380 | break; | 375 | break; |
381 | } | 376 | } |
382 | vi->num++; | 377 | vi->num++; |
383 | } | 378 | } while (err > 0); |
384 | if (unlikely(vi->num > vi->max)) | 379 | if (unlikely(vi->num > vi->max)) |
385 | vi->max = vi->num; | 380 | vi->max = vi->num; |
386 | vi->rvq->vq_ops->kick(vi->rvq); | 381 | vi->rvq->vq_ops->kick(vi->rvq); |
@@ -448,42 +443,26 @@ again: | |||
448 | return received; | 443 | return received; |
449 | } | 444 | } |
450 | 445 | ||
451 | static void free_old_xmit_skbs(struct virtnet_info *vi) | 446 | static unsigned int free_old_xmit_skbs(struct virtnet_info *vi) |
452 | { | 447 | { |
453 | struct sk_buff *skb; | 448 | struct sk_buff *skb; |
454 | unsigned int len; | 449 | unsigned int len, tot_sgs = 0; |
455 | 450 | ||
456 | while ((skb = vi->svq->vq_ops->get_buf(vi->svq, &len)) != NULL) { | 451 | while ((skb = vi->svq->vq_ops->get_buf(vi->svq, &len)) != NULL) { |
457 | pr_debug("Sent skb %p\n", skb); | 452 | pr_debug("Sent skb %p\n", skb); |
458 | __skb_unlink(skb, &vi->send); | 453 | __skb_unlink(skb, &vi->send); |
459 | vi->dev->stats.tx_bytes += skb->len; | 454 | vi->dev->stats.tx_bytes += skb->len; |
460 | vi->dev->stats.tx_packets++; | 455 | vi->dev->stats.tx_packets++; |
456 | tot_sgs += skb_vnet_hdr(skb)->num_sg; | ||
461 | kfree_skb(skb); | 457 | kfree_skb(skb); |
462 | } | 458 | } |
463 | } | 459 | return tot_sgs; |
464 | |||
465 | /* If the virtio transport doesn't always notify us when all in-flight packets | ||
466 | * are consumed, we fall back to using this function on a timer to free them. */ | ||
467 | static void xmit_free(unsigned long data) | ||
468 | { | ||
469 | struct virtnet_info *vi = (void *)data; | ||
470 | |||
471 | netif_tx_lock(vi->dev); | ||
472 | |||
473 | free_old_xmit_skbs(vi); | ||
474 | |||
475 | if (!skb_queue_empty(&vi->send)) | ||
476 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); | ||
477 | |||
478 | netif_tx_unlock(vi->dev); | ||
479 | } | 460 | } |
480 | 461 | ||
481 | static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | 462 | static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) |
482 | { | 463 | { |
483 | int num, err; | ||
484 | struct scatterlist sg[2+MAX_SKB_FRAGS]; | 464 | struct scatterlist sg[2+MAX_SKB_FRAGS]; |
485 | struct virtio_net_hdr_mrg_rxbuf *mhdr = skb_vnet_hdr(skb); | 465 | struct skb_vnet_hdr *hdr = skb_vnet_hdr(skb); |
486 | struct virtio_net_hdr *hdr = skb_vnet_hdr(skb); | ||
487 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; | 466 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; |
488 | 467 | ||
489 | sg_init_table(sg, 2+MAX_SKB_FRAGS); | 468 | sg_init_table(sg, 2+MAX_SKB_FRAGS); |
@@ -491,108 +470,89 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | |||
491 | pr_debug("%s: xmit %p %pM\n", vi->dev->name, skb, dest); | 470 | pr_debug("%s: xmit %p %pM\n", vi->dev->name, skb, dest); |
492 | 471 | ||
493 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 472 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
494 | hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; | 473 | hdr->hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
495 | hdr->csum_start = skb->csum_start - skb_headroom(skb); | 474 | hdr->hdr.csum_start = skb->csum_start - skb_headroom(skb); |
496 | hdr->csum_offset = skb->csum_offset; | 475 | hdr->hdr.csum_offset = skb->csum_offset; |
497 | } else { | 476 | } else { |
498 | hdr->flags = 0; | 477 | hdr->hdr.flags = 0; |
499 | hdr->csum_offset = hdr->csum_start = 0; | 478 | hdr->hdr.csum_offset = hdr->hdr.csum_start = 0; |
500 | } | 479 | } |
501 | 480 | ||
502 | if (skb_is_gso(skb)) { | 481 | if (skb_is_gso(skb)) { |
503 | hdr->hdr_len = skb_headlen(skb); | 482 | hdr->hdr.hdr_len = skb_headlen(skb); |
504 | hdr->gso_size = skb_shinfo(skb)->gso_size; | 483 | hdr->hdr.gso_size = skb_shinfo(skb)->gso_size; |
505 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) | 484 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) |
506 | hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 485 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
507 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 486 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
508 | hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 487 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
509 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | 488 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) |
510 | hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP; | 489 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP; |
511 | else | 490 | else |
512 | BUG(); | 491 | BUG(); |
513 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) | 492 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) |
514 | hdr->gso_type |= VIRTIO_NET_HDR_GSO_ECN; | 493 | hdr->hdr.gso_type |= VIRTIO_NET_HDR_GSO_ECN; |
515 | } else { | 494 | } else { |
516 | hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE; | 495 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE; |
517 | hdr->gso_size = hdr->hdr_len = 0; | 496 | hdr->hdr.gso_size = hdr->hdr.hdr_len = 0; |
518 | } | 497 | } |
519 | 498 | ||
520 | mhdr->num_buffers = 0; | 499 | hdr->mhdr.num_buffers = 0; |
521 | 500 | ||
522 | /* Encode metadata header at front. */ | 501 | /* Encode metadata header at front. */ |
523 | if (vi->mergeable_rx_bufs) | 502 | if (vi->mergeable_rx_bufs) |
524 | sg_set_buf(sg, mhdr, sizeof(*mhdr)); | 503 | sg_set_buf(sg, &hdr->mhdr, sizeof(hdr->mhdr)); |
525 | else | 504 | else |
526 | sg_set_buf(sg, hdr, sizeof(*hdr)); | 505 | sg_set_buf(sg, &hdr->hdr, sizeof(hdr->hdr)); |
527 | 506 | ||
528 | num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; | 507 | hdr->num_sg = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; |
529 | 508 | return vi->svq->vq_ops->add_buf(vi->svq, sg, hdr->num_sg, 0, skb); | |
530 | err = vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); | ||
531 | if (err >= 0 && !vi->free_in_tasklet) | ||
532 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); | ||
533 | |||
534 | return err; | ||
535 | } | ||
536 | |||
537 | static void xmit_tasklet(unsigned long data) | ||
538 | { | ||
539 | struct virtnet_info *vi = (void *)data; | ||
540 | |||
541 | netif_tx_lock_bh(vi->dev); | ||
542 | if (vi->last_xmit_skb && xmit_skb(vi, vi->last_xmit_skb) >= 0) { | ||
543 | vi->svq->vq_ops->kick(vi->svq); | ||
544 | vi->last_xmit_skb = NULL; | ||
545 | } | ||
546 | if (vi->free_in_tasklet) | ||
547 | free_old_xmit_skbs(vi); | ||
548 | netif_tx_unlock_bh(vi->dev); | ||
549 | } | 509 | } |
550 | 510 | ||
551 | static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) | 511 | static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) |
552 | { | 512 | { |
553 | struct virtnet_info *vi = netdev_priv(dev); | 513 | struct virtnet_info *vi = netdev_priv(dev); |
514 | int capacity; | ||
554 | 515 | ||
555 | again: | 516 | again: |
556 | /* Free up any pending old buffers before queueing new ones. */ | 517 | /* Free up any pending old buffers before queueing new ones. */ |
557 | free_old_xmit_skbs(vi); | 518 | free_old_xmit_skbs(vi); |
558 | 519 | ||
559 | /* If we has a buffer left over from last time, send it now. */ | ||
560 | if (unlikely(vi->last_xmit_skb) && | ||
561 | xmit_skb(vi, vi->last_xmit_skb) < 0) | ||
562 | goto stop_queue; | ||
563 | |||
564 | vi->last_xmit_skb = NULL; | ||
565 | |||
566 | /* Put new one in send queue and do transmit */ | 520 | /* Put new one in send queue and do transmit */ |
567 | if (likely(skb)) { | 521 | __skb_queue_head(&vi->send, skb); |
568 | __skb_queue_head(&vi->send, skb); | 522 | capacity = xmit_skb(vi, skb); |
569 | if (xmit_skb(vi, skb) < 0) { | 523 | |
570 | vi->last_xmit_skb = skb; | 524 | /* This can happen with OOM and indirect buffers. */ |
571 | skb = NULL; | 525 | if (unlikely(capacity < 0)) { |
572 | goto stop_queue; | 526 | netif_stop_queue(dev); |
527 | dev_warn(&dev->dev, "Unexpected full queue\n"); | ||
528 | if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) { | ||
529 | vi->svq->vq_ops->disable_cb(vi->svq); | ||
530 | netif_start_queue(dev); | ||
531 | goto again; | ||
573 | } | 532 | } |
533 | return NETDEV_TX_BUSY; | ||
574 | } | 534 | } |
575 | done: | ||
576 | vi->svq->vq_ops->kick(vi->svq); | ||
577 | return NETDEV_TX_OK; | ||
578 | 535 | ||
579 | stop_queue: | 536 | vi->svq->vq_ops->kick(vi->svq); |
580 | pr_debug("%s: virtio not prepared to send\n", dev->name); | 537 | /* Don't wait up for transmitted skbs to be freed. */ |
581 | netif_stop_queue(dev); | 538 | skb_orphan(skb); |
582 | 539 | nf_reset(skb); | |
583 | /* Activate callback for using skbs: if this returns false it | 540 | |
584 | * means some were used in the meantime. */ | 541 | /* Apparently nice girls don't return TX_BUSY; stop the queue |
585 | if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) { | 542 | * before it gets out of hand. Naturally, this wastes entries. */ |
586 | vi->svq->vq_ops->disable_cb(vi->svq); | 543 | if (capacity < 2+MAX_SKB_FRAGS) { |
587 | netif_start_queue(dev); | 544 | netif_stop_queue(dev); |
588 | goto again; | 545 | if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) { |
589 | } | 546 | /* More just got used, free them then recheck. */ |
590 | if (skb) { | 547 | capacity += free_old_xmit_skbs(vi); |
591 | /* Drop this skb: we only queue one. */ | 548 | if (capacity >= 2+MAX_SKB_FRAGS) { |
592 | vi->dev->stats.tx_dropped++; | 549 | netif_start_queue(dev); |
593 | kfree_skb(skb); | 550 | vi->svq->vq_ops->disable_cb(vi->svq); |
551 | } | ||
552 | } | ||
594 | } | 553 | } |
595 | goto done; | 554 | |
555 | return NETDEV_TX_OK; | ||
596 | } | 556 | } |
597 | 557 | ||
598 | static int virtnet_set_mac_address(struct net_device *dev, void *p) | 558 | static int virtnet_set_mac_address(struct net_device *dev, void *p) |
@@ -925,10 +885,6 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
925 | vi->pages = NULL; | 885 | vi->pages = NULL; |
926 | INIT_DELAYED_WORK(&vi->refill, refill_work); | 886 | INIT_DELAYED_WORK(&vi->refill, refill_work); |
927 | 887 | ||
928 | /* If they give us a callback when all buffers are done, we don't need | ||
929 | * the timer. */ | ||
930 | vi->free_in_tasklet = virtio_has_feature(vdev,VIRTIO_F_NOTIFY_ON_EMPTY); | ||
931 | |||
932 | /* If we can receive ANY GSO packets, we must allocate large ones. */ | 888 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
933 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) | 889 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) |
934 | || virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) | 890 | || virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) |
@@ -960,11 +916,6 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
960 | skb_queue_head_init(&vi->recv); | 916 | skb_queue_head_init(&vi->recv); |
961 | skb_queue_head_init(&vi->send); | 917 | skb_queue_head_init(&vi->send); |
962 | 918 | ||
963 | tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi); | ||
964 | |||
965 | if (!vi->free_in_tasklet) | ||
966 | setup_timer(&vi->xmit_free_timer, xmit_free, (unsigned long)vi); | ||
967 | |||
968 | err = register_netdev(dev); | 919 | err = register_netdev(dev); |
969 | if (err) { | 920 | if (err) { |
970 | pr_debug("virtio_net: registering device failed\n"); | 921 | pr_debug("virtio_net: registering device failed\n"); |
@@ -1005,9 +956,6 @@ static void virtnet_remove(struct virtio_device *vdev) | |||
1005 | /* Stop all the virtqueues. */ | 956 | /* Stop all the virtqueues. */ |
1006 | vdev->config->reset(vdev); | 957 | vdev->config->reset(vdev); |
1007 | 958 | ||
1008 | if (!vi->free_in_tasklet) | ||
1009 | del_timer_sync(&vi->xmit_free_timer); | ||
1010 | |||
1011 | /* Free our skbs in send and recv queues, if any. */ | 959 | /* Free our skbs in send and recv queues, if any. */ |
1012 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { | 960 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { |
1013 | kfree_skb(skb); | 961 | kfree_skb(skb); |
@@ -1041,7 +989,6 @@ static unsigned int features[] = { | |||
1041 | VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, | 989 | VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, |
1042 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, | 990 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, |
1043 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | 991 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
1044 | VIRTIO_F_NOTIFY_ON_EMPTY, | ||
1045 | }; | 992 | }; |
1046 | 993 | ||
1047 | static struct virtio_driver virtio_net = { | 994 | static struct virtio_driver virtio_net = { |