From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Li Yifan <yifan2.li@intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org, Wentao Liang <vulab@iscas.ac.cn>,
Li Lili <lili.li@intel.com>, Wang Jie <jie.wang@intel.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] PCI/PTM: Keep ptm_enable_cnt balanced when pci_enable_ptm() fails
Date: Mon, 9 Nov 2026 11:01:50 +0100 [thread overview]
Message-ID: <20261109100150.GI176724@black.igk.intel.com> (raw)
In-Reply-To: <20261104121457.2108515-1-yifan2.li@intel.com>
On Wed, Nov 04, 2026 at 08:14:57PM +0800, Li Yifan wrote:
> Since commit e1092d5e15e6 ("PCI/PTM: Do not enable PTM automatically
> for Root and Switch Upstream Ports"), pci_enable_ptm() takes a
> reference on the device and on each port of the upstream path, and
> pci_disable_ptm() releases them. If pci_enable_ptm() fails, the counts
> can become incorrect in two ways:
>
> 1. pci_disable_ptm() decrements dev->ptm_enable_cnt without a check.
> Many drivers ignore the return value of pci_enable_ptm() and call
> pci_disable_ptm() unconditionally, for example mlx5 and bnxt. If
> pci_enable_ptm() failed, for example because the upstream port does
> not support PTM, the count becomes -1 and stays negative after the
> driver unbinds. Then pcie_ptm_enabled() returns true, and
> pci_resume_ptm() can enable PTM on the device after a resume,
> although the upstream path does not support PTM. Before
> e1092d5e15e6, pci_disable_ptm() did nothing if PTM was not enabled.
>
> 2. If __pci_enable_ptm() fails for the device after the upstream path
> is enabled, pci_enable_ptm() drops the reference on the device, but
> it keeps the references on the upstream ports. For example, this
> occurs if the device has no PTM Capability and its upstream port
> has one. Callers that check pcie_ptm_enabled() before
> pci_disable_ptm() never release these references, so the upstream
> ports keep PTM enabled with no user. Callers that call
> pci_disable_ptm() unconditionally release them only through the
> underflow in 1.
>
> Fix both problems in one change, because a fix for only one of them
> makes the other one worse. Release the upstream references when
> __pci_enable_ptm() fails. Make pci_disable_ptm() do nothing if PTM is
> not enabled for the device, and use atomic_dec_if_positive() so that
> the check and the decrement are one atomic operation.
>
> The fix for 2 is based on a patch from Wentao Liang [1].
>
> Fixes: e1092d5e15e6 ("PCI/PTM: Do not enable PTM automatically for Root and Switch Upstream Ports")
> Cc: stable@vger.kernel.org
> Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
> Link: https://lore.kernel.org/r/20261102222817.GA983941@bhelgaas
> Link: https://lore.kernel.org/r/20260616141733.1688264-1-vulab@iscas.ac.cn # [1]
> Signed-off-by: Li Yifan <yifan2.li@intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
prev parent reply other threads:[~2026-11-09 10:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 12:14 Li Yifan
2026-11-09 10:01 ` Mika Westerberg [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=20261109100150.GI176724@black.igk.intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=jie.wang@intel.com \
--cc=lili.li@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=vulab@iscas.ac.cn \
--cc=yifan2.li@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®