From: "Jan Beulich" <JBeulich@suse.com>
To: Paul Durrant <paul.durrant@citrix.com>
Cc: Kevin Tian <kevin.tian@intel.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Wei Liu <wei.liu2@citrix.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
George Dunlap <George.Dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
Julien Grall <julien.grall@arm.com>,
Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
xen-devel <xen-devel@lists.xenproject.org>,
Brian Woods <brian.woods@amd.com>,
Roger Pau Monne <roger.pau@citrix.com>
Subject: Re: [PATCH v3 3/4] iommu: elide flushing for higher order map/unmap operations
Date: Thu, 06 Dec 2018 08:08:02 -0700 [thread overview]
Message-ID: <5C093B520200007800203B97@prv1-mh.provo.novell.com> (raw)
In-Reply-To: <20181205112924.36470-4-paul.durrant@citrix.com>
>>> On 05.12.18 at 12:29, <paul.durrant@citrix.com> wrote:
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -865,11 +865,15 @@ int xenmem_add_to_physmap(struct domain *d, struct xen_add_to_physmap *xatp,
>
> this_cpu(iommu_dont_flush_iotlb) = 0;
>
> - ret = iommu_flush(d, _dfn(xatp->idx - done), done);
> + ret = iommu_iotlb_flush(d, _dfn(xatp->idx - done), done,
> + IOMMU_FLUSHF_added |
> + IOMMU_FLUSHF_modified);
No need to split these last two lines afaict, nor ...
> if ( unlikely(ret) && rc >= 0 )
> rc = ret;
>
> - ret = iommu_flush(d, _dfn(xatp->gpfn - done), done);
> + ret = iommu_iotlb_flush(d, _dfn(xatp->gpfn - done), done,
> + IOMMU_FLUSHF_added |
> + IOMMU_FLUSHF_modified);
... these.
> @@ -573,18 +589,17 @@ int amd_iommu_map_page(struct domain *d, dfn_t dfn, mfn_t mfn,
> }
>
> /* Install 4k mapping */
> - need_flush = set_iommu_pte_present(pt_mfn[1], dfn_x(dfn), mfn_x(mfn), 1,
> - !!(flags & IOMMUF_writable),
> - !!(flags & IOMMUF_readable));
> -
> - if ( need_flush )
> - amd_iommu_flush_pages(d, dfn_x(dfn), 0);
> + *flush_flags |= set_iommu_pte_present(pt_mfn[1], dfn_x(dfn), mfn_x(mfn),
> + 1, !!(flags & IOMMUF_writable),
> + !!(flags & IOMMUF_readable));
I don't think the !! here need retaining.
> @@ -235,6 +236,10 @@ void __hwdom_init iommu_hwdom_init(struct domain *d)
> process_pending_softirqs();
> }
>
> + /* Use while-break to avoid compiler warning */
> + while ( !iommu_iotlb_flush_all(d, flush_flags) )
> + break;
With just the "break;" as body, what's the ! good for?
> @@ -320,7 +326,8 @@ int iommu_legacy_map(struct domain *d, dfn_t dfn, mfn_t mfn,
> for ( i = 0; i < (1ul << page_order); i++ )
> {
> rc = hd->platform_ops->map_page(d, dfn_add(dfn, i),
> - mfn_add(mfn, i), flags);
> + mfn_add(mfn, i), flags,
> + flush_flags);
Again no need for two lines here as it seems.
> @@ -345,7 +353,20 @@ int iommu_legacy_map(struct domain *d, dfn_t dfn, mfn_t mfn,
> return rc;
> }
>
> -int iommu_legacy_unmap(struct domain *d, dfn_t dfn, unsigned int page_order)
> +int iommu_legacy_map(struct domain *d, dfn_t dfn, mfn_t mfn,
> + unsigned int page_order, unsigned int flags)
> +{
> + unsigned int flush_flags = 0;
> + int rc = iommu_map(d, dfn, mfn, page_order, flags, &flush_flags);
> +
> + if ( !rc && !this_cpu(iommu_dont_flush_iotlb) )
> + rc = iommu_iotlb_flush(d, dfn, (1u << page_order), flush_flags);
The question was raised in a different context (but iirc this same
series) already: Is it correct to skip flushing when failure occurred
on other than the first page of a set? There's no rollback afaict,
and even if there was the transiently available mappings would
then still need purging. Same on the unmap side then. (Note that
this is different from the arch_iommu_populate_page_table()
case, where I/O can't be initiated yet by the guest.)
> @@ -241,8 +245,10 @@ void __hwdom_init arch_iommu_hwdom_init(struct domain *d)
> if ( paging_mode_translate(d) )
> rc = set_identity_p2m_entry(d, pfn, p2m_access_rw, 0);
> else
> - rc = iommu_legacy_map(d, _dfn(pfn), _mfn(pfn), PAGE_ORDER_4K,
> - IOMMUF_readable | IOMMUF_writable);
> + rc = iommu_map(d, _dfn(pfn), _mfn(pfn), PAGE_ORDER_4K,
> + IOMMUF_readable | IOMMUF_writable,
> + &flush_flags);
Again overly aggressive line wrapping?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-12-06 15:08 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-05 11:29 [PATCH v3 0/4] iommu improvements Paul Durrant
2018-12-05 11:29 ` [PATCH v3 1/4] amd-iommu: add flush iommu_ops Paul Durrant
2018-12-05 11:46 ` Jan Beulich
2018-12-05 12:56 ` Paul Durrant
2018-12-05 12:58 ` Paul Durrant
2018-12-05 13:13 ` Jan Beulich
2018-12-05 13:15 ` Paul Durrant
2018-12-05 13:47 ` Jan Beulich
2018-12-05 11:29 ` [PATCH v3 2/4] iommu: rename wrapper functions Paul Durrant
2018-12-06 14:44 ` Jan Beulich
2018-12-06 15:00 ` Andrew Cooper
2018-12-05 11:29 ` [PATCH v3 3/4] iommu: elide flushing for higher order map/unmap operations Paul Durrant
2018-12-06 15:08 ` Jan Beulich [this message]
2018-12-06 15:11 ` Paul Durrant
2018-12-05 11:29 ` [PATCH v3 4/4] x86/mm/p2m: stop checking for IOMMU shared page tables in mmio_order() Paul Durrant
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=5C093B520200007800203B97@prv1-mh.provo.novell.com \
--to=jbeulich@suse.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=brian.woods@amd.com \
--cc=julien.grall@arm.com \
--cc=kevin.tian@intel.com \
--cc=konrad.wilk@oracle.com \
--cc=paul.durrant@citrix.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=suravee.suthikulpanit@amd.com \
--cc=tim@xen.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.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 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).