[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] memory: Optimize replay of guest mapping
From: |
Jason Wang |
Subject: |
Re: [PATCH] memory: Optimize replay of guest mapping |
Date: |
Tue, 14 Feb 2023 14:25:18 +0800 |
On Tue, Feb 14, 2023 at 11:43 AM Zhenzhong Duan
<zhenzhong.duan@intel.com> wrote:
>
> On x86, there are two notifiers registered due to vtd-ir memory region
> splitting the whole address space. During replay of the address space
> for each notifier, the whole address space is scanned which is
> unnecessory.
>
> We only need to scan the space belong to notifier montiored space.
>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
> Tested only on x86 with a net card passed to guest, ping/ssh pass.
>
> hw/i386/intel_iommu.c | 2 +-
> softmmu/memory.c | 3 +--
> 2 files changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index 98a5c304a7d7..6b1de80e8573 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -3831,7 +3831,7 @@ static void vtd_iommu_replay(IOMMUMemoryRegion
> *iommu_mr, IOMMUNotifier *n)
> .domain_id = vtd_get_domain_id(s, &ce, vtd_as->pasid),
> };
>
> - vtd_page_walk(s, &ce, 0, ~0ULL, &info, vtd_as->pasid);
> + vtd_page_walk(s, &ce, n->start, n->end, &info, vtd_as->pasid);
> }
> } else {
> trace_vtd_replay_ce_invalid(bus_n, PCI_SLOT(vtd_as->devfn),
> diff --git a/softmmu/memory.c b/softmmu/memory.c
> index 9d64efca269b..f096716e6e78 100644
> --- a/softmmu/memory.c
> +++ b/softmmu/memory.c
> @@ -1923,7 +1923,6 @@ uint64_t
> memory_region_iommu_get_min_page_size(IOMMUMemoryRegion *iommu_mr)
>
> void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier
> *n)
> {
> - MemoryRegion *mr = MEMORY_REGION(iommu_mr);
> IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr);
> hwaddr addr, granularity;
> IOMMUTLBEntry iotlb;
> @@ -1936,7 +1935,7 @@ void memory_region_iommu_replay(IOMMUMemoryRegion
> *iommu_mr, IOMMUNotifier *n)
>
> granularity = memory_region_iommu_get_min_page_size(iommu_mr);
>
> - for (addr = 0; addr < memory_region_size(mr); addr += granularity) {
> + for (addr = n->start; addr < n->end; addr += granularity) {
Is [n->start, n->end] guaranteed to be the subset of memory_region_size(mr)?
Thanks
> iotlb = imrc->translate(iommu_mr, addr, IOMMU_NONE, n->iommu_idx);
> if (iotlb.perm != IOMMU_NONE) {
> n->notify(n, &iotlb);
> --
> 2.25.1
>
>