RE: [PATCH rc] PCI: Fix nested pci_dev_reset_iommu_prepare/done()

Tian, Kevin
2026-03-19T02:22:44Z

> From: Nicolin Chen <nicolinc@nvidia.com>
> Sent: Thursday, March 19, 2026 6:00 AM
>
> Shuai found that cxl_reset_bus_function() calls pci_reset_bus_function()
> internally while both are calling pci_dev_reset_iommu_prepare/done().
>
> This results in a nested pci_dev_reset_iommu_prepare/done() call:
> cxl_reset_bus_function():
> pci_dev_reset_iommu_prepare(); // outer
> pci_reset_bus_function():
> pci_dev_reset_iommu_prepare(); // inner (re-entry)
> ...
> pci_dev_reset_iommu_done(); // inner
> pci_dev_reset_iommu_done(); // outer
>
> However, pci_dev_reset_iommu_prepare() doesn't allow a re-entry for now.
>
> Digging further, I found that most functions in pci_dev_specific_reset()
> except reset_ivb_igd() are calling pcie_flr() that has nested those two
> functions as well.
>
> Drop the outer callbacks in:
> - cxl_reset_bus_function()
> - pci_dev_specific_reset()
>
> Replace with adding the callbacks in:
> + reset_ivb_igd()
>

I wonder whether it's cleaner to just make pci_dev_reset_iommu_prepare()
reentrant here.

what this patch does requires additional attention on specific reset functions.

e.g. reset_hinic_vf_dev() has a special logic waiting for firmware reset
done after calling pcie_flr(). With this patch the _done() notification will
be triggered earlier than expectation.

the original way is more maintainable with prepare/done equipped in
the highest level reset helpers in pci_reset_fn_methods[].

btw the AI review tool gave a comment:

https://sashiko.dev/#/patchset/20260318220028.1146905-1-nicolinc%40nvidia.com

it won't hold if my proposal is agreed. But it still applies to your quarantine
series which relies on accurate report of success reset.