Hello all,
I am trying to understand how a virtio-block device updates "used" buffers in the virtqueue. I intend to 'mimic' this process without the actual disk event happening, by storing the used buffers and then re-using them later. I can see that the function virtqueue_fill is primarily responsible for filling up the virtqueue which eventually updates the guest memory. vring_used_write eventually does a memcpy to write the used buffer contents to the memory.
I do not understand what is the primary role of the virtqueue_unmap_sg function. I have a few questions.
- What does this function do?
- Does it in any way modify the guest's physical memory?
- Why do we need to map and unmap the in_sg and out_sg into/out of the DMA address space? Is this for updating the IOMMU and destroying the address mappings that existed before?
- What happens if unmapping does not happen?
If there are good articles that describe this process of DMA address space mapping/unmapping, feel free to point me to them and I would love to read them too.
Thank you very much.
Best Regards,
Arnabjyoti Kalita