On Fri, 18 Oct 2024 16:00:07 +0800, Jason Wang <jasowang@xxxxxxxxxx> wrote: > On Mon, Oct 14, 2024 at 11:12 AM Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> 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@xxxxxxxxxx > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> > > --- > > 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@xxxxxxxxxx> > > 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 > > >