Message ID | 20241014031234.7659-5-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | virtio_net: enable premapped mode by default | expand |
On Mon, Oct 14, 2024 at 11:12 AM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > 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 > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > --- > drivers/net/virtio_net.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index cd90e77881df..8cf24b7b58bd 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -6133,6 +6133,21 @@ static int virtnet_alloc_queues(struct virtnet_info *vi) > return -ENOMEM; > } > > +static void virtnet_rq_set_premapped(struct virtnet_info *vi) > +{ > + int i; > + > + /* disable for big mode */ > + if (vi->mode == VIRTNET_MODE_BIG) > + return; Nitpick: I would like such a check to be done at the caller. But anyhow the patch looks good Acked-by: Jason Wang <jasowang@redhat.com> Thanks > + > + 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; > @@ -6146,6 +6161,8 @@ static int init_vqs(struct virtnet_info *vi) > if (ret) > goto err_free; > > + virtnet_rq_set_premapped(vi); > + > cpus_read_lock(); > virtnet_set_affinity(vi); > cpus_read_unlock(); > -- > 2.32.0.3.g01195cf9f >
On Fri, 18 Oct 2024 16:00:07 +0800, Jason Wang <jasowang@redhat.com> wrote: > On Mon, Oct 14, 2024 at 11:12 AM Xuan Zhuo <xuanzhuo@linux.alibaba.com> wrote: > > > > 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 > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > --- > > drivers/net/virtio_net.c | 17 +++++++++++++++++ > > 1 file changed, 17 insertions(+) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > index cd90e77881df..8cf24b7b58bd 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -6133,6 +6133,21 @@ static int virtnet_alloc_queues(struct virtnet_info *vi) > > return -ENOMEM; > > } > > > > +static void virtnet_rq_set_premapped(struct virtnet_info *vi) > > +{ > > + int i; > > + > > + /* disable for big mode */ > > + if (vi->mode == VIRTNET_MODE_BIG) > > + return; > > Nitpick: I would like such a check to be done at the caller. I am ok, if you like. Thanks. > > But anyhow the patch looks good > > Acked-by: Jason Wang <jasowang@redhat.com> > > Thanks > > > + > > + 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; > > @@ -6146,6 +6161,8 @@ static int init_vqs(struct virtnet_info *vi) > > if (ret) > > goto err_free; > > > > + virtnet_rq_set_premapped(vi); > > + > > cpus_read_lock(); > > virtnet_set_affinity(vi); > > cpus_read_unlock(); > > -- > > 2.32.0.3.g01195cf9f > > >
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index cd90e77881df..8cf24b7b58bd 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -6133,6 +6133,21 @@ static int virtnet_alloc_queues(struct virtnet_info *vi) return -ENOMEM; } +static void virtnet_rq_set_premapped(struct virtnet_info *vi) +{ + int i; + + /* disable for big mode */ + if (vi->mode == VIRTNET_MODE_BIG) + return; + + 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; @@ -6146,6 +6161,8 @@ static int init_vqs(struct virtnet_info *vi) if (ret) goto err_free; + virtnet_rq_set_premapped(vi); + cpus_read_lock(); virtnet_set_affinity(vi); cpus_read_unlock();
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 Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/net/virtio_net.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)