On Thu, Aug 17, 2023 at 2:05 AM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote:Nods.
Yes, I think the right move in the long run is to delegate the
On 8/15/2023 6:55 PM, Jason Wang wrote:
On Wed, Aug 16, 2023 at 3:49 AM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote:If we go with setting up 1:1 DMA mapping at virtio-vdpa .probe() and
I meant the bus tries to hide the differences among vendors. So it
On 8/14/2023 7:21 PM, Jason Wang wrote:
On Tue, Aug 15, 2023 at 9:46 AM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote:Not sure what does it mean by "device internal", but this op callback
Signed-off-by: Si-Wei Liu <si-wei.liu@xxxxxxxxxx>This exposes the device internal to the upper layer which is not optimal.
---
include/linux/vdpa.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index db1b0ea..3a3878d 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -314,6 +314,12 @@ struct vdpa_map_file {
* @iova: iova to be unmapped
* @size: size of the area
* Returns integer: success (0) or error (< 0)
+ * @reset_map: Reset device memory mapping (optional)
+ * Needed for device that using device
+ * specific DMA translation (on-chip IOMMU)
just follows existing convention to describe what vdpa parent this API
targets.
needs to hide on-chip IOMMU stuff to the upper layer.
We can expose two dimensional IO mappings models but it looks like
over engineering for this issue. More below.
* @set_map: Set device memory mapping (optional)We can do this simple change if it can work.
* Needed for device that using device
* specific DMA translation (on-chip IOMMU)
:
:
* @dma_map: Map an area of PA to IOVA (optional)
* Needed for device that using device
* specific DMA translation (on-chip IOMMU)
* and preferring incremental map.
:
:
* @dma_unmap: Unmap an area of IOVA (optional but
* must be implemented with dma_map)
* Needed for device that using device
* specific DMA translation (on-chip IOMMU)
* and preferring incremental unmap.
Btw, what's the difference between this and a simpleI don't think parent drivers support this today - they can accept
set_map(NULL)?
non-NULL iotlb containing empty map entry, but not a NULL iotlb. The
behavior is undefined or it even causes panic when a NULL iotlb is
passed in.
tearing it down at .release(), perhaps set_map(NULL) is not sufficient.
OK, at a point there was suggestion to get this incremental API extendedFurther this doesn't work with .dma_map parent drivers.Probably, but I'd remove dma_map as it doesn't have any real users
except for the simulator.
to support batching to be in par with or even replace .set_map, not sure
if it's too soon to conclude. But I'm okay with the removal if need be.
batching to the parent driver. This allows drivers like mlx to add
memory (like hotplugged memory) without the need of tearing down all
the old maps.
I guess for that sake I would keep .dma_map unless there's strong objection against it.
Having said that, maybe we can work on top if we need to remove
.dma_map for now.
A feature flag is needed anyway. I'm fine with reusing but guess I'dThe reason why a new op is needed or better is because it allowsI'm ok with a new feature flag, but we need to first seek a way to
userspace to tell apart different reset behavior from the older kernel
(via the F_IOTLB_PERSIST feature bit in patch 4), while this behavior
could vary between parent drivers.
reuse the existing API.
want to converge on the direction first.
Thanks,
-Siwei
Thanks
Regards,
-Siwei
Thanks
+ * @vdev: vdpa device
+ * @asid: address space identifier
+ * Returns integer: success (0) or error (< 0)
* @get_vq_dma_dev: Get the dma device for a specific
* virtqueue (optional)
* @vdev: vdpa device
@@ -390,6 +396,7 @@ struct vdpa_config_ops {
u64 iova, u64 size, u64 pa, u32 perm, void *opaque);
int (*dma_unmap)(struct vdpa_device *vdev, unsigned int asid,
u64 iova, u64 size);
+ int (*reset_map)(struct vdpa_device *vdev, unsigned int asid);
int (*set_group_asid)(struct vdpa_device *vdev, unsigned int group,
unsigned int asid);
struct device *(*get_vq_dma_dev)(struct vdpa_device *vdev, u16 idx);
--
1.8.3.1