linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Sinan Kaya <okaya@codeaurora.org>
Cc: Linux PCI <linux-pci@vger.kernel.org>, iommu@lists.linux-foundation.org
Subject: Re: [RFC] PCI ACS Flags Clarification
Date: Wed, 5 Apr 2017 12:57:33 -0600	[thread overview]
Message-ID: <20170405125733.2235e6e6@t450s.home> (raw)
In-Reply-To: <615834cc-37d2-afd4-d093-23fc9e33f5d7@codeaurora.org>

On Wed, 5 Apr 2017 09:51:06 -0400
Sinan Kaya <okaya@codeaurora.org> wrote:

> Hi Alex,
> 
> Thank you very much for the detailed explanation.
> 
> On 4/4/2017 3:39 PM, Alex Williamson wrote:
> > On Tue, 4 Apr 2017 14:47:58 -0400
> > Sinan Kaya <okaya@codeaurora.org> wrote:
> >   
> [cut]
> 
> >> The requirement is to have an 
> >> 1. ACS capability with PCI_ACS_SV if p2p is not supported
> >> 2. ACS capability with PCI_ACS_SV|PCI_ACS_RR | PCI_ACS_CR |
> >>   PCI_ACS_UF if p2p is supported.
> >>
> >> Did I get this right?  
> >   
> 
> I'm looking for sanity check on OS requirements. According to the PCIE spec,
> ACS itself is optional. However, Linux requires ACS capability. I want to
> make sure that we are satisfying the Linux requirements here.

This is like saying Linux requires ACPI, it's simply not true.  ACS is
a PCIe spec defined feature which gives us a standard mechanism of
determining if a device is DMA isolated within a PCIe topology.  For
those that do not implement the standard, we have numerous quirks
implementing platform specific mechanism to provide the equivalent
behavior.  Even this device isolation is not required by Linux, except
for the use case of userspace drivers, where we make the incredibly
reasonable requirement (IMO) that we cannot mix devices which are not
isolated from one another between kernel and user or one user and
another.
 
> I also agree that spec should be the guide. Maybe, a combination of spec+linux
> is the right answer.
> 
> > I'd suggest following the spec, not the code, that way you always have a
> > case for how you interpret the spec and the behavior of your hardware.
> > The code is an attempt to validate the device against the spec, but more
> > thorough implementations may follow.  REQ_ACS_FLAGS defines the set of
> > ACS capabilities we think are relevant to device isolation.  In
> > particular, UF seems like a key feature and our current test for it may
> > not be fully correct.  Note how RR and CR only specify p2p with other
> > root ports while UF requires transaction towards to the RC.  Section
> > 6.12.2 further defines Redirected Request Validation as a feature
> > within the context of RR and CR.  So rather than look at the code,
> > discuss section 6.12 with the hardware engineers and understand how it
> > behaves relative to each device and transaction type.  Implement the
> > capabilities that best match.  Attempting a minimal implementation
> > based on the current software interpretation may bite later, for
> > instance if we re-interpret how UF works.  Thanks,  
> 
> I read your reply multiple times. Here is what I got from it.
> 
> The summary below is for the root ports only.
> 
> - P2P on root ports is optional. 

And unless told otherwise (by ACS or ACS-equivalent quirks), Linux
assumes p2p is possible.

> - If P2P is there source validation, translation blocking, upstream forwarding,
> p2p request redirection and p2p completion redirection ACS capabilities need to be
> there for spec+linux compliance.

Again, this is not a Linux requirement.  If you want Linux to recognize
the isolation of devices downstream of the root port using standard
mechanism, this would be the way to do so.
 
> - If P2P is not there source validation, translation blocking and upstream forwarding
> needs to be there for spec+linux compliance.

This is interpretation of a rather confusing section of the spec where
we currently take a fairly liberal approach.  The spec says RR must be
implemented by RPs that support p2p traffic _with_other_root_ports_.
That doesn't necessarily say anything about p2p "reflected" back
downstream, however enabling RR clearly states that p2p request must be
redirected upstream.  Thus supporting RR is clearly the safer choice
here for long term compliance if your device uses the RR behavior
already.  Supporting CR also falls out of that since RR necessitates
CR.  UF also references RR and CR behavior when enabled, so as per the
footnote in 6.12.1.1, it's not entirely clear that we can assume what
happens if a RP supports UF but not RR/CR.  The safe bet is to
implement each capability that matches your hardware behavior.

> - The code is relaxed to allow any combination of these today based on the ACS
> capability but it can change tomorrow. 

Yes, we somewhat assume that if a device supports ACS at all, it's
probably doing the "right thing".  I don't know that the current
behavior of assuming p2p is not possible when the capability is not
present is actually used by any existing hardware.  It seems
questionable on a strict reading of the spec.  Thanks,

Alex

      reply	other threads:[~2017-04-05 18:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-04 18:47 [RFC] PCI ACS Flags Clarification Sinan Kaya
2017-04-04 19:39 ` Alex Williamson
2017-04-05 13:51   ` Sinan Kaya
2017-04-05 18:57     ` Alex Williamson [this message]

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=20170405125733.2235e6e6@t450s.home \
    --to=alex.williamson@redhat.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=okaya@codeaurora.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).