On Thu, 21 Mar 2024 14:02:14 +0800, Jason Wang <jasowang@xxxxxxxxxx> wrote: > On Tue, Mar 12, 2024 at 11:36 AM Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> wrote: > > > > Now, the API virtqueue_set_dma_premapped just support to > > enable premapped mode. > > > > If we allow enabling the premapped dynamically, we should > > make this API to support disable the premapped mode. > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> > > --- > > drivers/virtio/virtio_ring.c | 34 ++++++++++++++++++++++++++-------- > > include/linux/virtio.h | 2 +- > > 2 files changed, 27 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > > index 34f4b2c0c31e..3bf69cae4965 100644 > > --- a/drivers/virtio/virtio_ring.c > > +++ b/drivers/virtio/virtio_ring.c > > @@ -2801,6 +2801,7 @@ EXPORT_SYMBOL_GPL(virtqueue_resize); > > /** > > * virtqueue_set_dma_premapped - set the vring premapped mode > > * @_vq: the struct virtqueue we're talking about. > > + * @premapped: enable/disable the premapped mode. > > * > > * Enable the premapped mode of the vq. > > * > > @@ -2819,9 +2820,10 @@ EXPORT_SYMBOL_GPL(virtqueue_resize); > > * 0: success. > > * -EINVAL: vring does not use the dma api, so we can not enable premapped mode. > > */ > > -int virtqueue_set_dma_premapped(struct virtqueue *_vq) > > +int virtqueue_set_dma_premapped(struct virtqueue *_vq, bool premapped) > > I think we need to document the requirement for calling this. > > Looking at the code, it seems it requires to stop the datapath and > detach all the used buffers? YES. The complete document is: /** * virtqueue_set_dma_premapped - set the vring premapped mode * @_vq: the struct virtqueue we're talking about. * * Enable the premapped mode of the vq. * * The vring in premapped mode does not do dma internally, so the driver must * do dma mapping in advance. The driver must pass the dma_address through * dma_address of scatterlist. When the driver got a used buffer from * the vring, it has to unmap the dma address. * * This function must be called immediately after creating the vq, or after vq * reset, and before adding any buffers to it. * * Caller must ensure we don't call this with other virtqueue operations * at the same time (except where noted). * * Returns zero or a negative error. * 0: success. * -EINVAL: vring does not use the dma api, so we can not enable premapped mode. */ Thanks > > Thanks >