hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/net/xen-netback/rx.c
....@@ -82,9 +82,10 @@
8282 return false;
8383 }
8484
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)
8686 {
8787 unsigned long flags;
88
+ bool ret = true;
8889
8990 spin_lock_irqsave(&queue->rx_queue.lock, flags);
9091
....@@ -92,8 +93,7 @@
9293 struct net_device *dev = queue->vif->dev;
9394
9495 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;
9797 } else {
9898 if (skb_queue_empty(&queue->rx_queue))
9999 xenvif_update_needed_slots(queue, skb);
....@@ -104,6 +104,8 @@
104104 }
105105
106106 spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
107
+
108
+ return ret;
107109 }
108110
109111 static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue)
....@@ -282,6 +284,19 @@
282284 pkt->extra_count++;
283285 }
284286
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
+
285300 if (skb->sw_hash) {
286301 struct xen_netif_extra_info *extra;
287302
....@@ -380,7 +395,7 @@
380395 struct xen_netif_rx_request *req,
381396 struct xen_netif_rx_response *rsp)
382397 {
383
- unsigned int offset = 0;
398
+ unsigned int offset = queue->vif->xdp_headroom;
384399 unsigned int flags;
385400
386401 do {
....@@ -473,7 +488,7 @@
473488
474489 #define RX_BATCH_SIZE 64
475490
476
-void xenvif_rx_action(struct xenvif_queue *queue)
491
+static void xenvif_rx_action(struct xenvif_queue *queue)
477492 {
478493 struct sk_buff_head completed_skbs;
479494 unsigned int work_done = 0;
....@@ -482,6 +497,7 @@
482497 queue->rx_copy.completed = &completed_skbs;
483498
484499 while (xenvif_rx_ring_slots_available(queue) &&
500
+ !skb_queue_empty(&queue->rx_queue) &&
485501 work_done < RX_BATCH_SIZE) {
486502 xenvif_rx_skb(queue);
487503 work_done++;