* [PATCH 0/2] Optimize unmap_all with one ioctl()
@ 2025-09-24 7:02 Zhenzhong Duan
2025-09-24 7:02 ` [PATCH 1/2] vfio/container: Support unmap all in " Zhenzhong Duan
2025-09-24 7:02 ` [PATCH 2/2] vfio/iommufd: " Zhenzhong Duan
0 siblings, 2 replies; 11+ messages in thread
From: Zhenzhong Duan @ 2025-09-24 7:02 UTC (permalink / raw)
To: qemu-devel
Cc: alex.williamson, clg, eric.auger, joao.m.martins, Zhenzhong Duan
Currently unmap_all is split into two ioctl() with each unmap half of
the whole iova space.
IOMMUFD supports unmap_all ioctl() from beginning, after kernel commit
c19650995374 ("vfio/type1: implement unmap all") added same support
for VFIO type1, the split becomes unnecessary.
So optimize the code to only do one ioctl() to unmap_all for both
backends.
Test:
In order to trigger unmap_all request, made below trick, during emergency
reset in guest, memory region [0xfef00000 - 0xffffffffffffffff] is
deleted, I fake it to be a unmap_all request.
--- a/hw/vfio/listener.c
+++ b/hw/vfio/listener.c
@@ -714,8 +714,10 @@ static void vfio_listener_region_del(MemoryListener *listener,
if (try_unmap) {
bool unmap_all = false;
- if (int128_eq(llsize, int128_2_64())) {
+ if (int128_eq(llsize, int128_2_64()) ||
+ iova == 0xfef00000) {
unmap_all = true;
+ iova = 0;
llsize = int128_zero();
}
The log shows ioctl() succeed on the whole iova space:
vfio_listener_region_del region_del 0xfef00000 - 0xffffffffffffffff
iommufd_backend_unmap_dma iommufd=10 ioas=5 iova=0x0 size=0xffffffffffffffff (0)
Same result for legacy VFIO.
Maybe it's easy to trigger unmap_all with other arch, e.g., arm smmu, but for x86,
iommu memory region is split by iommu_ir, unmap_all isn't triggered.
Thanks
Zhenzhong
Zhenzhong Duan (2):
vfio/container: Support unmap all in one ioctl()
vfio/iommufd: Support unmap all in one ioctl()
hw/vfio/container.c | 33 ++++++++++++++++++++-------------
hw/vfio/iommufd.c | 16 ++--------------
2 files changed, 22 insertions(+), 27 deletions(-)
--
2.47.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-09-24 7:02 [PATCH 0/2] Optimize unmap_all with one ioctl() Zhenzhong Duan
@ 2025-09-24 7:02 ` Zhenzhong Duan
2025-09-30 15:26 ` Cédric Le Goater
2025-09-24 7:02 ` [PATCH 2/2] vfio/iommufd: " Zhenzhong Duan
1 sibling, 1 reply; 11+ messages in thread
From: Zhenzhong Duan @ 2025-09-24 7:02 UTC (permalink / raw)
To: qemu-devel
Cc: alex.williamson, clg, eric.auger, joao.m.martins, Zhenzhong Duan
VFIO type1 kernel uAPI supports unmapping whole address space in one call
since commit c19650995374 ("vfio/type1: implement unmap all"). use the
unmap_all variant whenever it's supported in kernel.
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/vfio/container.c | 33 ++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
index 030c6d3f89..2e13f04803 100644
--- a/hw/vfio/container.c
+++ b/hw/vfio/container.c
@@ -122,12 +122,12 @@ unmap_exit:
static int vfio_legacy_dma_unmap_one(const VFIOContainerBase *bcontainer,
hwaddr iova, ram_addr_t size,
- IOMMUTLBEntry *iotlb)
+ uint32_t flags, IOMMUTLBEntry *iotlb)
{
const VFIOContainer *container = VFIO_IOMMU_LEGACY(bcontainer);
struct vfio_iommu_type1_dma_unmap unmap = {
.argsz = sizeof(unmap),
- .flags = 0,
+ .flags = flags,
.iova = iova,
.size = size,
};
@@ -187,25 +187,32 @@ static int vfio_legacy_dma_unmap(const VFIOContainerBase *bcontainer,
hwaddr iova, ram_addr_t size,
IOMMUTLBEntry *iotlb, bool unmap_all)
{
+ uint32_t flags = 0;
int ret;
if (unmap_all) {
- /* The unmap ioctl doesn't accept a full 64-bit span. */
- Int128 llsize = int128_rshift(int128_2_64(), 1);
+ const VFIOContainer *container = VFIO_IOMMU_LEGACY(bcontainer);
- ret = vfio_legacy_dma_unmap_one(bcontainer, 0, int128_get64(llsize),
- iotlb);
+ assert(!iova && !size);
- if (ret == 0) {
- ret = vfio_legacy_dma_unmap_one(bcontainer, int128_get64(llsize),
- int128_get64(llsize), iotlb);
- }
+ ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
+ if (ret) {
+ flags = VFIO_DMA_UNMAP_FLAG_ALL;
+ } else {
+ /* The unmap ioctl doesn't accept a full 64-bit span. */
+ Int128 llsize = int128_rshift(int128_2_64(), 1);
+ size = int128_get64(llsize);
+
+ ret = vfio_legacy_dma_unmap_one(bcontainer, 0, size, flags, iotlb);
+ if (ret) {
+ return ret;
+ }
- } else {
- ret = vfio_legacy_dma_unmap_one(bcontainer, iova, size, iotlb);
+ iova = size;
+ }
}
- return ret;
+ return vfio_legacy_dma_unmap_one(bcontainer, iova, size, flags, iotlb);
}
static int vfio_legacy_dma_map(const VFIOContainerBase *bcontainer, hwaddr iova,
--
2.47.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2] vfio/iommufd: Support unmap all in one ioctl()
2025-09-24 7:02 [PATCH 0/2] Optimize unmap_all with one ioctl() Zhenzhong Duan
2025-09-24 7:02 ` [PATCH 1/2] vfio/container: Support unmap all in " Zhenzhong Duan
@ 2025-09-24 7:02 ` Zhenzhong Duan
1 sibling, 0 replies; 11+ messages in thread
From: Zhenzhong Duan @ 2025-09-24 7:02 UTC (permalink / raw)
To: qemu-devel
Cc: alex.williamson, clg, eric.auger, joao.m.martins, Zhenzhong Duan
IOMMUFD kernel uAPI supports unmapping whole address space in one call with
[iova, size] set to [0, UINT64_MAX], this can simplify iommufd_cdev_unmap()
a bit. See iommufd_ioas_unmap() in kernel for details.
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/vfio/iommufd.c | 16 ++--------------
1 file changed, 2 insertions(+), 14 deletions(-)
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index 8c27222f75..02e4b8774a 100644
--- a/hw/vfio/iommufd.c
+++ b/hw/vfio/iommufd.c
@@ -65,21 +65,9 @@ static int iommufd_cdev_unmap(const VFIOContainerBase *bcontainer,
const VFIOIOMMUFDContainer *container =
container_of(bcontainer, VFIOIOMMUFDContainer, bcontainer);
- /* unmap in halves */
if (unmap_all) {
- Int128 llsize = int128_rshift(int128_2_64(), 1);
- int ret;
-
- ret = iommufd_backend_unmap_dma(container->be, container->ioas_id,
- 0, int128_get64(llsize));
-
- if (ret == 0) {
- ret = iommufd_backend_unmap_dma(container->be, container->ioas_id,
- int128_get64(llsize),
- int128_get64(llsize));
- }
-
- return ret;
+ assert(!iova && !size);
+ size = UINT64_MAX;
}
/* TODO: Handle dma_unmap_bitmap with iotlb args (migration) */
--
2.47.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-09-24 7:02 ` [PATCH 1/2] vfio/container: Support unmap all in " Zhenzhong Duan
@ 2025-09-30 15:26 ` Cédric Le Goater
2025-09-30 22:04 ` John Levon
2025-10-08 10:17 ` Duan, Zhenzhong
0 siblings, 2 replies; 11+ messages in thread
From: Cédric Le Goater @ 2025-09-30 15:26 UTC (permalink / raw)
To: Zhenzhong Duan, qemu-devel; +Cc: alex.williamson, eric.auger, joao.m.martins
On 9/24/25 09:02, Zhenzhong Duan wrote:
> VFIO type1 kernel uAPI supports unmapping whole address space in one call
> since commit c19650995374 ("vfio/type1: implement unmap all"). use the
> unmap_all variant whenever it's supported in kernel.
>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
> hw/vfio/container.c | 33 ++++++++++++++++++++-------------
> 1 file changed, 20 insertions(+), 13 deletions(-)
>
> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
> index 030c6d3f89..2e13f04803 100644
> --- a/hw/vfio/container.c
> +++ b/hw/vfio/container.c
> @@ -122,12 +122,12 @@ unmap_exit:
>
> static int vfio_legacy_dma_unmap_one(const VFIOContainerBase *bcontainer,
Side note for rebase :
I would prefer internal routines of file hw/vfio/container.c,
which was renamed recently to hw/vfio/container-legacy.c, to
take a 'VFIOLegacyContainer *container' parameter.
The 'VFIOContainer *bcontainer' parameter should be kept for
high-level routines that wrap the IOMMU backend implementation.
> hwaddr iova, ram_addr_t size,
> - IOMMUTLBEntry *iotlb)
> + uint32_t flags, IOMMUTLBEntry *iotlb)
> {
> const VFIOContainer *container = VFIO_IOMMU_LEGACY(bcontainer);
> struct vfio_iommu_type1_dma_unmap unmap = {
> .argsz = sizeof(unmap),
> - .flags = 0,
> + .flags = flags,
> .iova = iova,> .size = size,
> };
> @@ -187,25 +187,32 @@ static int vfio_legacy_dma_unmap(const VFIOContainerBase *bcontainer,
> hwaddr iova, ram_addr_t size,
> IOMMUTLBEntry *iotlb, bool unmap_all)
> {
> + uint32_t flags = 0;
> int ret;
>
> if (unmap_all) {
> - /* The unmap ioctl doesn't accept a full 64-bit span. */
> - Int128 llsize = int128_rshift(int128_2_64(), 1);
> + const VFIOContainer *container = VFIO_IOMMU_LEGACY(bcontainer);
>
> - ret = vfio_legacy_dma_unmap_one(bcontainer, 0, int128_get64(llsize),
> - iotlb);
> + assert(!iova && !size);
The assert deserves an explanation and so probably a new patch.
> - if (ret == 0) {
> - ret = vfio_legacy_dma_unmap_one(bcontainer, int128_get64(llsize),
> - int128_get64(llsize), iotlb);
> - }
> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
> + if (ret) {
> + flags = VFIO_DMA_UNMAP_FLAG_ALL;
> + } else {
> + /* The unmap ioctl doesn't accept a full 64-bit span. */
> + Int128 llsize = int128_rshift(int128_2_64(), 1);
> + size = int128_get64(llsize);
> +
> + ret = vfio_legacy_dma_unmap_one(bcontainer, 0, size, flags, iotlb);
> + if (ret) {
> + return ret;
> + }
Could we introduce an helper to test 'unmap_all' support in the host
kernel ? The result would be something like :
if (unmap_all) {
if (vfio_legacy_has_unmap_all(VFIO_IOMMU_LEGACY(bcontainer))) {
flags = VFIO_DMA_UNMAP_FLAG_ALL;
} else {
/* The unmap ioctl doesn't accept a full 64-bit span. */
Int128 llsize = int128_rshift(int128_2_64(), 1);
...
}
}
Thanks,
C.
> - } else {
> - ret = vfio_legacy_dma_unmap_one(bcontainer, iova, size, iotlb);
> + iova = size;
> + }
> }
>
> - return ret;
> + return vfio_legacy_dma_unmap_one(bcontainer, iova, size, flags, iotlb);
> }
>
> static int vfio_legacy_dma_map(const VFIOContainerBase *bcontainer, hwaddr iova,
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-09-30 15:26 ` Cédric Le Goater
@ 2025-09-30 22:04 ` John Levon
2025-10-01 6:58 ` Cédric Le Goater
2025-10-08 10:17 ` Duan, Zhenzhong
1 sibling, 1 reply; 11+ messages in thread
From: John Levon @ 2025-09-30 22:04 UTC (permalink / raw)
To: Cédric Le Goater
Cc: Zhenzhong Duan, qemu-devel, alex.williamson, eric.auger,
joao.m.martins
On Tue, Sep 30, 2025 at 05:26:59PM +0200, Cédric Le Goater wrote:
> > - }
> > + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
>
> Could we introduce an helper to test 'unmap_all' support in the host
> kernel ? The result would be something like :
>
> if (unmap_all) {
> if (vfio_legacy_has_unmap_all(VFIO_IOMMU_LEGACY(bcontainer))) {
> flags = VFIO_DMA_UNMAP_FLAG_ALL;
> } else {
> /* The unmap ioctl doesn't accept a full 64-bit span. */
> Int128 llsize = int128_rshift(int128_2_64(), 1);
> ...
> }
> }
For reference/consideration, the previous approach taken in the vfio-user
series:
https://lore.kernel.org/qemu-devel/20250219144858.266455-4-john.levon@nutanix.com/
@@ -533,6 +562,11 @@ static bool vfio_legacy_setup(VFIOContainerBase *bcontainer, Error **errp)
vfio_get_info_iova_range(info, bcontainer);
vfio_get_iommu_info_migration(container, info);
+
+ ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
+
+ container->unmap_all_supported = (ret != 0);
(I dropped this particular change as part of getting merged.)
regards
john
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-09-30 22:04 ` John Levon
@ 2025-10-01 6:58 ` Cédric Le Goater
2025-10-08 10:18 ` Duan, Zhenzhong
0 siblings, 1 reply; 11+ messages in thread
From: Cédric Le Goater @ 2025-10-01 6:58 UTC (permalink / raw)
To: John Levon
Cc: Zhenzhong Duan, qemu-devel, alex.williamson, eric.auger,
joao.m.martins
On 10/1/25 00:04, John Levon wrote:
> On Tue, Sep 30, 2025 at 05:26:59PM +0200, Cédric Le Goater wrote:
>
>>> - }
>>> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
>>
>> Could we introduce an helper to test 'unmap_all' support in the host
>> kernel ? The result would be something like :
>>
>> if (unmap_all) {
>> if (vfio_legacy_has_unmap_all(VFIO_IOMMU_LEGACY(bcontainer))) {
>> flags = VFIO_DMA_UNMAP_FLAG_ALL;
>> } else {
>> /* The unmap ioctl doesn't accept a full 64-bit span. */
>> Int128 llsize = int128_rshift(int128_2_64(), 1);
>> ...
>> }
>> }
>
> For reference/consideration, the previous approach taken in the vfio-user
> series:
>
> https://lore.kernel.org/qemu-devel/20250219144858.266455-4-john.levon@nutanix.com/
>
> @@ -533,6 +562,11 @@ static bool vfio_legacy_setup(VFIOContainerBase *bcontainer, Error **errp)
> vfio_get_info_iova_range(info, bcontainer);
>
> vfio_get_iommu_info_migration(container, info);
> +
> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL);
> +
> + container->unmap_all_supported = (ret != 0);
>
> (I dropped this particular change as part of getting merged.)
Yes. I’m reconsidering now.
Should we introduce a VFIOContainerBase attribute/flag 'unmap_all_supported',
set in the vioc->setup handler ?
Thanks,
C.
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-09-30 15:26 ` Cédric Le Goater
2025-09-30 22:04 ` John Levon
@ 2025-10-08 10:17 ` Duan, Zhenzhong
1 sibling, 0 replies; 11+ messages in thread
From: Duan, Zhenzhong @ 2025-10-08 10:17 UTC (permalink / raw)
To: Cédric Le Goater, qemu-devel@nongnu.org
Cc: alex.williamson@redhat.com, eric.auger@redhat.com,
joao.m.martins@oracle.com
>-----Original Message-----
>From: Cédric Le Goater <clg@redhat.com>
>Subject: Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
>
>On 9/24/25 09:02, Zhenzhong Duan wrote:
>> VFIO type1 kernel uAPI supports unmapping whole address space in one call
>> since commit c19650995374 ("vfio/type1: implement unmap all"). use the
>> unmap_all variant whenever it's supported in kernel.
>>
>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
>> ---
>> hw/vfio/container.c | 33 ++++++++++++++++++++-------------
>> 1 file changed, 20 insertions(+), 13 deletions(-)
>>
>> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>> index 030c6d3f89..2e13f04803 100644
>> --- a/hw/vfio/container.c
>> +++ b/hw/vfio/container.c
>> @@ -122,12 +122,12 @@ unmap_exit:
>>
>> static int vfio_legacy_dma_unmap_one(const VFIOContainerBase
>*bcontainer,
>
>Side note for rebase :
>
>I would prefer internal routines of file hw/vfio/container.c,
>which was renamed recently to hw/vfio/container-legacy.c, to
>take a 'VFIOLegacyContainer *container' parameter.
>
>The 'VFIOContainer *bcontainer' parameter should be kept for
>high-level routines that wrap the IOMMU backend implementation.
Sure, will do
>
>> hwaddr iova, ram_addr_t
>size,
>> - IOMMUTLBEntry *iotlb)
>> + uint32_t flags,
>IOMMUTLBEntry *iotlb)
>> {
>> const VFIOContainer *container =
>VFIO_IOMMU_LEGACY(bcontainer);
>> struct vfio_iommu_type1_dma_unmap unmap = {
>> .argsz = sizeof(unmap),
>> - .flags = 0,
>> + .flags = flags,
>> .iova = iova,> .size = size,
>> };
>> @@ -187,25 +187,32 @@ static int vfio_legacy_dma_unmap(const
>VFIOContainerBase *bcontainer,
>> hwaddr iova, ram_addr_t size,
>> IOMMUTLBEntry *iotlb, bool
>unmap_all)
>> {
>> + uint32_t flags = 0;
>> int ret;
>>
>> if (unmap_all) {
>> - /* The unmap ioctl doesn't accept a full 64-bit span. */
>> - Int128 llsize = int128_rshift(int128_2_64(), 1);
>> + const VFIOContainer *container =
>VFIO_IOMMU_LEGACY(bcontainer);
>>
>> - ret = vfio_legacy_dma_unmap_one(bcontainer, 0,
>int128_get64(llsize),
>> - iotlb);
>> + assert(!iova && !size);
>
>The assert deserves an explanation and so probably a new patch.
Sure, will do.
I'd like to move it into core code vfio_listener_region_del().
Thanks
Zhenzhong
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-10-01 6:58 ` Cédric Le Goater
@ 2025-10-08 10:18 ` Duan, Zhenzhong
2025-10-08 13:01 ` Cédric Le Goater
0 siblings, 1 reply; 11+ messages in thread
From: Duan, Zhenzhong @ 2025-10-08 10:18 UTC (permalink / raw)
To: Cédric Le Goater, John Levon
Cc: qemu-devel@nongnu.org, alex.williamson@redhat.com,
eric.auger@redhat.com, joao.m.martins@oracle.com
>-----Original Message-----
>From: Cédric Le Goater <clg@redhat.com>
>Subject: Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
>
>On 10/1/25 00:04, John Levon wrote:
>> On Tue, Sep 30, 2025 at 05:26:59PM +0200, Cédric Le Goater wrote:
>>
>>>> - }
>>>> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION,
>VFIO_UNMAP_ALL);
>>>
>>> Could we introduce an helper to test 'unmap_all' support in the host
>>> kernel ? The result would be something like :
>>>
>>> if (unmap_all) {
>>> if
>(vfio_legacy_has_unmap_all(VFIO_IOMMU_LEGACY(bcontainer))) {
>>> flags = VFIO_DMA_UNMAP_FLAG_ALL;
>>> } else {
>>> /* The unmap ioctl doesn't accept a full 64-bit span. */
>>> Int128 llsize = int128_rshift(int128_2_64(), 1);
>>> ...
>>> }
>>> }
>>
>> For reference/consideration, the previous approach taken in the vfio-user
>> series:
>>
>>
>https://lore.kernel.org/qemu-devel/20250219144858.266455-4-john.levon@
>nutanix.com/
>>
>> @@ -533,6 +562,11 @@ static bool vfio_legacy_setup(VFIOContainerBase
>*bcontainer, Error **errp)
>> vfio_get_info_iova_range(info, bcontainer);
>>
>> vfio_get_iommu_info_migration(container, info);
>> +
>> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION,
>VFIO_UNMAP_ALL);
>> +
>> + container->unmap_all_supported = (ret != 0);
Good suggestion, thanks John.
>>
>> (I dropped this particular change as part of getting merged.)
>Yes. I'm reconsidering now.
>
>Should we introduce a VFIOContainerBase attribute/flag
>'unmap_all_supported',
>set in the vioc->setup handler ?
Do you mean to check bcontainer->unmap_all_supported and do the split in vfio_listener_region_del()?
If only checking it in legacy container, putting it in VFIOLegacyContainer sounds better?
Thanks
Zhenzhong
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-10-08 10:18 ` Duan, Zhenzhong
@ 2025-10-08 13:01 ` Cédric Le Goater
2025-10-08 13:11 ` John Levon
0 siblings, 1 reply; 11+ messages in thread
From: Cédric Le Goater @ 2025-10-08 13:01 UTC (permalink / raw)
To: Duan, Zhenzhong, John Levon
Cc: qemu-devel@nongnu.org, alex.williamson@redhat.com,
eric.auger@redhat.com, joao.m.martins@oracle.com
On 10/8/25 12:18, Duan, Zhenzhong wrote:
>
>
>> -----Original Message-----
>> From: Cédric Le Goater <clg@redhat.com>
>> Subject: Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
>>
>> On 10/1/25 00:04, John Levon wrote:
>>> On Tue, Sep 30, 2025 at 05:26:59PM +0200, Cédric Le Goater wrote:
>>>
>>>>> - }
>>>>> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION,
>> VFIO_UNMAP_ALL);
>>>>
>>>> Could we introduce an helper to test 'unmap_all' support in the host
>>>> kernel ? The result would be something like :
>>>>
>>>> if (unmap_all) {
>>>> if
>> (vfio_legacy_has_unmap_all(VFIO_IOMMU_LEGACY(bcontainer))) {
>>>> flags = VFIO_DMA_UNMAP_FLAG_ALL;
>>>> } else {
>>>> /* The unmap ioctl doesn't accept a full 64-bit span. */
>>>> Int128 llsize = int128_rshift(int128_2_64(), 1);
>>>> ...
>>>> }
>>>> }
>>>
>>> For reference/consideration, the previous approach taken in the vfio-user
>>> series:
>>>
>>>
>> https://lore.kernel.org/qemu-devel/20250219144858.266455-4-john.levon@
>> nutanix.com/
>>>
>>> @@ -533,6 +562,11 @@ static bool vfio_legacy_setup(VFIOContainerBase
>> *bcontainer, Error **errp)
>>> vfio_get_info_iova_range(info, bcontainer);
>>>
>>> vfio_get_iommu_info_migration(container, info);
>>> +
>>> + ret = ioctl(container->fd, VFIO_CHECK_EXTENSION,
>> VFIO_UNMAP_ALL);
>>> +
>>> + container->unmap_all_supported = (ret != 0);
>
> Good suggestion, thanks John.
>
>>>
>>> (I dropped this particular change as part of getting merged.)
>> Yes. I'm reconsidering now.
>>
>> Should we introduce a VFIOContainerBase attribute/flag
>> 'unmap_all_supported',
>> set in the vioc->setup handler ?
>
> Do you mean to check bcontainer->unmap_all_supported and do the split in vfio_listener_region_del()?
>
> If only checking it in legacy container, putting it in VFIOLegacyContainer sounds better?
It depends if vfio-user needs it too.
C.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-10-08 13:01 ` Cédric Le Goater
@ 2025-10-08 13:11 ` John Levon
2025-10-08 13:26 ` Cédric Le Goater
0 siblings, 1 reply; 11+ messages in thread
From: John Levon @ 2025-10-08 13:11 UTC (permalink / raw)
To: Cédric Le Goater
Cc: Duan, Zhenzhong, qemu-devel@nongnu.org,
alex.williamson@redhat.com, eric.auger@redhat.com,
joao.m.martins@oracle.com
On Wed, Oct 08, 2025 at 03:01:34PM +0200, Cédric Le Goater wrote:
> > > Should we introduce a VFIOContainerBase attribute/flag
> > > 'unmap_all_supported',
> > > set in the vioc->setup handler ?
> >
> > Do you mean to check bcontainer->unmap_all_supported and do the split in vfio_listener_region_del()?
> >
> > If only checking it in legacy container, putting it in VFIOLegacyContainer sounds better?
>
> It depends if vfio-user needs it too.
vfio-user always supports this flag.
regards
john
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] vfio/container: Support unmap all in one ioctl()
2025-10-08 13:11 ` John Levon
@ 2025-10-08 13:26 ` Cédric Le Goater
0 siblings, 0 replies; 11+ messages in thread
From: Cédric Le Goater @ 2025-10-08 13:26 UTC (permalink / raw)
To: John Levon
Cc: Duan, Zhenzhong, qemu-devel@nongnu.org,
alex.williamson@redhat.com, eric.auger@redhat.com,
joao.m.martins@oracle.com
On 10/8/25 15:11, John Levon wrote:
> On Wed, Oct 08, 2025 at 03:01:34PM +0200, Cédric Le Goater wrote:
>
>>>> Should we introduce a VFIOContainerBase attribute/flag
>>>> 'unmap_all_supported',
>>>> set in the vioc->setup handler ?
>>>
>>> Do you mean to check bcontainer->unmap_all_supported and do the split in vfio_listener_region_del()?
>>>
>>> If only checking it in legacy container, putting it in VFIOLegacyContainer sounds better?
>>
>> It depends if vfio-user needs it too.
>
> vfio-user always supports this flag.
In that case, putting it in VFIOLegacyContainer sounds better.
Thanks,
C.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-10-08 13:28 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-24 7:02 [PATCH 0/2] Optimize unmap_all with one ioctl() Zhenzhong Duan
2025-09-24 7:02 ` [PATCH 1/2] vfio/container: Support unmap all in " Zhenzhong Duan
2025-09-30 15:26 ` Cédric Le Goater
2025-09-30 22:04 ` John Levon
2025-10-01 6:58 ` Cédric Le Goater
2025-10-08 10:18 ` Duan, Zhenzhong
2025-10-08 13:01 ` Cédric Le Goater
2025-10-08 13:11 ` John Levon
2025-10-08 13:26 ` Cédric Le Goater
2025-10-08 10:17 ` Duan, Zhenzhong
2025-09-24 7:02 ` [PATCH 2/2] vfio/iommufd: " Zhenzhong Duan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).