vfio_sanity_check_pfn_list() is used to check whether pfn_list of
vfio_dma is empty when remove the external domain, so it makes a
wrong assumption that only external domain will add pfn to dma pfn_list.
Now we apply this check when remove a specific vfio_dma and extract
the notifier check just for external domain.
Fixes: a54eb55045ae ("vfio iommu type1: Add support for mediated devices")
Signed-off-by: Keqian Zhu <redacted>
---
drivers/vfio/vfio_iommu_type1.c | 24 +++++-------------------
1 file changed, 5 insertions(+), 19 deletions(-)
If a group with non-pinned-page dirty scope is detached with dirty
logging enabled, we should fully populate the dirty bitmaps at the
time it's removed since we don't know the extent of its previous DMA,
nor will the group be present to trigger the full bitmap when the user
retrieves the dirty bitmap.
Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking")
Suggested-by: Alex Williamson <redacted>
Signed-off-by: Keqian Zhu <redacted>
---
drivers/vfio/vfio_iommu_type1.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
From: Alex Williamson <hidden> Date: 2021-01-15 18:03:38
On Fri, 15 Jan 2021 17:26:42 +0800
Keqian Zhu [off-list ref] wrote:
quoted hunk
If a group with non-pinned-page dirty scope is detached with dirty
logging enabled, we should fully populate the dirty bitmaps at the
time it's removed since we don't know the extent of its previous DMA,
nor will the group be present to trigger the full bitmap when the user
retrieves the dirty bitmap.
Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking")
Suggested-by: Alex Williamson <redacted>
Signed-off-by: Keqian Zhu <redacted>
---
drivers/vfio/vfio_iommu_type1.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
This doesn't do the right thing. This marks the bitmap dirty if:
* The detached group dirty scope was not limited to pinned pages
AND
* Dirty tracking is enabled
AND
* The vfio_dma is *currently* (ie. after the detach) iommu_mapped
We need to mark the bitmap dirty based on whether the vfio_dma *was*
iommu_mapped by the group that is now detached. Thanks,
Alex
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Alex Williamson <hidden> Date: 2021-01-15 19:16:40
On Fri, 15 Jan 2021 17:26:43 +0800
Keqian Zhu [off-list ref] wrote:
vfio_sanity_check_pfn_list() is used to check whether pfn_list of
vfio_dma is empty when remove the external domain, so it makes a
wrong assumption that only external domain will add pfn to dma pfn_list.
Now we apply this check when remove a specific vfio_dma and extract
the notifier check just for external domain.
The page pinning interface is gated by having a notifier registered for
unmaps, therefore non-external domains would also need to register a
notifier. There's currently no other way to add entries to the
pfn_list. So if we allow pinning for such domains, then it's wrong to
WARN_ON() when the notifier list is not-empty when removing an external
domain. Long term we should probably extend page {un}pinning for the
caller to pass their notifier to be validated against the notifier list
rather than just allowing page pinning if *any* notifier is registered.
Thanks,
Alex
On Fri, 15 Jan 2021 17:26:42 +0800
Keqian Zhu [off-list ref] wrote:
quoted
If a group with non-pinned-page dirty scope is detached with dirty
logging enabled, we should fully populate the dirty bitmaps at the
time it's removed since we don't know the extent of its previous DMA,
nor will the group be present to trigger the full bitmap when the user
retrieves the dirty bitmap.
Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking")
Suggested-by: Alex Williamson <redacted>
Signed-off-by: Keqian Zhu <redacted>
---
drivers/vfio/vfio_iommu_type1.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
This doesn't do the right thing. This marks the bitmap dirty if:
* The detached group dirty scope was not limited to pinned pages
AND
* Dirty tracking is enabled
AND
* The vfio_dma is *currently* (ie. after the detach) iommu_mapped
We need to mark the bitmap dirty based on whether the vfio_dma *was*
iommu_mapped by the group that is now detached. Thanks,
Alex
Hi Alex,
Yes, I missed this point again :-(. The update_dirty_scope means we detached
an iommu backed group, and that means the vfio_dma *was* iommu_mapped by this
group, so we can populate full bitmap unconditionally, right?
Thanks,
Keqian
On Fri, 15 Jan 2021 17:26:43 +0800
Keqian Zhu [off-list ref] wrote:
quoted
vfio_sanity_check_pfn_list() is used to check whether pfn_list of
vfio_dma is empty when remove the external domain, so it makes a
wrong assumption that only external domain will add pfn to dma pfn_list.
Now we apply this check when remove a specific vfio_dma and extract
the notifier check just for external domain.
The page pinning interface is gated by having a notifier registered for
unmaps, therefore non-external domains would also need to register a
notifier. There's currently no other way to add entries to the
pfn_list. So if we allow pinning for such domains, then it's wrong to
WARN_ON() when the notifier list is not-empty when removing an external
domain. Long term we should probably extend page {un}pinning for the
caller to pass their notifier to be validated against the notifier list
rather than just allowing page pinning if *any* notifier is registered.
Thanks,
I was misled by the code comments. So when the commit a54eb55045ae is added, the only
user of pin interface is mdev vendor driver, but now we also allow iommu backed group
to use this interface to constraint dirty scope. Is vfio_iommu_unmap_unpin_all() a
proper place to put this WARN()?
Thanks,
Keqian
From: Alex Williamson <hidden> Date: 2021-01-21 18:08:58
On Mon, 18 Jan 2021 20:25:09 +0800
Keqian Zhu [off-list ref] wrote:
On 2021/1/16 2:01, Alex Williamson wrote:
quoted
On Fri, 15 Jan 2021 17:26:42 +0800
Keqian Zhu [off-list ref] wrote:
quoted
If a group with non-pinned-page dirty scope is detached with dirty
logging enabled, we should fully populate the dirty bitmaps at the
time it's removed since we don't know the extent of its previous DMA,
nor will the group be present to trigger the full bitmap when the user
retrieves the dirty bitmap.
Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking")
Suggested-by: Alex Williamson <redacted>
Signed-off-by: Keqian Zhu <redacted>
---
drivers/vfio/vfio_iommu_type1.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
This doesn't do the right thing. This marks the bitmap dirty if:
* The detached group dirty scope was not limited to pinned pages
AND
* Dirty tracking is enabled
AND
* The vfio_dma is *currently* (ie. after the detach) iommu_mapped
We need to mark the bitmap dirty based on whether the vfio_dma *was*
iommu_mapped by the group that is now detached. Thanks,
Alex
Hi Alex,
Yes, I missed this point again :-(. The update_dirty_scope means we
detached an iommu backed group, and that means the vfio_dma *was*
iommu_mapped by this group, so we can populate full bitmap
unconditionally, right?
To do it unconditionally, the assumption would be that all current
vfio_dmas are iommu_mapped. It seems like it's deterministic that a
non-pinned-page scope group implies all vfio_dmas are iommu_mapped. I
can't currently think of an exception. Thanks,
Alex
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Alex Williamson <hidden> Date: 2021-01-21 18:30:50
On Mon, 18 Jan 2021 21:16:08 +0800
Keqian Zhu [off-list ref] wrote:
On 2021/1/16 3:14, Alex Williamson wrote:
quoted
On Fri, 15 Jan 2021 17:26:43 +0800
Keqian Zhu [off-list ref] wrote:
quoted
vfio_sanity_check_pfn_list() is used to check whether pfn_list of
vfio_dma is empty when remove the external domain, so it makes a
wrong assumption that only external domain will add pfn to dma pfn_list.
Now we apply this check when remove a specific vfio_dma and extract
the notifier check just for external domain.
The page pinning interface is gated by having a notifier registered for
unmaps, therefore non-external domains would also need to register a
notifier. There's currently no other way to add entries to the
pfn_list. So if we allow pinning for such domains, then it's wrong to
WARN_ON() when the notifier list is not-empty when removing an external
domain. Long term we should probably extend page {un}pinning for the
caller to pass their notifier to be validated against the notifier list
rather than just allowing page pinning if *any* notifier is registered.
Thanks,
I was misled by the code comments. So when the commit a54eb55045ae is
added, the only user of pin interface is mdev vendor driver, but now
we also allow iommu backed group to use this interface to constraint
dirty scope. Is vfio_iommu_unmap_unpin_all() a proper place to put
this WARN()?
vfio_iommu_unmap_unpin_all() deals with removing vfio_dmas, it's
logically unrelated to whether any driver is registered to receive
unmap notifications. Thanks,
Alex
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel