From: Bjorn Helgaas <helgaas@kernel.org>
To: Lukas Wunner <lukas@wunner.de>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>,
"Rafael J . Wysocki" <rjw@rjwysocki.net>,
linux-pci@vger.kernel.org,
Mario Limonciello <mario.limonciello@amd.com>
Subject: Re: [PATCH] PCI/sysfs: Protect driver's D3cold preference from user space
Date: Thu, 28 Sep 2023 17:36:30 -0500 [thread overview]
Message-ID: <20230928223630.GA507660@bhelgaas> (raw)
In-Reply-To: <b8a7f4af2b73f6b506ad8ddee59d747cbf834606.1695025365.git.lukas@wunner.de>
On Mon, Sep 18, 2023 at 02:48:01PM +0200, Lukas Wunner wrote:
> struct pci_dev contains two flags which govern whether the device may
> suspend to D3cold:
>
> * no_d3cold provides an opt-out for drivers (e.g. if a device is known
> to not wake from D3cold)
>
> * d3cold_allowed provides an opt-out for user space (default is true,
> user space may set to false)
>
> Since commit 9d26d3a8f1b0 ("PCI: Put PCIe ports into D3 during suspend"),
> the user space setting overwrites the driver setting. Essentially user
> space is trusted to know better than the driver whether D3cold is
> working.
>
> That feels unsafe and wrong. Assume that the change was introduced
> inadvertently and do not overwrite no_d3cold when d3cold_allowed is
> modified. Instead, consider d3cold_allowed in addition to no_d3cold
> when choosing a suspend state for the device.
>
> That way, user space may opt out of D3cold if the driver hasn't, but it
> may no longer force an opt in if the driver has opted out.
>
> Fixes: 9d26d3a8f1b0 ("PCI: Put PCIe ports into D3 during suspend")
> Signed-off-by: Lukas Wunner <lukas@wunner.de>
> Cc: stable@vger.kernel.org # v4.8+
> Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Mika and Mario, you both commented on this, but I *think* you were
both OK with it as-is for now? If so, can you give a Reviewed-by?
I don't want to go ahead if you have any concerns.
Since we're touching this area, is there anything we can do to clarify
the comments?
unsigned int no_d3cold:1; /* D3cold is forbidden */
unsigned int bridge_d3:1; /* Allow D3 for bridge */
unsigned int d3cold_allowed:1; /* D3cold is allowed by user */
These all have to do with D3, but:
- For no_d3cold, "D3cold is forbidden" doesn't capture the notion
that "driver knows the device doesn't wake from D3cold"
- It's not clear whether "bridge_d3" applies to D3hot, D3cold, or
both.
- The computation of "bridge_d3" is ... complicated. It depends on
all the device/platform behavior assumptions in
pci_bridge_d3_possible(). And *also* (I think) the user-space
"d3cold_allowed" knob, via pci_dev_check_d3cold() in
pci_bridge_d3_update().
So it's kind of a mix of hardware characteristics and
administrative controls.
Any comment updates could be a separate patch so as not to complicate
this one.
> @@ -911,7 +911,7 @@ pci_power_t acpi_pci_choose_state(struct pci_dev *pdev)
> {
> int acpi_state, d_max;
>
> - if (pdev->no_d3cold)
> + if (pdev->no_d3cold || !pdev->d3cold_allowed)
Haha, looks good. Too bad the senses are opposite ("no_d3cold" and
"!d3cold_allowed"), but that's for another day.
> d_max = ACPI_STATE_D3_HOT;
> else
> d_max = ACPI_STATE_D3_COLD;
> diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
> index ba38fc4..e18ccd2 100644
> --- a/drivers/pci/pci-sysfs.c
> +++ b/drivers/pci/pci-sysfs.c
> @@ -530,10 +530,7 @@ static ssize_t d3cold_allowed_store(struct device *dev,
> return -EINVAL;
>
> pdev->d3cold_allowed = !!val;
> - if (pdev->d3cold_allowed)
> - pci_d3cold_enable(pdev);
> - else
> - pci_d3cold_disable(pdev);
> + pci_bridge_d3_update(pdev);
This is great. D3 is still a tangle, but this is a significant
improvement.
> pm_runtime_resume(dev);
Bjorn
next prev parent reply other threads:[~2023-09-28 22:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-18 12:48 [PATCH] PCI/sysfs: Protect driver's D3cold preference from user space Lukas Wunner
2023-09-18 13:07 ` Mika Westerberg
2023-09-18 13:14 ` Mario Limonciello
2023-09-18 13:24 ` Lukas Wunner
2023-09-18 13:28 ` Mario Limonciello
2023-09-18 14:26 ` Lukas Wunner
2023-09-18 14:52 ` Mario Limonciello
2023-09-28 22:36 ` Bjorn Helgaas [this message]
2023-09-29 4:44 ` Mika Westerberg
2023-09-29 19:03 ` Limonciello, Mario
2023-09-29 22:48 ` Bjorn Helgaas
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=20230928223630.GA507660@bhelgaas \
--to=helgaas@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=mario.limonciello@amd.com \
--cc=mika.westerberg@linux.intel.com \
--cc=rjw@rjwysocki.net \
/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).