All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Kuppuswamy Sathyanarayanan  <sathyanarayanan.kuppuswamy@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>
Subject: Re: [PATCH v2] PCI/EDR: Clear PCIe Device Status errors after EDR error recovery
Date: Wed, 29 Mar 2023 17:09:27 -0500	[thread overview]
Message-ID: <20230329220927.GA3086137@bhelgaas> (raw)
In-Reply-To: <20230315235449.1279209-1-sathyanarayanan.kuppuswamy@linux.intel.com>

[+cc Jonathan, author of 068c29a248b6]

On Wed, Mar 15, 2023 at 04:54:49PM -0700, Kuppuswamy Sathyanarayanan wrote:
> Commit 068c29a248b6 ("PCI/ERR: Clear PCIe Device Status errors only if
> OS owns AER") adds support to clear error status in the Device Status
> Register(DEVSTA) only if OS owns the AER support. But this change
> breaks the requirement of the EDR feature which requires OS to cleanup
> the error registers even if firmware owns the control of AER support.
> 
> More details about this requirement can be found in PCIe Firmware
> specification v3.3, Table 4-6 Interpretation of the _OSC Control Field.
> If the OS supports the Error Disconnect Recover (EDR) feature and
> firmware sends the EDR event, then during the EDR recovery window, OS
> is responsible for the device error recovery and holds the ownership of
> the following error registers.
> 
> • Device Status Register
> • Uncorrectable Error Status Register
> • Correctable Error Status Register
> • Root Error Status Register
> • RP PIO Status Register
> 
> So call pcie_clear_device_status() in edr_handle_event() if the error
> recovery is successful.

IIUC, after ac1c8e35a326 ("PCI/DPC: Add Error Disconnect Recover (EDR)
support") appeared in v5.7-rc1, DEVSTA was always cleared in this path:

  edr_handle_event
    pcie_do_recovery
      pcie_clear_device_status

After 068c29a248b6 ("PCI/ERR: Clear PCIe Device Status errors only if
OS owns AER") appeared in v5.9-rc1, we only clear DEVSTA if the OS
owns the AER Capability:

  edr_handle_event
    pcie_do_recovery
      if (pcie_aer_is_native(dev))      # <-- new test
        pcie_clear_device_status

So in the case where the OS does *not* own AER, and it receives an EDR
notification, DEVSTA is not cleared when it should be.  Right?

I assume we should have a Fixes: tag here, since this patch should be
backported to every kernel that contains 068c29a248b6.  Possibly even
a stable tag, although it's arguable whether it's "critical" per
Documentation/process/stable-kernel-rules.rst.

> Reported-by: Tsaur Erwin <erwin.tsaur@intel.com>

I assume this report was internal, and there's no mailing list post or
bugzilla issue URL we can include here?

> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
> ---
> 
> Changes since v1:
>  * Rebased on top of v6.3-rc1.
>  * Fixed a typo in pcie_clear_device_status().
> 
>  drivers/pci/pcie/edr.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/pci/pcie/edr.c b/drivers/pci/pcie/edr.c
> index a6b9b479b97a..87734e4c3c20 100644
> --- a/drivers/pci/pcie/edr.c
> +++ b/drivers/pci/pcie/edr.c
> @@ -193,6 +193,7 @@ static void edr_handle_event(acpi_handle handle, u32 event, void *data)
>  	 */
>  	if (estate == PCI_ERS_RESULT_RECOVERED) {
>  		pci_dbg(edev, "DPC port successfully recovered\n");
> +		pcie_clear_device_status(edev);

It's a little weird to work around a change inside pcie_do_recovery()
by clearing it here, and that means we clear it twice in the AER
native case, but I don't see any simpler way to do this, so this seems
fine as the fix for the current issue.

Question though: in the AER native case, pcie_do_recovery() calls
both:

  pcie_clear_device_status() and
  pci_aer_clear_nonfatal_status()

In this patch, you only call pcie_clear_device_status().  Do you care
about pci_aer_clear_nonfatal_status(), too?

The overall design for clearing status has gotten pretty complicated
as we've added error handling methods (firmware-first, DPC, EDR), and
there are so many different places and cases that it's hard to be sure
we do them all correctly.

I don't really know how to clean this up, so I'm just attaching my
notes about the current state:

  - AER native handling:

    handle_error_source
      if (info->severity == AER_CORRECTABLE)
        clear PCI_ERR_COR_STATUS              <--
        if (pcie_aer_is_native(dev))
          pdrv->err_handler->cor_error_detected()
          pcie_clear_device_status
            clear PCI_EXP_DEVSTA              <--
      else
        pcie_do_recovery
          pcie_clear_device_status
            clear PCI_EXP_DEVSTA              <--
          pci_aer_clear_nonfatal_status
            clear PCI_ERR_UNCOR_STATUS        <--

  - Firmware-first handling: status is cleared by firmware before
    event is reported to OS via HEST

  - DPC native handling:

    dpc_handler
      dpc_process_error
        if (rp_extensions)
          dpc_process_rp_pio_error
            clear PCI_EXP_DPC_RP_PIO_STATUS   <--
        else if (...)
          pci_aer_clear_nonfatal_status
            clear PCI_ERR_UNCOR_STATUS        <--
          pci_aer_clear_fatal_status
            clear PCI_ERR_UNCOR_STATUS        <--
      pcie_do_recovery
        if (AER native)
          pcie_clear_device_status
            clear PCI_EXP_DEVSTA              <--
          pci_aer_clear_nonfatal_status
            clear PCI_ERR_UNCOR_STATUS        <--

  - EDR event handling:

    edr_handle_event
      dpc_process_error
        if (rp_extensions)
          dpc_process_rp_pio_error
            clear PCI_EXP_DPC_RP_PIO_STATUS   <--
        else if (...)
          pci_aer_clear_nonfatal_status
            clear PCI_ERR_UNCOR_STATUS        <--
          pci_aer_clear_fatal_status
            clear PCI_ERR_UNCOR_STATUS        <--
      pci_aer_raw_clear_status
        clear PCI_ERR_ROOT_STATUS             <--
        clear PCI_ERR_COR_STATUS              <--
        clear PCI_ERR_UNCOR_STATUS            <--
      pcie_do_recovery
        if (AER native)
          pcie_clear_device_status
            clear PCI_EXP_DEVSTA              <--
          pci_aer_clear_nonfatal_status
            clear PCI_ERR_UNCOR_STATUS        <--
      if (PCI_ERS_RESULT_RECOVERED)
        pcie_clear_device_status
          clear PCI_EXP_DEVSTA                <--

>  		acpi_send_edr_status(pdev, edev, EDR_OST_SUCCESS);
>  	} else {
>  		pci_dbg(edev, "DPC port recovery failed\n");
> -- 
> 2.34.1
> 

  parent reply	other threads:[~2023-03-29 22:10 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-15 23:54 [PATCH v2] PCI/EDR: Clear PCIe Device Status errors after EDR error recovery Kuppuswamy Sathyanarayanan
2023-03-24 17:53 ` Sathyanarayanan Kuppuswamy
2023-03-29 22:09 ` Bjorn Helgaas [this message]
2023-03-29 22:38   ` Sathyanarayanan Kuppuswamy
2023-03-30 15:45     ` Bjorn Helgaas
2023-03-31  6:46       ` Sathyanarayanan Kuppuswamy
2023-03-31 15:10         ` Bjorn Helgaas
2023-04-06 21:07 ` Bjorn Helgaas
2023-04-06 21:52   ` Sathyanarayanan Kuppuswamy
2023-04-06 22:21     ` Bjorn Helgaas
2023-04-06 22:46       ` Natu, Mahesh
2023-04-07  5:31       ` Sathyanarayanan Kuppuswamy
2023-04-07 16:46         ` Bjorn Helgaas
2023-04-07 22:19           ` Sathyanarayanan Kuppuswamy
2023-04-07 22:41             ` Bjorn Helgaas
2023-04-07 21:51 ` Bjorn Helgaas
2023-04-07 21:52   ` Bjorn Helgaas
2023-04-07 22:25     ` Sathyanarayanan Kuppuswamy
2023-04-07 22:21   ` Sathyanarayanan Kuppuswamy

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=20230329220927.GA3086137@bhelgaas \
    --to=helgaas@kernel.org \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=bhelgaas@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.