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. 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 >