xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Xu, Quan" <quan.xu@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: "Tian, Kevin" <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>,
	"Wu, Feng" <feng.wu@intel.com>
Subject: Re: [PATCH v4 01/10] vt-d: fix the IOMMU flush issue
Date: Thu, 12 May 2016 13:29:04 +0000	[thread overview]
Message-ID: <945CA011AD5F084CBEA3E851C0AB28894B8AD99D@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <5734608E02000078000EAD2B@prv-mh.provo.novell.com>

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,
....




> >> > @@ -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.

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.


Quan










_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

  reply	other threads:[~2016-05-12 13:29 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 [this message]
2016-05-12 13:37           ` Jan Beulich
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=945CA011AD5F084CBEA3E851C0AB28894B8AD99D@SHSMSX101.ccr.corp.intel.com \
    --to=quan.xu@intel.com \
    --cc=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=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).