virtio_net: enable premapped mode for merge and small by default
authorXuan Zhuo <xuanzhuo@linux.alibaba.com>
Tue, 29 Oct 2024 08:46:14 +0000 (16:46 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 5 Nov 2024 10:37:40 +0000 (11:37 +0100)
Currently, the virtio core will perform a dma operation for each
buffer. Although, the same page may be operated multiple times.

In premapped mod, we can perform only one dma operation for the pages of
the alloc frag. This is beneficial for the iommu device.

kernel command line: intel_iommu=on iommu.passthrough=0

       |  strict=0  | strict=1
Before |  775496pps | 428614pps
After  | 1109316pps | 742853pps

In the 6.11, we disabled this feature because a regress [1].

Now, we fix the problem and re-enable it.

[1]: http://lore.kernel.org/all/8b20cc28-45a9-4643-8e87-ba164a540c0a@oracle.com

Tested-by: Darren Kenny <darren.kenny@oracle.com>
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/virtio_net.c

index b82f6b8a8231d97df910c32fee8ba6bf2ec294a7..befc30b3abb1756344116530266eb23eddddc39d 100644 (file)
@@ -6107,6 +6107,17 @@ err_ctrl:
        return -ENOMEM;
 }
 
+static void virtnet_rq_set_premapped(struct virtnet_info *vi)
+{
+       int i;
+
+       for (i = 0; i < vi->max_queue_pairs; i++) {
+               /* error should never happen */
+               BUG_ON(virtqueue_set_dma_premapped(vi->rq[i].vq));
+               vi->rq[i].do_dma = true;
+       }
+}
+
 static int init_vqs(struct virtnet_info *vi)
 {
        int ret;
@@ -6120,6 +6131,10 @@ static int init_vqs(struct virtnet_info *vi)
        if (ret)
                goto err_free;
 
+       /* disable for big mode */
+       if (!vi->big_packets || vi->mergeable_rx_bufs)
+               virtnet_rq_set_premapped(vi);
+
        cpus_read_lock();
        virtnet_set_affinity(vi);
        cpus_read_unlock();