aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2016-10-04 05:29:16 -0400
committerDavid S. Miller <davem@davemloft.net>2016-10-06 20:37:36 -0400
commit98f6d57ced73b723551568262019f1d6c8771f20 (patch)
treecc8cc59b8b34aed750dd8c020fbd31dca62165af
parent7c0b1a23e6f983fe392c8ffa71d05189ae52ebb5 (diff)
xen-netback: process guest rx packets in batches
Instead of only placing one skb on the guest rx ring at a time, process a batch of up-to 64. This improves performance by ~10% in some tests. Signed-off-by: David Vrabel <david.vrabel@citrix.com> [re-based] Signed-off-by: Paul Durrant <paul.durrant@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/xen-netback/rx.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c
index 95487091763c..ae822b8fa76d 100644
--- a/drivers/net/xen-netback/rx.c
+++ b/drivers/net/xen-netback/rx.c
@@ -399,7 +399,7 @@ static void xenvif_rx_extra_slot(struct xenvif_queue *queue,
399 BUG(); 399 BUG();
400} 400}
401 401
402void xenvif_rx_action(struct xenvif_queue *queue) 402void xenvif_rx_skb(struct xenvif_queue *queue)
403{ 403{
404 struct xenvif_pkt_state pkt; 404 struct xenvif_pkt_state pkt;
405 405
@@ -425,6 +425,19 @@ void xenvif_rx_action(struct xenvif_queue *queue)
425 xenvif_rx_complete(queue, &pkt); 425 xenvif_rx_complete(queue, &pkt);
426} 426}
427 427
428#define RX_BATCH_SIZE 64
429
430void xenvif_rx_action(struct xenvif_queue *queue)
431{
432 unsigned int work_done = 0;
433
434 while (xenvif_rx_ring_slots_available(queue) &&
435 work_done < RX_BATCH_SIZE) {
436 xenvif_rx_skb(queue);
437 work_done++;
438 }
439}
440
428static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue) 441static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue)
429{ 442{
430 RING_IDX prod, cons; 443 RING_IDX prod, cons;