Hi Zhenzhong, On 6/4/25 7:50 AM, Duan, Zhenzhong wrote: > Hi Eric, > >> -----Original Message----- >> From: Eric Auger <eric.au...@redhat.com> >> Sent: Tuesday, June 3, 2025 8:21 PM >> To: Duan, Zhenzhong <zhenzhong.d...@intel.com>; qemu-devel@nongnu.org >> Cc: alex.william...@redhat.com; c...@redhat.com; m...@redhat.com; >> jasow...@redhat.com; pet...@redhat.com; ddut...@redhat.com; >> j...@nvidia.com; nicol...@nvidia.com; shameerali.kolothum.th...@huawei.com; >> joao.m.mart...@oracle.com; clement.mathieu--d...@eviden.com; Tian, Kevin >> <kevin.t...@intel.com>; Liu, Yi L <yi.l....@intel.com>; Peng, Chao P >> <chao.p.p...@intel.com> >> Subject: Re: [PATCH v2 1/4] backends/iommufd: Add a helper to invalidate >> user- >> managed HWPT >> >> Hi Zhenzhong, >> >> On 5/30/25 11:35 AM, Zhenzhong Duan wrote: >>> This helper passes cache invalidation request from guest to invalidate >>> stage-1 page table cache in host hardware. >>> >>> Signed-off-by: Nicolin Chen <nicol...@nvidia.com> >>> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> >>> --- >>> include/system/iommufd.h | 4 ++++ >>> backends/iommufd.c | 36 ++++++++++++++++++++++++++++++++++++ >>> backends/trace-events | 1 + >>> 3 files changed, 41 insertions(+) >>> >>> diff --git a/include/system/iommufd.h b/include/system/iommufd.h >>> index cbab75bfbf..83ab8e1e4c 100644 >>> --- a/include/system/iommufd.h >>> +++ b/include/system/iommufd.h >>> @@ -61,6 +61,10 @@ bool >> iommufd_backend_get_dirty_bitmap(IOMMUFDBackend *be, uint32_t hwpt_id, >>> uint64_t iova, ram_addr_t size, >>> uint64_t page_size, uint64_t *data, >>> Error **errp); >>> +bool iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t id, >>> + uint32_t data_type, uint32_t >>> entry_len, >>> + uint32_t *entry_num, void *data, >>> + Error **errp); >>> >>> #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD >> TYPE_HOST_IOMMU_DEVICE "-iommufd" >>> #endif >>> diff --git a/backends/iommufd.c b/backends/iommufd.c >>> index b73f75cd0b..8bcdb60fe7 100644 >>> --- a/backends/iommufd.c >>> +++ b/backends/iommufd.c >>> @@ -311,6 +311,42 @@ bool >> iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, >>> return true; >>> } >>> >>> +bool iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t id, >>> + uint32_t data_type, uint32_t >>> entry_len, >>> + uint32_t *entry_num, void *data, >>> + Error **errp) >>> +{ >>> + int ret, fd = be->fd; >>> + uint32_t total_entries = *entry_num; >>> + struct iommu_hwpt_invalidate cache = { >>> + .size = sizeof(cache), >>> + .hwpt_id = id, >>> + .data_type = data_type, >>> + .entry_len = entry_len, >>> + .entry_num = total_entries, >>> + .data_uptr = (uintptr_t)data, >>> + }; >>> + >>> + ret = ioctl(fd, IOMMU_HWPT_INVALIDATE, &cache); >>> + trace_iommufd_backend_invalidate_cache(fd, id, data_type, entry_len, >>> + total_entries, cache.entry_num, >>> + (uintptr_t)data, ret ? errno : >>> 0); >>> + *entry_num = cache.entry_num; >>> + >>> + if (ret) { >>> + error_setg_errno(errp, errno, "IOMMU_HWPT_INVALIDATE failed:" >>> + " total %d entries, processed %d entries", >>> + total_entries, cache.entry_num); >>> + } else if (total_entries != cache.entry_num) { >>> + error_setg(errp, "IOMMU_HWPT_INVALIDATE succeed but with >> unprocessed" >>> + " entries: total %d entries, processed %d >>> entries." >>> + " Kernel BUG?!", total_entries, cache.entry_num); >> Can this happen? Isn't it a failure case? > It shouldn't happen except kernel has a bug. It's a failure case, so false is > returned. OK. I missed it was an error case.
Eric > > Thanks > Zhenzhong > >> Besides >> Reviewed-by: Eric Auger <eric.au...@redhat.com> >> >> >> Eric >>> + return false; >>> + } >>> + >>> + return !ret; >>> +} >>> + >>> static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error >> **errp) >>> { >>> HostIOMMUDeviceCaps *caps = &hiod->caps; >>> diff --git a/backends/trace-events b/backends/trace-events >>> index 40811a3162..7278214ea5 100644 >>> --- a/backends/trace-events >>> +++ b/backends/trace-events >>> @@ -18,3 +18,4 @@ iommufd_backend_alloc_hwpt(int iommufd, uint32_t >> dev_id, uint32_t pt_id, uint32_ >>> iommufd_backend_free_id(int iommufd, uint32_t id, int ret) " iommufd=%d >> id=%d (%d)" >>> iommufd_backend_set_dirty(int iommufd, uint32_t hwpt_id, bool start, int >>> ret) >> " iommufd=%d hwpt=%u enable=%d (%d)" >>> iommufd_backend_get_dirty_bitmap(int iommufd, uint32_t hwpt_id, uint64_t >> iova, uint64_t size, uint64_t page_size, int ret) " iommufd=%d hwpt=%u >> iova=0x%"PRIx64" size=0x%"PRIx64" page_size=0x%"PRIx64" (%d)" >>> +iommufd_backend_invalidate_cache(int iommufd, uint32_t id, uint32_t >> data_type, uint32_t entry_len, uint32_t entry_num, uint32_t done_num, >> uint64_t >> data_ptr, int ret) " iommufd=%d id=%u data_type=%u entry_len=%u >> entry_num=%u done_num=%u data_ptr=0x%"PRIx64" (%d)"