Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1424249 > unrolled thread

hfi1 use of PCI internals

Started byBjorn Helgaas <helgaas@kernel.org>
First post2016-06-16 18:30 +0200
Last post2016-06-18 01:10 +0200
Articles 6 — 3 participants

Back to article view | Back to linux.kernel


Contents

  hfi1 use of PCI internals Bjorn Helgaas <helgaas@kernel.org> - 2016-06-16 18:30 +0200
    Re: hfi1 use of PCI internals Ashutosh Dixit <ashutosh.dixit@intel.com> - 2016-06-16 20:50 +0200
      Re: hfi1 use of PCI internals Bjorn Helgaas <helgaas@kernel.org> - 2016-06-16 22:10 +0200
        Re: hfi1 use of PCI internals Dennis Dalessandro <dennis.dalessandro@intel.com> - 2016-06-17 16:00 +0200
        Re: hfi1 use of PCI internals Ashutosh Dixit <ashutosh.dixit@intel.com> - 2016-06-18 00:10 +0200
          Re: hfi1 use of PCI internals Bjorn Helgaas <helgaas@kernel.org> - 2016-06-18 01:10 +0200

#1424249 — hfi1 use of PCI internals

FromBjorn Helgaas <helgaas@kernel.org>
Date2016-06-16 18:30 +0200
Subjecthfi1 use of PCI internals
Message-ID<rKIl3-2cb-11@gated-at.bofh.it>
I noticed drivers/infiniband/hw/hfi1 got moved from staging to
drivers/ for v4.7.  It does a bunch of grubbing around in PCIe ASPM
configuration, e.g., see drivers/infiniband/hw/hfi1/aspm.h.

I know there have been lots of ASPM issues, both hardware problems and
Linux kernel problems, but it is *supposed* to be manageable by the
core, without special driver support.  What's the justification for
having to do this in the hfi1 driver?

Bjorn

[toc] | [next] | [standalone]


#1424345

FromAshutosh Dixit <ashutosh.dixit@intel.com>
Date2016-06-16 20:50 +0200
Message-ID<rKKwx-3rm-11@gated-at.bofh.it>
In reply to#1424249
On Thu, Jun 16 2016 at 12:20:52 PM, Bjorn Helgaas <helgaas@kernel.org> wrote:
> I noticed drivers/infiniband/hw/hfi1 got moved from staging to
> drivers/ for v4.7.  It does a bunch of grubbing around in PCIe ASPM
> configuration, e.g., see drivers/infiniband/hw/hfi1/aspm.h.
>
> I know there have been lots of ASPM issues, both hardware problems and
> Linux kernel problems, but it is *supposed* to be manageable by the
> core, without special driver support.  What's the justification for
> having to do this in the hfi1 driver?

The description for commit affa48de84 "staging/rdma/hfi1: Add support
for enabling/disabling PCIe ASPM" anticipates this question and
describes why this was done in the hfi1 driver:

    Finally, the kernel ASPM API is not used in this patch. This is
    because this patch does several non-standard things as SW
    workarounds for HW issues. As mentioned above, it enables ASPM even
    when advertised actual latencies are greater than acceptable
    latencies. Also, whereas the kernel API only allows drivers to
    disable ASPM from driver probe, this patch enables/disables ASPM
    directly from interrupt context. Due to these reasons the kernel
    ASPM API was not used.

[toc] | [prev] | [next] | [standalone]


#1424372

FromBjorn Helgaas <helgaas@kernel.org>
Date2016-06-16 22:10 +0200
Message-ID<rKLLX-4lm-9@gated-at.bofh.it>
In reply to#1424345
On Thu, Jun 16, 2016 at 02:48:30PM -0400, Ashutosh Dixit wrote:
> On Thu, Jun 16 2016 at 12:20:52 PM, Bjorn Helgaas <helgaas@kernel.org> wrote:
> > I noticed drivers/infiniband/hw/hfi1 got moved from staging to
> > drivers/ for v4.7.  It does a bunch of grubbing around in PCIe ASPM
> > configuration, e.g., see drivers/infiniband/hw/hfi1/aspm.h.
> >
> > I know there have been lots of ASPM issues, both hardware problems and
> > Linux kernel problems, but it is *supposed* to be manageable by the
> > core, without special driver support.  What's the justification for
> > having to do this in the hfi1 driver?
> 
> The description for commit affa48de84 "staging/rdma/hfi1: Add support
> for enabling/disabling PCIe ASPM" anticipates this question and
> describes why this was done in the hfi1 driver:
> 
>     Finally, the kernel ASPM API is not used in this patch. This is
>     because this patch does several non-standard things as SW
>     workarounds for HW issues. As mentioned above, it enables ASPM even
>     when advertised actual latencies are greater than acceptable
>     latencies. Also, whereas the kernel API only allows drivers to
>     disable ASPM from driver probe, this patch enables/disables ASPM
>     directly from interrupt context. Due to these reasons the kernel
>     ASPM API was not used.

That's a good start, but leads to more questions.  For example, it
doesn't answer the obvious question of why the driver needs to
enable/disable ASPM from interrupt context.

Disabling ASPM should only require writing the device's Link Control
register.  The PCI core could probably provide an interface to do that
in interrupt context.

Enabling ASPM is not latency-critical and could probably be done from
a work queue outside interrupt context, although conceptually there
shouldn't be much required here either, and possibly the PCI core
interface could be improved.

It's possible the latency problem could be handled by some sort of
quirk that overrides the acceptable latency.

It's hard enough to get ASPM support in the PCI core correct without
having to worry about drivers doing their own thing behind the back of
the core.

As far as I can tell, none of these PCI questions were raised on
linux-pci, so we never even had a chance to have a conversation about
them.

Bjorn

[toc] | [prev] | [next] | [standalone]


#1425111

FromDennis Dalessandro <dennis.dalessandro@intel.com>
Date2016-06-17 16:00 +0200
Message-ID<rL2tr-7fP-17@gated-at.bofh.it>
In reply to#1424372
On Thu, Jun 16, 2016 at 03:08:17PM -0500, Bjorn Helgaas wrote:
>As far as I can tell, none of these PCI questions were raised on
>linux-pci, so we never even had a chance to have a conversation about
>them.

I'll let Ashutosh handle the technical details here since he is most 
familiar with the code in question. I just want to mention that the move out 
of staging doesn't imply the driver is done being developed. We are very 
much open to discussing whatever the PCI folks see as needing to be 
addressed.

-Denny

[toc] | [prev] | [next] | [standalone]


#1425521

FromAshutosh Dixit <ashutosh.dixit@intel.com>
Date2016-06-18 00:10 +0200
Message-ID<rLa7D-3SN-5@gated-at.bofh.it>
In reply to#1424372
On Thu, Jun 16 2016 at 04:08:17 PM, Bjorn Helgaas <helgaas@kernel.org> wrote:
>
> That's a good start, but leads to more questions.  For example, it
> doesn't answer the obvious question of why the driver needs to
> enable/disable ASPM from interrupt context.

For power saving reasons we keep ASPM L1 enabled, but implement a
heuristic to "quickly" disable ASPM L1 when we notice PCIe traffic (as
measured by the interrupt rate) starting up. If interrupt activity
ceases ASPM L1 is re-enabled.

> Disabling ASPM should only require writing the device's Link Control
> register.  The PCI core could probably provide an interface to do that
> in interrupt context.
>
> Enabling ASPM is not latency-critical and could probably be done from
> a work queue outside interrupt context, although conceptually there
> shouldn't be much required here either, and possibly the PCI core
> interface could be improved.

That is true, to keep latencies low we need to disable ASPM from
interrupt context, but re-enabling ASPM is not latency critical.

> It's possible the latency problem could be handled by some sort of
> quirk that overrides the acceptable latency.

Correct, this is another issue that needs to be resolved.

[toc] | [prev] | [next] | [standalone]


#1425546

FromBjorn Helgaas <helgaas@kernel.org>
Date2016-06-18 01:10 +0200
Message-ID<rLb3H-4td-3@gated-at.bofh.it>
In reply to#1425521
On Fri, Jun 17, 2016 at 06:05:43PM -0400, Ashutosh Dixit wrote:
> On Thu, Jun 16 2016 at 04:08:17 PM, Bjorn Helgaas <helgaas@kernel.org> wrote:
> >
> > That's a good start, but leads to more questions.  For example, it
> > doesn't answer the obvious question of why the driver needs to
> > enable/disable ASPM from interrupt context.
> 
> For power saving reasons we keep ASPM L1 enabled, but implement a
> heuristic to "quickly" disable ASPM L1 when we notice PCIe traffic (as
> measured by the interrupt rate) starting up. If interrupt activity
> ceases ASPM L1 is re-enabled.
> 
> > Disabling ASPM should only require writing the device's Link Control
> > register.  The PCI core could probably provide an interface to do that
> > in interrupt context.
> >
> > Enabling ASPM is not latency-critical and could probably be done from
> > a work queue outside interrupt context, although conceptually there
> > shouldn't be much required here either, and possibly the PCI core
> > interface could be improved.
> 
> That is true, to keep latencies low we need to disable ASPM from
> interrupt context, but re-enabling ASPM is not latency critical.

For endpoint devices, it should be theoretically possible to
enable/disable ASPM very quickly, by touching only that device.  We
don't do that today because pcie/aspm.c does all sorts of buffoonery
and path walking.  I think that could be simplified, assuming we think
this sort of intensive ASPM-management is desirable.

> > It's possible the latency problem could be handled by some sort of
> > quirk that overrides the acceptable latency.
> 
> Correct, this is another issue that needs to be resolved.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web