From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: linux-phy@lists.infradead.org, Bjorn Helgaas <bhelgaas@google.com>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org, linux-can@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-ide@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-riscv@lists.infradead.org,
linux-rockchip@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org, netdev@vger.kernel.org,
spacemit@lists.linux.dev, UNGLinuxDriver@microchip.com,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>
Subject: Re: [PATCH v7 phy-next 08/27] PCI: Remove device links to PHY
Date: Mon, 4 May 2026 10:57:42 +0300 [thread overview]
Message-ID: <20260504075742.ixt7phu4cpp433q5@skbuf> (raw)
In-Reply-To: <20260430110652.558622-9-vladimir.oltean@nxp.com> <20260430110652.558622-9-vladimir.oltean@nxp.com>
Sashiko says:
> commit e4f495a9118b40f8a77e8dc097821d2c846ed1fc
> Author: Vladimir Oltean <vladimir.oltean@nxp.com>
>
> PCI: Remove device links to PHY
> This commit removes device links between the PCIe controllers and PHY
> providers across several drivers, since the PHY core already creates consumer
> device links.
>
> > diff --git a/drivers/pci/controller/cadence/pcie-cadence-plat.c b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > index b067a3296dd37..fc39c01b79648 100644
> > --- a/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > +++ b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> [ ... ]
> > @@ -122,9 +121,6 @@ static int cdns_plat_pcie_probe(struct platform_device *pdev)
> > pm_runtime_put_sync(dev);
> > pm_runtime_disable(dev);
> > cdns_pcie_disable_phy(cdns_plat_pcie->pcie);
> > - phy_count = cdns_plat_pcie->pcie->phy_count;
> > - while (phy_count--)
> > - device_link_del(cdns_plat_pcie->pcie->link[phy_count]);
> >
> > return 0;
>
> This isn't a bug introduced by your patch, but I noticed the error path in
> cdns_plat_pcie_probe() returns 0.
> Does this cause the driver core to consider the probe successful even when
> host or endpoint setup steps fail? It looks like the device would be left
> in an uninitialized and disabled state while still being bound to the driver.
> Should this return ret instead?
>
The condition does not appear intentional. Commit bd22885aa188 ("PCI:
cadence: Refactor driver to use as a core library") changed
cdns_pcie_host_probe() which properly returned ret on error with
cdns_plat_pcie_probe() which doesn't.
I will add a preparatory patch which replaces "return 0" with "return ret"
in cdns_plat_pcie_probe(), blaming that commit.
> > }
> > diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
> > index cd904659c3216..9c1aef4d0bd1c 100644
> > --- a/drivers/pci/controller/dwc/pci-dra7xx.c
> > +++ b/drivers/pci/controller/dwc/pci-dra7xx.c
> [ ... ]
> > @@ -852,10 +840,6 @@ static int dra7xx_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > dra7xx_pcie_disable_phy(dra7xx);
> >
> > -err_link:
> > - while (--i >= 0)
> > - device_link_del(link[i]);
> > -
> > return ret;
> > }
>
> This isn't a bug introduced by your changes, but looking closely at the error
> path right above this hunk, there is a call to pm_runtime_put(dev) immediately
> followed by pm_runtime_disable(dev):
> err_gpio:
> err_get_sync:
> pm_runtime_put(dev);
> pm_runtime_disable(dev);
> Does this sequence create a power management race condition? The pending
> asynchronous idle/suspend work can be abruptly cancelled by
> pm_runtime_disable(), leaving the hardware in an incorrect or unpredictable
> power state.
> Should this use pm_runtime_put_sync() instead?
>
> > diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
> > index fe4836925c4e3..cab9fad212add 100644
> > --- a/drivers/pci/controller/dwc/pci-keystone.c
> > +++ b/drivers/pci/controller/dwc/pci-keystone.c
> [ ... ]
> > @@ -1337,25 +1321,18 @@ static int ks_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > ks_pcie_disable_phy(ks_pcie);
> >
> > -err_link:
> > - while (--i >= 0 && link[i])
> > - device_link_del(link[i]);
> > -
> > +err:
> > return ret;
> > }
> >
> > static void ks_pcie_remove(struct platform_device *pdev)
> > {
> > struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
> > - struct device_link **link = ks_pcie->link;
> > - int num_lanes = ks_pcie->num_lanes;
> > struct device *dev = &pdev->dev;
> >
> > pm_runtime_put(dev);
> > pm_runtime_disable(dev);
>
> Similar to the question above, is it possible this asynchronous put causes
> a race when immediately followed by pm_runtime_disable() during removal?
>
> > ks_pcie_disable_phy(ks_pcie);
> > - while (num_lanes--)
> > - device_link_del(link[num_lanes]);
> > }
It seems plausible that the pm_runtime_put() -> pm_runtime_disable()
pattern is ineffective, i.e. one of two things can happen: either
pm_runtime_put() runs to completion by chance, or pm_runtime_disable()
cancels it. However I am not very familiar with the runtime PM API and
its effects, and unless a maintainer tells me to, I would prefer leaving
these code paths alone.
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: linux-phy@lists.infradead.org, Bjorn Helgaas <bhelgaas@google.com>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org, linux-can@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-ide@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-riscv@lists.infradead.org,
linux-rockchip@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org, netdev@vger.kernel.org,
spacemit@lists.linux.dev, UNGLinuxDriver@microchip.com,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>
Subject: Re: [PATCH v7 phy-next 08/27] PCI: Remove device links to PHY
Date: Mon, 4 May 2026 10:57:42 +0300 [thread overview]
Message-ID: <20260504075742.ixt7phu4cpp433q5@skbuf> (raw)
In-Reply-To: <20260430110652.558622-9-vladimir.oltean@nxp.com> <20260430110652.558622-9-vladimir.oltean@nxp.com>
Sashiko says:
> commit e4f495a9118b40f8a77e8dc097821d2c846ed1fc
> Author: Vladimir Oltean <vladimir.oltean@nxp.com>
>
> PCI: Remove device links to PHY
> This commit removes device links between the PCIe controllers and PHY
> providers across several drivers, since the PHY core already creates consumer
> device links.
>
> > diff --git a/drivers/pci/controller/cadence/pcie-cadence-plat.c b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > index b067a3296dd37..fc39c01b79648 100644
> > --- a/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > +++ b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> [ ... ]
> > @@ -122,9 +121,6 @@ static int cdns_plat_pcie_probe(struct platform_device *pdev)
> > pm_runtime_put_sync(dev);
> > pm_runtime_disable(dev);
> > cdns_pcie_disable_phy(cdns_plat_pcie->pcie);
> > - phy_count = cdns_plat_pcie->pcie->phy_count;
> > - while (phy_count--)
> > - device_link_del(cdns_plat_pcie->pcie->link[phy_count]);
> >
> > return 0;
>
> This isn't a bug introduced by your patch, but I noticed the error path in
> cdns_plat_pcie_probe() returns 0.
> Does this cause the driver core to consider the probe successful even when
> host or endpoint setup steps fail? It looks like the device would be left
> in an uninitialized and disabled state while still being bound to the driver.
> Should this return ret instead?
>
The condition does not appear intentional. Commit bd22885aa188 ("PCI:
cadence: Refactor driver to use as a core library") changed
cdns_pcie_host_probe() which properly returned ret on error with
cdns_plat_pcie_probe() which doesn't.
I will add a preparatory patch which replaces "return 0" with "return ret"
in cdns_plat_pcie_probe(), blaming that commit.
> > }
> > diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
> > index cd904659c3216..9c1aef4d0bd1c 100644
> > --- a/drivers/pci/controller/dwc/pci-dra7xx.c
> > +++ b/drivers/pci/controller/dwc/pci-dra7xx.c
> [ ... ]
> > @@ -852,10 +840,6 @@ static int dra7xx_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > dra7xx_pcie_disable_phy(dra7xx);
> >
> > -err_link:
> > - while (--i >= 0)
> > - device_link_del(link[i]);
> > -
> > return ret;
> > }
>
> This isn't a bug introduced by your changes, but looking closely at the error
> path right above this hunk, there is a call to pm_runtime_put(dev) immediately
> followed by pm_runtime_disable(dev):
> err_gpio:
> err_get_sync:
> pm_runtime_put(dev);
> pm_runtime_disable(dev);
> Does this sequence create a power management race condition? The pending
> asynchronous idle/suspend work can be abruptly cancelled by
> pm_runtime_disable(), leaving the hardware in an incorrect or unpredictable
> power state.
> Should this use pm_runtime_put_sync() instead?
>
> > diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
> > index fe4836925c4e3..cab9fad212add 100644
> > --- a/drivers/pci/controller/dwc/pci-keystone.c
> > +++ b/drivers/pci/controller/dwc/pci-keystone.c
> [ ... ]
> > @@ -1337,25 +1321,18 @@ static int ks_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > ks_pcie_disable_phy(ks_pcie);
> >
> > -err_link:
> > - while (--i >= 0 && link[i])
> > - device_link_del(link[i]);
> > -
> > +err:
> > return ret;
> > }
> >
> > static void ks_pcie_remove(struct platform_device *pdev)
> > {
> > struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
> > - struct device_link **link = ks_pcie->link;
> > - int num_lanes = ks_pcie->num_lanes;
> > struct device *dev = &pdev->dev;
> >
> > pm_runtime_put(dev);
> > pm_runtime_disable(dev);
>
> Similar to the question above, is it possible this asynchronous put causes
> a race when immediately followed by pm_runtime_disable() during removal?
>
> > ks_pcie_disable_phy(ks_pcie);
> > - while (num_lanes--)
> > - device_link_del(link[num_lanes]);
> > }
It seems plausible that the pm_runtime_put() -> pm_runtime_disable()
pattern is ineffective, i.e. one of two things can happen: either
pm_runtime_put() runs to completion by chance, or pm_runtime_disable()
cancels it. However I am not very familiar with the runtime PM API and
its effects, and unless a maintainer tells me to, I would prefer leaving
these code paths alone.
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: linux-phy@lists.infradead.org, Bjorn Helgaas <bhelgaas@google.com>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org, linux-can@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-ide@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-riscv@lists.infradead.org,
linux-rockchip@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org, netdev@vger.kernel.org,
spacemit@lists.linux.dev, UNGLinuxDriver@microchip.com,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>
Subject: Re: [PATCH v7 phy-next 08/27] PCI: Remove device links to PHY
Date: Mon, 4 May 2026 10:57:42 +0300 [thread overview]
Message-ID: <20260504075742.ixt7phu4cpp433q5@skbuf> (raw)
In-Reply-To: <20260430110652.558622-9-vladimir.oltean@nxp.com> <20260430110652.558622-9-vladimir.oltean@nxp.com>
Sashiko says:
> commit e4f495a9118b40f8a77e8dc097821d2c846ed1fc
> Author: Vladimir Oltean <vladimir.oltean@nxp.com>
>
> PCI: Remove device links to PHY
> This commit removes device links between the PCIe controllers and PHY
> providers across several drivers, since the PHY core already creates consumer
> device links.
>
> > diff --git a/drivers/pci/controller/cadence/pcie-cadence-plat.c b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > index b067a3296dd37..fc39c01b79648 100644
> > --- a/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > +++ b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> [ ... ]
> > @@ -122,9 +121,6 @@ static int cdns_plat_pcie_probe(struct platform_device *pdev)
> > pm_runtime_put_sync(dev);
> > pm_runtime_disable(dev);
> > cdns_pcie_disable_phy(cdns_plat_pcie->pcie);
> > - phy_count = cdns_plat_pcie->pcie->phy_count;
> > - while (phy_count--)
> > - device_link_del(cdns_plat_pcie->pcie->link[phy_count]);
> >
> > return 0;
>
> This isn't a bug introduced by your patch, but I noticed the error path in
> cdns_plat_pcie_probe() returns 0.
> Does this cause the driver core to consider the probe successful even when
> host or endpoint setup steps fail? It looks like the device would be left
> in an uninitialized and disabled state while still being bound to the driver.
> Should this return ret instead?
>
The condition does not appear intentional. Commit bd22885aa188 ("PCI:
cadence: Refactor driver to use as a core library") changed
cdns_pcie_host_probe() which properly returned ret on error with
cdns_plat_pcie_probe() which doesn't.
I will add a preparatory patch which replaces "return 0" with "return ret"
in cdns_plat_pcie_probe(), blaming that commit.
> > }
> > diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
> > index cd904659c3216..9c1aef4d0bd1c 100644
> > --- a/drivers/pci/controller/dwc/pci-dra7xx.c
> > +++ b/drivers/pci/controller/dwc/pci-dra7xx.c
> [ ... ]
> > @@ -852,10 +840,6 @@ static int dra7xx_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > dra7xx_pcie_disable_phy(dra7xx);
> >
> > -err_link:
> > - while (--i >= 0)
> > - device_link_del(link[i]);
> > -
> > return ret;
> > }
>
> This isn't a bug introduced by your changes, but looking closely at the error
> path right above this hunk, there is a call to pm_runtime_put(dev) immediately
> followed by pm_runtime_disable(dev):
> err_gpio:
> err_get_sync:
> pm_runtime_put(dev);
> pm_runtime_disable(dev);
> Does this sequence create a power management race condition? The pending
> asynchronous idle/suspend work can be abruptly cancelled by
> pm_runtime_disable(), leaving the hardware in an incorrect or unpredictable
> power state.
> Should this use pm_runtime_put_sync() instead?
>
> > diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
> > index fe4836925c4e3..cab9fad212add 100644
> > --- a/drivers/pci/controller/dwc/pci-keystone.c
> > +++ b/drivers/pci/controller/dwc/pci-keystone.c
> [ ... ]
> > @@ -1337,25 +1321,18 @@ static int ks_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > ks_pcie_disable_phy(ks_pcie);
> >
> > -err_link:
> > - while (--i >= 0 && link[i])
> > - device_link_del(link[i]);
> > -
> > +err:
> > return ret;
> > }
> >
> > static void ks_pcie_remove(struct platform_device *pdev)
> > {
> > struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
> > - struct device_link **link = ks_pcie->link;
> > - int num_lanes = ks_pcie->num_lanes;
> > struct device *dev = &pdev->dev;
> >
> > pm_runtime_put(dev);
> > pm_runtime_disable(dev);
>
> Similar to the question above, is it possible this asynchronous put causes
> a race when immediately followed by pm_runtime_disable() during removal?
>
> > ks_pcie_disable_phy(ks_pcie);
> > - while (num_lanes--)
> > - device_link_del(link[num_lanes]);
> > }
It seems plausible that the pm_runtime_put() -> pm_runtime_disable()
pattern is ineffective, i.e. one of two things can happen: either
pm_runtime_put() runs to completion by chance, or pm_runtime_disable()
cancels it. However I am not very familiar with the runtime PM API and
its effects, and unless a maintainer tells me to, I would prefer leaving
these code paths alone.
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: linux-phy@lists.infradead.org, Bjorn Helgaas <bhelgaas@google.com>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org, linux-can@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-ide@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
linux-riscv@lists.infradead.org,
linux-rockchip@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-scsi@vger.kernel.org,
linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org, netdev@vger.kernel.org,
spacemit@lists.linux.dev, UNGLinuxDriver@microchip.com,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>
Subject: Re: [PATCH v7 phy-next 08/27] PCI: Remove device links to PHY
Date: Mon, 4 May 2026 10:57:42 +0300 [thread overview]
Message-ID: <20260504075742.ixt7phu4cpp433q5@skbuf> (raw)
In-Reply-To: <20260430110652.558622-9-vladimir.oltean@nxp.com> <20260430110652.558622-9-vladimir.oltean@nxp.com>
Sashiko says:
> commit e4f495a9118b40f8a77e8dc097821d2c846ed1fc
> Author: Vladimir Oltean <vladimir.oltean@nxp.com>
>
> PCI: Remove device links to PHY
> This commit removes device links between the PCIe controllers and PHY
> providers across several drivers, since the PHY core already creates consumer
> device links.
>
> > diff --git a/drivers/pci/controller/cadence/pcie-cadence-plat.c b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > index b067a3296dd37..fc39c01b79648 100644
> > --- a/drivers/pci/controller/cadence/pcie-cadence-plat.c
> > +++ b/drivers/pci/controller/cadence/pcie-cadence-plat.c
> [ ... ]
> > @@ -122,9 +121,6 @@ static int cdns_plat_pcie_probe(struct platform_device *pdev)
> > pm_runtime_put_sync(dev);
> > pm_runtime_disable(dev);
> > cdns_pcie_disable_phy(cdns_plat_pcie->pcie);
> > - phy_count = cdns_plat_pcie->pcie->phy_count;
> > - while (phy_count--)
> > - device_link_del(cdns_plat_pcie->pcie->link[phy_count]);
> >
> > return 0;
>
> This isn't a bug introduced by your patch, but I noticed the error path in
> cdns_plat_pcie_probe() returns 0.
> Does this cause the driver core to consider the probe successful even when
> host or endpoint setup steps fail? It looks like the device would be left
> in an uninitialized and disabled state while still being bound to the driver.
> Should this return ret instead?
>
The condition does not appear intentional. Commit bd22885aa188 ("PCI:
cadence: Refactor driver to use as a core library") changed
cdns_pcie_host_probe() which properly returned ret on error with
cdns_plat_pcie_probe() which doesn't.
I will add a preparatory patch which replaces "return 0" with "return ret"
in cdns_plat_pcie_probe(), blaming that commit.
> > }
> > diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
> > index cd904659c3216..9c1aef4d0bd1c 100644
> > --- a/drivers/pci/controller/dwc/pci-dra7xx.c
> > +++ b/drivers/pci/controller/dwc/pci-dra7xx.c
> [ ... ]
> > @@ -852,10 +840,6 @@ static int dra7xx_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > dra7xx_pcie_disable_phy(dra7xx);
> >
> > -err_link:
> > - while (--i >= 0)
> > - device_link_del(link[i]);
> > -
> > return ret;
> > }
>
> This isn't a bug introduced by your changes, but looking closely at the error
> path right above this hunk, there is a call to pm_runtime_put(dev) immediately
> followed by pm_runtime_disable(dev):
> err_gpio:
> err_get_sync:
> pm_runtime_put(dev);
> pm_runtime_disable(dev);
> Does this sequence create a power management race condition? The pending
> asynchronous idle/suspend work can be abruptly cancelled by
> pm_runtime_disable(), leaving the hardware in an incorrect or unpredictable
> power state.
> Should this use pm_runtime_put_sync() instead?
>
> > diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
> > index fe4836925c4e3..cab9fad212add 100644
> > --- a/drivers/pci/controller/dwc/pci-keystone.c
> > +++ b/drivers/pci/controller/dwc/pci-keystone.c
> [ ... ]
> > @@ -1337,25 +1321,18 @@ static int ks_pcie_probe(struct platform_device *pdev)
> > pm_runtime_disable(dev);
> > ks_pcie_disable_phy(ks_pcie);
> >
> > -err_link:
> > - while (--i >= 0 && link[i])
> > - device_link_del(link[i]);
> > -
> > +err:
> > return ret;
> > }
> >
> > static void ks_pcie_remove(struct platform_device *pdev)
> > {
> > struct keystone_pcie *ks_pcie = platform_get_drvdata(pdev);
> > - struct device_link **link = ks_pcie->link;
> > - int num_lanes = ks_pcie->num_lanes;
> > struct device *dev = &pdev->dev;
> >
> > pm_runtime_put(dev);
> > pm_runtime_disable(dev);
>
> Similar to the question above, is it possible this asynchronous put causes
> a race when immediately followed by pm_runtime_disable() during removal?
>
> > ks_pcie_disable_phy(ks_pcie);
> > - while (num_lanes--)
> > - device_link_del(link[num_lanes]);
> > }
It seems plausible that the pm_runtime_put() -> pm_runtime_disable()
pattern is ineffective, i.e. one of two things can happen: either
pm_runtime_put() runs to completion by chance, or pm_runtime_disable()
cancels it. However I am not very familiar with the runtime PM API and
its effects, and unless a maintainer tells me to, I would prefer leaving
these code paths alone.
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2026-05-04 7:57 UTC|newest]
Thread overview: 144+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 11:06 [PATCH v7 phy-next 00/27] Split Generic PHY consumer and provider Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 01/27] ata: add <linux/pm_runtime.h> where missing Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 02/27] PCI: Add missing headers transitively included by <linux/phy/phy.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 03/27] usb: add " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 04/27] drm: add <linux/pm_runtime.h> where missing Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 05/27] phy: " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 06/27] phy: spacemit: include missing <linux/phy/phy.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 07/27] net: lan969x: include missing <linux/of.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 08/27] PCI: Remove device links to PHY Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-04 7:57 ` Vladimir Oltean [this message]
2026-05-04 7:57 ` Vladimir Oltean
2026-05-04 7:57 ` Vladimir Oltean
2026-05-04 7:57 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 09/27] scsi: ufs: exynos: stop poking into struct phy guts Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-04 11:48 ` Vladimir Oltean
2026-05-04 11:48 ` Vladimir Oltean
2026-05-04 11:48 ` Vladimir Oltean
2026-05-04 11:48 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 10/27] scsi: ufs: qcom: keep parallel track of PHY power state Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 11/27] scsi: ufs: qcom: include missing <linux/interrupt.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 12/27] drm/rockchip: dw_hdmi: avoid direct dereference of phy->dev.of_node Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 13/27] usb: host: tegra: " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-05 9:39 ` Vladimir Oltean
2026-05-05 9:39 ` Vladimir Oltean
2026-05-05 9:39 ` Vladimir Oltean
2026-05-05 9:39 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 14/27] usb: gadget: tegra-xudc: " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-05 9:34 ` Vladimir Oltean
2026-05-05 9:34 ` Vladimir Oltean
2026-05-05 9:34 ` Vladimir Oltean
2026-05-05 9:34 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 15/27] phy: move provider API out of public <linux/phy/phy.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-05 9:30 ` Vladimir Oltean
2026-05-05 9:30 ` Vladimir Oltean
2026-05-05 9:30 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 16/27] phy: make phy_get_mode(), phy_(get|set)_bus_width() NULL tolerant Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 17/27] phy: introduce phy_get_max_link_rate() helper for consumers Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:59 ` Geert Uytterhoeven
2026-04-30 11:59 ` Geert Uytterhoeven
2026-04-30 11:59 ` Geert Uytterhoeven
2026-04-30 11:59 ` Geert Uytterhoeven
2026-04-30 13:14 ` Vladimir Oltean
2026-04-30 13:14 ` Vladimir Oltean
2026-04-30 13:14 ` Vladimir Oltean
2026-04-30 13:14 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 18/27] drm/rockchip: dsi: include PHY provider header Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 19/27] drm: bridge: cdns-mhdp8546: use consumer API for getting PHY bus width Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 20/27] media: sunxi: a83-mips-csi2: include PHY provider header Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 21/27] net: renesas: rswitch: " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-05 9:24 ` Vladimir Oltean
2026-05-05 9:24 ` Vladimir Oltean
2026-05-05 9:24 ` Vladimir Oltean
2026-05-05 9:24 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 22/27] pinctrl: tegra-xusb: " Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 23/27] power: supply: cpcap-charger: include missing <linux/property.h> Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 24/27] phy: include PHY provider header (1/2) Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 25/27] phy: include PHY provider header (2/2) Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-05-05 9:22 ` Vladimir Oltean
2026-05-05 9:22 ` Vladimir Oltean
2026-05-05 9:22 ` Vladimir Oltean
2026-05-05 9:22 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 26/27] phy: remove temporary provider compatibility from consumer header Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` [PATCH v7 phy-next 27/27] MAINTAINERS: add regexes for linux-phy Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
2026-04-30 11:06 ` Vladimir Oltean
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=20260504075742.ixt7phu4cpp433q5@skbuf \
--to=vladimir.oltean@nxp.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=bhelgaas@google.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=kwilczynski@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-sunxi@lists.linux.dev \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=mani@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=netdev@vger.kernel.org \
--cc=robh@kernel.org \
--cc=s-vadapalli@ti.com \
--cc=spacemit@lists.linux.dev \
--cc=vigneshr@ti.com \
--cc=vkoul@kernel.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 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.