Re: [PATCH v18 11/13] PCI: Cache PCI DSN into pci_dev->dsn during probe

"Bowman, Terry" <[email protected]>
Newsgroups org.kernel.vger.linux-acpi,org.kernel.vger.linux-cxl,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.ozlabs.lists.linuxppc-dev
Message-ID <[email protected]>
On 7/18/2026 2:02 AM, Lukas Wunner wrote:
> On Fri, Jul 17, 2026 at 05:27:04PM -0500, Terry Bowman wrote:
>> Add a u64 dsn field to struct pci_dev and populate it from pci_get_dsn()
>> during pci_init_capabilities() at probe time via pci_dsn_init(). Only
>> write dev->dsn when the read succeeds. The zero initial value from
>> pci_dev allocation already represents 'no DSN available.'
> 
> The DSN is already cached on (natively handled) PCIe hotplug ports
> to detect device replacement during system sleep, see struct controller
> in drivers/pci/hotplug/pciehp.h.
> 
> Please remove that member from struct controller, remove the two
> assignments to the member in pciehp_configure_device() and pcie_init()
> and change the comparison in pciehp_device_replaced() to use the new
> member in struct pci_dev.  You can do this either as part of this patch
> or in a separate patch.
> 
> Thanks,
> 
> Lukas

Hi Lukas,

Thanks for reviewing. Is this the changes you want?

diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
index debc79b0adfb2..12ec050d8a0fb 100644
--- a/drivers/pci/hotplug/pciehp.h
+++ b/drivers/pci/hotplug/pciehp.h
@@ -90,7 +90,6 @@ extern int pciehp_poll_time;
  */
 struct controller {
        struct pcie_device *pcie;
-       u64 dsn;
 
        u32 slot_cap;                           /* capabilities and quirks */
        unsigned int inband_presence_disabled:1;
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
index 4c62140a3cb44..c07957e0b37a8 100644
--- a/drivers/pci/hotplug/pciehp_hpc.c
+++ b/drivers/pci/hotplug/pciehp_hpc.c
@@ -587,7 +587,7 @@ bool pciehp_device_replaced(struct controller *ctrl)
             reg != (pdev->subsystem_vendor | (pdev->subsystem_device << 16))))
                return true;
 
-       if (pci_get_dsn(pdev) != ctrl->dsn)
+       if (pci_get_dsn(pdev) != pdev->dsn)
                return true;
 
        return false;
@@ -1086,8 +1086,6 @@ struct controller *pcie_init(struct pcie_device *dev)
        }
 
        pdev = pci_get_slot(subordinate, PCI_DEVFN(0, 0));
-       if (pdev)
-               ctrl->dsn = pci_get_dsn(pdev);
        pci_dev_put(pdev);
 
        return ctrl;
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c
index 65e50bee1a8c0..065e1f7c9a7bd 100644
--- a/drivers/pci/hotplug/pciehp_pci.c
+++ b/drivers/pci/hotplug/pciehp_pci.c
@@ -73,7 +73,6 @@ int pciehp_configure_device(struct controller *ctrl)
        down_read_nested(&ctrl->reset_lock, ctrl->depth);
 
        dev = pci_get_slot(parent, PCI_DEVFN(0, 0));
-       ctrl->dsn = pci_get_dsn(dev);
        pci_dev_put(dev);
 
  out:

-Terry
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.