From: "Jan Beulich" <JBeulich@suse.com>
To: Quan Xu <quan.xu@intel.com>
Cc: Kevin Tian <kevin.tian@intel.com>, Keir Fraser <keir@xen.org>,
AndrewCooper <andrew.cooper3@citrix.com>,
"dario.faggioli@citrix.com" <dario.faggioli@citrix.com>,
"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
Feng Wu <feng.wu@intel.com>
Subject: Re: [PATCH v4 01/10] vt-d: fix the IOMMU flush issue
Date: Thu, 12 May 2016 07:37:37 -0600 [thread overview]
Message-ID: <5734A34102000078000EAF4F@prv-mh.provo.novell.com> (raw)
In-Reply-To: <945CA011AD5F084CBEA3E851C0AB28894B8AD99D@SHSMSX101.ccr.corp.intel.com>
>>> On 12.05.16 at 15:29, <quan.xu@intel.com> wrote:
> On May 12, 2016 4:53 PM, Jan Beulich <JBeulich@suse.com> wrote:
>> >>> On 12.05.16 at 09:50, <quan.xu@intel.com> wrote:
>> > On May 10, 2016 12:10 AM, Jan Beulich <JBeulich@suse.com> wrote:
>> >> >>> On 06.05.16 at 10:54, <quan.xu@intel.com> wrote:
>> >> > -static void intel_iommu_iotlb_flush(struct domain *d, unsigned
>> >> > long gfn, unsigned int page_count)
>> >> > +static void iommu_flush_iotlb_page(struct domain *d, unsigned long
>> gfn,
>> >> > + unsigned int page_count)
>> >>
>> >> The new name suggests just one page. Please use e.g.
>> >> iommu_flush_iotlb_pages() instead.
>> >>
>> >
>> > Make sense.
>> >
>> >> > {
>> >> > - __intel_iommu_iotlb_flush(d, gfn, 1, page_count);
>> >> > + iommu_flush_iotlb(d, gfn, 1, page_count);
>> >> > }
>> >>
>> >> But of course the question is whether having this wrapper is useful
>> >> in the first place,
>> >
>> >
>> > This wrapper assumes the 'dma_old_pte_present' is '1', but in another
>> > caller intel_iommu_map_page(), i.e.
>> >
>> >
>> > intel_iommu_map_page()
>> > {
>> > ...
>> > if ( !this_cpu(iommu_dont_flush_iotlb) )
>> > iommu_flush_iotlb(d, gfn, dma_pte_present(old), 1);
>> > ...
>> > }
>> >
>> >
>> > the 'dma_old_pte_present' is not sure.
>>
>> I'm sorry, but you're looking at this backwards: I suggested to remove the
>> wrapper, not to move any check into iommu_flush_iotlb().
>> Removing the wrapper simply means to move the passing of the hard coded 1
>> into the current callers of that wrapper.
>>
>
> A little bit confused.
> Check one thing, do the wrappers refer to iommu_flush_iotlb_page() and
> iommu_flush_iotlb_all() ?
>
> If yes, we can't ignore another thing:
>
> These two wrappers are also initialized for 2 .callbacks at the bottom of
> this file:
>
> ....
> .iotlb_flush = iommu_flush_iotlb_pages,
> .iotlb_flush_all = iommu_flush_iotlb_all,
> ....
Ah, good point. With the renaming going on I didn't realize these
are used here. So in fact they're not just wrappers. Please disregard
my respective comments then.
>> >> > @@ -1391,13 +1399,19 @@ int domain_context_mapping_one(
>> >> > spin_unlock(&iommu->lock);
>> >> >
>> >> > /* Context entry was previously non-present (with domid 0). */
>> >> > - if ( iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) | devfn,
>> >> > - DMA_CCMD_MASK_NOBIT, 1) )
>> >> > - iommu_flush_write_buffer(iommu);
>> >> > - else
>> >> > + rc = iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) |
>> devfn,
>> >> > + DMA_CCMD_MASK_NOBIT, 1);
>> >> > +
>> >> > + if ( !rc )
>> >> > {
>> >> > int flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
>> >> > - iommu_flush_iotlb_dsi(iommu, 0, 1, flush_dev_iotlb);
>> >> > + rc = iommu_flush_iotlb_dsi(iommu, 0, 1, flush_dev_iotlb);
>> >>
>> >> Please take the opportunity and add the missing blank line (between
>> >> declaration(s) and statement(s) in cases like this.
>> >>
>> >> > + }
>> >> > +
>> >> > + if ( rc > 0 )
>> >>
>> >> Can iommu_flush_context_device() return a positive value? If so, the
>> >> logic is now likely wrong. If not (which is what I assume) I'd like
>> >> to suggest adding a respective ASSERT() (even if only to document the
>> >> fact). Or alternatively this
>> >> if() could move into the immediately preceding one.
>> >
>> > Check it again. iommu_flush_context_device() can return a positive value.
>> > [...]
>> > Could you tell me why the logic is now likely wrong? I will fix it first.
>>
>> With
>>
>> rc = iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) | devfn,
>> DMA_CCMD_MASK_NOBIT, 1);
>>
>> if ( !rc )
>> {
>> int flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0;
>> rc = iommu_flush_iotlb_dsi(iommu, 0, 1, flush_dev_iotlb);
>> }
>>
>> if ( rc > 0 )
>> {
>> iommu_flush_write_buffer(iommu);
>> rc = 0;
>> }
>>
>> it seems pretty clear that you won't call iommu_flush_iotlb_dsi() if
>> iommu_flush_context_device() returned 1, which doesn't look like what is
>> wanted at the first glance. But I may be wrong, hence the "likely" in my
> earlier
>> reply.
>>
>
> Oh, this was on purpose.
>
> If iommu_flush_context_device() returned 1, the iommu_flush_iotlb_dsi()
> returned 1 too.
> As both flush_context_qi() and flush_iotlb_qi () are the same at the
> beginning of the functions.
Such implications need to be commented on, so readers (like me)
don't assume brokenness.
> One concern is if iommu_flush_context_device() is failed, then we won't call
> iommu_flush_iotlb_dsi(), which is not best effort to flush.
Indeed.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-05-12 13:37 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-06 8:54 [PATCH v4 00/10] Check VT-d Device-TLB flush error Quan Xu
2016-05-06 8:54 ` [PATCH v4 01/10] vt-d: fix the IOMMU flush issue Quan Xu
2016-05-09 16:09 ` Jan Beulich
2016-05-12 7:50 ` Xu, Quan
2016-05-12 8:53 ` Jan Beulich
2016-05-12 13:29 ` Xu, Quan
2016-05-12 13:37 ` Jan Beulich [this message]
2016-05-12 13:43 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 02/10] IOMMU: handle IOMMU mapping and unmapping failures Quan Xu
2016-05-09 16:13 ` Jan Beulich
2016-05-10 3:41 ` Xu, Quan
2016-05-10 6:53 ` Jan Beulich
2016-05-10 7:53 ` Xu, Quan
2016-05-10 8:02 ` Jan Beulich
2016-05-10 8:20 ` Xu, Quan
2016-05-10 8:26 ` Jan Beulich
2016-05-12 14:28 ` Xu, Quan
2016-05-12 15:06 ` Jan Beulich
2016-05-13 8:04 ` Xu, Quan
2016-05-13 9:08 ` Jan Beulich
2016-05-13 9:20 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 03/10] IOMMU/MMU: enhance the call trees of IOMMU unmapping and mapping Quan Xu
2016-05-10 8:44 ` Jan Beulich
2016-05-10 14:45 ` George Dunlap
2016-05-10 14:59 ` George Dunlap
2016-05-11 2:26 ` Xu, Quan
2016-05-11 8:45 ` George Dunlap
2016-05-11 8:58 ` Xu, Quan
2016-05-10 15:02 ` Jan Beulich
2016-05-11 2:29 ` Xu, Quan
2016-05-11 3:39 ` Xu, Quan
2016-05-11 7:02 ` Jan Beulich
2016-05-06 8:54 ` [PATCH v4 04/10] vt-d: propagate IOMMU Device-TLB flush error up to IOMMU unmapping Quan Xu
2016-05-10 8:50 ` Jan Beulich
2016-05-11 3:49 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 05/10] vt-d: propagate IOMMU Device-TLB flush error up to IOMMU mapping Quan Xu
2016-05-06 8:54 ` [PATCH v4 06/10] IOMMU/MMU: propagate IOMMU Device-TLB flush error up to iommu_iotlb_flush{, _all} (top level ones) Quan Xu
2016-05-10 9:04 ` Jan Beulich
2016-05-11 5:52 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 07/10] IOMMU: propagate IOMMU Device-TLB flush error up to iommu_iotlb_flush{, _all} (leaf ones) Quan Xu
2016-05-10 9:06 ` Jan Beulich
2016-05-11 6:47 ` Xu, Quan
2016-05-11 7:06 ` Jan Beulich
2016-05-11 7:12 ` Xu, Quan
2016-05-11 7:16 ` Jan Beulich
2016-05-11 7:20 ` Xu, Quan
2016-05-11 7:37 ` Jan Beulich
2016-05-06 8:54 ` [PATCH v4 08/10] vt-d/ept: propagate IOMMU Device-TLB flush error up to EPT update Quan Xu
2016-05-10 9:09 ` Jan Beulich
2016-05-10 14:58 ` George Dunlap
2016-05-10 15:04 ` Jan Beulich
2016-05-11 7:25 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 09/10] IOMMU: propagate IOMMU Device-TLB flush error up to IOMMU suspending Quan Xu
2016-05-10 9:24 ` Jan Beulich
2016-05-13 3:39 ` Xu, Quan
2016-05-13 6:16 ` Jan Beulich
2016-05-13 6:27 ` Xu, Quan
2016-05-06 8:54 ` [PATCH v4 10/10] vt-d: propagate error up to ME phantom function mapping and unmapping Quan Xu
2016-05-10 9:29 ` Jan Beulich
2016-05-11 8:35 ` Xu, Quan
2016-05-11 9:07 ` Jan Beulich
2016-05-12 5:16 ` Xu, Quan
2016-05-12 8:44 ` Jan Beulich
2016-05-12 9:02 ` Xu, Quan
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=5734A34102000078000EAF4F@prv-mh.provo.novell.com \
--to=jbeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=dario.faggioli@citrix.com \
--cc=feng.wu@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=quan.xu@intel.com \
--cc=xen-devel@lists.xen.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).