Blame SOURCES/0001-net-virtio-allocate-vrings-on-device-NUMA-node.patch

2c1bf6
From 8093f82b3e52efe012e46c429b7af4e82492f71c Mon Sep 17 00:00:00 2001
2c1bf6
From: Maxime Coquelin <maxime.coquelin@redhat.com>
2c1bf6
Date: Tue, 27 Nov 2018 11:54:27 +0100
2c1bf6
Subject: [PATCH] net/virtio: allocate vrings on device NUMA node
2c1bf6
2c1bf6
[ upstream commit 4a5140ab17d29e77eefa47b5cb514238e8e0c132 ]
2c1bf6
2c1bf6
When a guest is spanned on multiple NUMA nodes and
2c1bf6
multiple Virtio devices are spanned onto these nodes,
2c1bf6
we expect that their ring memory is allocated in the
2c1bf6
right memory node.
2c1bf6
2c1bf6
Otherwise, vCPUs from node A may be polling Virtio rings
2c1bf6
allocated on node B, which would increase QPI bandwidth
2c1bf6
and impact performance.
2c1bf6
2c1bf6
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
2c1bf6
Reviewed-by: David Marchand <david.marchand@redhat.com>
2c1bf6
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
2c1bf6
---
2c1bf6
 drivers/net/virtio/virtio_ethdev.c | 12 +++++++-----
2c1bf6
 1 file changed, 7 insertions(+), 5 deletions(-)
2c1bf6
2c1bf6
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
2c1bf6
index 2ba66d291..cb2b2e0bf 100644
2c1bf6
--- a/drivers/net/virtio/virtio_ethdev.c
2c1bf6
+++ b/drivers/net/virtio/virtio_ethdev.c
2c1bf6
@@ -335,8 +335,10 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
2c1bf6
 	void *sw_ring = NULL;
2c1bf6
 	int queue_type = virtio_get_queue_type(hw, vtpci_queue_idx);
2c1bf6
 	int ret;
2c1bf6
+	int numa_node = dev->device->numa_node;
2c1bf6
 
2c1bf6
-	PMD_INIT_LOG(DEBUG, "setting up queue: %u", vtpci_queue_idx);
2c1bf6
+	PMD_INIT_LOG(INFO, "setting up queue: %u on NUMA node %d",
2c1bf6
+			vtpci_queue_idx, numa_node);
2c1bf6
 
2c1bf6
 	/*
2c1bf6
 	 * Read the virtqueue size from the Queue Size field
2c1bf6
@@ -372,7 +374,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
2c1bf6
 	}
2c1bf6
 
2c1bf6
 	vq = rte_zmalloc_socket(vq_name, size, RTE_CACHE_LINE_SIZE,
2c1bf6
-				SOCKET_ID_ANY);
2c1bf6
+				numa_node);
2c1bf6
 	if (vq == NULL) {
2c1bf6
 		PMD_INIT_LOG(ERR, "can not allocate vq");
2c1bf6
 		return -ENOMEM;
2c1bf6
@@ -392,7 +394,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
2c1bf6
 		     size, vq->vq_ring_size);
2c1bf6
 
2c1bf6
 	mz = rte_memzone_reserve_aligned(vq_name, vq->vq_ring_size,
2c1bf6
-			SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG,
2c1bf6
+			numa_node, RTE_MEMZONE_IOVA_CONTIG,
2c1bf6
 			VIRTIO_PCI_VRING_ALIGN);
2c1bf6
 	if (mz == NULL) {
2c1bf6
 		if (rte_errno == EEXIST)
2c1bf6
@@ -418,7 +420,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
2c1bf6
 		snprintf(vq_hdr_name, sizeof(vq_hdr_name), "port%d_vq%d_hdr",
2c1bf6
 			 dev->data->port_id, vtpci_queue_idx);
2c1bf6
 		hdr_mz = rte_memzone_reserve_aligned(vq_hdr_name, sz_hdr_mz,
2c1bf6
-				SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG,
2c1bf6
+				numa_node, RTE_MEMZONE_IOVA_CONTIG,
2c1bf6
 				RTE_CACHE_LINE_SIZE);
2c1bf6
 		if (hdr_mz == NULL) {
2c1bf6
 			if (rte_errno == EEXIST)
2c1bf6
@@ -435,7 +437,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
2c1bf6
 			       sizeof(vq->sw_ring[0]);
2c1bf6
 
2c1bf6
 		sw_ring = rte_zmalloc_socket("sw_ring", sz_sw,
2c1bf6
-				RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
2c1bf6
+				RTE_CACHE_LINE_SIZE, numa_node);
2c1bf6
 		if (!sw_ring) {
2c1bf6
 			PMD_INIT_LOG(ERR, "can not allocate RX soft ring");
2c1bf6
 			ret = -ENOMEM;
2c1bf6
-- 
2c1bf6
2.20.1
2c1bf6