On Tue, Jan 16, 2024 at 3:47 PM Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> wrote: > > On Thu, 11 Jan 2024 16:34:09 +0800, Jason Wang <jasowang@xxxxxxxxxx> wrote: > > On Fri, Dec 29, 2023 at 3:31 PM Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> wrote: > > > > > > introduce virtqueue_get_buf_ctx_dma() to collect the dma info when > > > get buf from virtio core for premapped mode. > > > > > > If the virtio queue is premapped mode, the virtio-net send buf may > > > have many desc. Every desc dma address need to be unmap. So here we > > > introduce a new helper to collect the dma address of the buffer from > > > the virtio core. > > > > > > Because the BAD_RING is called (that may set vq->broken), so > > > the relative "const" of vq is removed. > > > > > > Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> > > > --- > > > drivers/virtio/virtio_ring.c | 174 +++++++++++++++++++++++++---------- > > > include/linux/virtio.h | 16 ++++ > > > 2 files changed, 142 insertions(+), 48 deletions(-) > > > > > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > > > index 51d8f3299c10..1374b3fd447c 100644 > > > --- a/drivers/virtio/virtio_ring.c > > > +++ b/drivers/virtio/virtio_ring.c > > > @@ -362,6 +362,45 @@ static struct device *vring_dma_dev(const struct vring_virtqueue *vq) > > > return vq->dma_dev; > > > } > > > > > > +/* > > > + * use_dma_api premapped -> do_unmap > > > + * 1. false false false > > > + * 2. true false true > > > + * 3. true true false > > > + * > > > + * Only #3, we should return the DMA info to the driver. > > > > Btw, I guess you meant "#3 is false" here? > > > > And could we reduce the size of these 3 * 3 matrices? It's usually a > > hint that the code is not optmized. > > On the process of doing dma map, we force the (use_dma_api, premapped). > > if premapped: > virtio core skip dma map > else: > if use_dma_api: > do dma map > else: > work with the physical address. > > Here we force the (premapped, do_unmap). > > do_unmap is an optimization. We just check this to know should we do dma unmap > or not. > > Now, we introduced an new case, when the virtio core skip dma unmap, > we may need to return the dma info to the driver. That just occur when > the (premapped, do_unmap) is (true, false). Because that the (premmaped, > do_unmap) may be (false, false). > > For the matrices, I just want to show where the do_unmap comes from. > That is a optimization, we use this many places, not to check (use_dma_api, > premapped) on the process of doing unmap. And only for the case #3, we should > return the dma info to drivers. Ok, it tries to ease the life of the readers. I wonder if something like bool virtqueue_needs_unmap() can help, it can judge based on the value of use_dma_api and premapped. Thanks > > Thanks. > > > > > Thanks > > > > >