.. | .. |
---|
82 | 82 | return false; |
---|
83 | 83 | } |
---|
84 | 84 | |
---|
85 | | -void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) |
---|
| 85 | +bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) |
---|
86 | 86 | { |
---|
87 | 87 | unsigned long flags; |
---|
| 88 | + bool ret = true; |
---|
88 | 89 | |
---|
89 | 90 | spin_lock_irqsave(&queue->rx_queue.lock, flags); |
---|
90 | 91 | |
---|
.. | .. |
---|
92 | 93 | struct net_device *dev = queue->vif->dev; |
---|
93 | 94 | |
---|
94 | 95 | netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id)); |
---|
95 | | - kfree_skb(skb); |
---|
96 | | - queue->vif->dev->stats.rx_dropped++; |
---|
| 96 | + ret = false; |
---|
97 | 97 | } else { |
---|
98 | 98 | if (skb_queue_empty(&queue->rx_queue)) |
---|
99 | 99 | xenvif_update_needed_slots(queue, skb); |
---|
.. | .. |
---|
104 | 104 | } |
---|
105 | 105 | |
---|
106 | 106 | spin_unlock_irqrestore(&queue->rx_queue.lock, flags); |
---|
| 107 | + |
---|
| 108 | + return ret; |
---|
107 | 109 | } |
---|
108 | 110 | |
---|
109 | 111 | static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue) |
---|
.. | .. |
---|
282 | 284 | pkt->extra_count++; |
---|
283 | 285 | } |
---|
284 | 286 | |
---|
| 287 | + if (queue->vif->xdp_headroom) { |
---|
| 288 | + struct xen_netif_extra_info *extra; |
---|
| 289 | + |
---|
| 290 | + extra = &pkt->extras[XEN_NETIF_EXTRA_TYPE_XDP - 1]; |
---|
| 291 | + |
---|
| 292 | + memset(extra, 0, sizeof(struct xen_netif_extra_info)); |
---|
| 293 | + extra->u.xdp.headroom = queue->vif->xdp_headroom; |
---|
| 294 | + extra->type = XEN_NETIF_EXTRA_TYPE_XDP; |
---|
| 295 | + extra->flags = 0; |
---|
| 296 | + |
---|
| 297 | + pkt->extra_count++; |
---|
| 298 | + } |
---|
| 299 | + |
---|
285 | 300 | if (skb->sw_hash) { |
---|
286 | 301 | struct xen_netif_extra_info *extra; |
---|
287 | 302 | |
---|
.. | .. |
---|
380 | 395 | struct xen_netif_rx_request *req, |
---|
381 | 396 | struct xen_netif_rx_response *rsp) |
---|
382 | 397 | { |
---|
383 | | - unsigned int offset = 0; |
---|
| 398 | + unsigned int offset = queue->vif->xdp_headroom; |
---|
384 | 399 | unsigned int flags; |
---|
385 | 400 | |
---|
386 | 401 | do { |
---|
.. | .. |
---|
473 | 488 | |
---|
474 | 489 | #define RX_BATCH_SIZE 64 |
---|
475 | 490 | |
---|
476 | | -void xenvif_rx_action(struct xenvif_queue *queue) |
---|
| 491 | +static void xenvif_rx_action(struct xenvif_queue *queue) |
---|
477 | 492 | { |
---|
478 | 493 | struct sk_buff_head completed_skbs; |
---|
479 | 494 | unsigned int work_done = 0; |
---|
.. | .. |
---|
482 | 497 | queue->rx_copy.completed = &completed_skbs; |
---|
483 | 498 | |
---|
484 | 499 | while (xenvif_rx_ring_slots_available(queue) && |
---|
| 500 | + !skb_queue_empty(&queue->rx_queue) && |
---|
485 | 501 | work_done < RX_BATCH_SIZE) { |
---|
486 | 502 | xenvif_rx_skb(queue); |
---|
487 | 503 | work_done++; |
---|