From: Yan Zhao <yan.y.zhao@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Auger Eric <eric.auger@redhat.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
Peter Xu <peterx@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] memory: do not do out of bound notification
Date: Thu, 20 Jun 2019 06:57:53 -0400 [thread overview]
Message-ID: <20190620105752.GD9303@joy-OptiPlex-7040> (raw)
In-Reply-To: <6829b139-3eab-449e-04d6-07f1e381316d@redhat.com>
On Thu, Jun 20, 2019 at 04:35:29PM +0800, Paolo Bonzini wrote:
> On 20/06/19 06:02, Peter Xu wrote:
> > Seems workable, to be explicit - we can even cut it into chunks with
> > different size to be efficient.
>
> Yes, this is not hard (completely untested):
>
> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index 44b1231157..541538bc6c 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -3388,39 +3388,34 @@ static void vtd_address_space_unmap(VTDAddressSpace *as, IOMMUNotifier *n)
> }
>
> assert(start <= end);
> - size = end - start;
> + while (end > start) {
> + size = end - start;
> + /* Only keep the lowest bit of either size or start. */
> + size = MIN(size & -size, start & -start);
> + /* Should not happen, but limit to address width too just in case */
> + size = MIN(size, 1ULL << s->aw_bits);
>
> - if (ctpop64(size) != 1) {
> - /*
> - * This size cannot format a correct mask. Let's enlarge it to
> - * suite the minimum available mask.
> - */
> - int n = 64 - clz64(size);
> - if (n > s->aw_bits) {
> - /* should not happen, but in case it happens, limit it */
> - n = s->aw_bits;
> - }
> - size = 1ULL << n;
> - }
> + assert((start & (size - 1)) == 0);
>
> - entry.target_as = &address_space_memory;
> - /* Adjust iova for the size */
> - entry.iova = n->start & ~(size - 1);
> - /* This field is meaningless for unmap */
> - entry.translated_addr = 0;
> - entry.perm = IOMMU_NONE;
> - entry.addr_mask = size - 1;
> + entry.target_as = &address_space_memory;
> + entry.iova = start;
> + /* This field is meaningless for unmap */
> + entry.translated_addr = 0;
> + entry.perm = IOMMU_NONE;
> + entry.addr_mask = size - 1;
>
> - trace_vtd_as_unmap_whole(pci_bus_num(as->bus),
> - VTD_PCI_SLOT(as->devfn),
> - VTD_PCI_FUNC(as->devfn),
> - entry.iova, size);
> + trace_vtd_as_unmap_whole(pci_bus_num(as->bus),
> + VTD_PCI_SLOT(as->devfn),
> + VTD_PCI_FUNC(as->devfn),
> + entry.iova, size);
>
> - map.iova = entry.iova;
> - map.size = entry.addr_mask;
> - iova_tree_remove(as->iova_tree, &map);
> + map.iova = entry.iova;
> + map.size = entry.addr_mask;
> + iova_tree_remove(as->iova_tree, &map);
>
> - memory_region_notify_one(n, &entry);
> + memory_region_notify_one(n, &entry);
> + start += size;
> + }
> }
>
> static void vtd_address_space_unmap_all(IntelIOMMUState *s)
>
>
> Yan,
>
> if something like this works for you, let me know and I will submit it
> as a proper patch.
>
> Paolo
hi Paolo
Thanks and I'll try it tomorrow and let you know the result.
But may I know why it cannot simply be like below?
Thanks
Yan
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index b0d8a1c..2956db6 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -3374,7 +3374,6 @@ static void vtd_address_space_unmap(VTDAddressSpace *as, IOMMUNotifier *n)
IntelIOMMUState *s = as->iommu_state;
DMAMap map;
/*
* Note: all the codes in this function has a assumption that IOVA
* bits are no more than VTD_MGAW bits (which is restricted by
@@ -3392,23 +3391,8 @@ static void vtd_address_space_unmap(VTDAddressSpace *as, IOMMUNotifier *n)
assert(start <= end);
size = end - start;
- if (ctpop64(size) != 1) {
- /*
- * This size cannot format a correct mask. Let's enlarge it to
- * suite the minimum available mask.
- */
- int n = 64 - clz64(size);
- if (n > s->aw_bits) {
- /* should not happen, but in case it happens, limit it */
- n = s->aw_bits;
- }
- size = 1ULL << n;
- }
-
-
entry.target_as = &address_space_memory;
- /* Adjust iova for the size */
- entry.iova = n->start & ~(size - 1);
+ entry.iova = n->start;
/* This field is meaningless for unmap */
entry.translated_addr = 0;
entry.perm = IOMMU_NONE;
next prev parent reply other threads:[~2019-06-20 11:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-19 8:49 [Qemu-devel] [PATCH] memory: do not do out of bound notification Yan Zhao
2019-06-19 13:17 ` Auger Eric
2019-06-20 1:46 ` Yan Zhao
2019-06-20 4:02 ` Peter Xu
2019-06-20 4:14 ` Yan Zhao
2019-06-20 8:14 ` Peter Xu
2019-06-20 8:13 ` Yan Zhao
2019-06-20 8:35 ` Paolo Bonzini
2019-06-20 10:57 ` Yan Zhao [this message]
2019-06-20 12:04 ` Paolo Bonzini
2019-06-20 12:59 ` Peter Xu
2019-06-20 13:04 ` Peter Xu
2019-06-24 5:22 ` Yan Zhao
2019-06-24 6:14 ` Peter Xu
2019-06-20 13:14 ` Paolo Bonzini
2019-06-21 2:36 ` Peter Xu
2019-06-21 7:57 ` Yan Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190620105752.GD9303@joy-OptiPlex-7040 \
--to=yan.y.zhao@intel.com \
--cc=eric.auger@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.