Yes, better ! -----Original Message----- From: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> Sent: Friday, September 25, 2020 8:38 PM To: Zhao, Haifeng <haifeng.zhao@xxxxxxxxx> Cc: bhelgaas@xxxxxxxxxx; oohall@xxxxxxxxx; ruscur@xxxxxxxxxx; lukas@xxxxxxxxx; stuart.w.hayes@xxxxxxxxx; mr.nuke.me@xxxxxxxxx; mika.westerberg@xxxxxxxxxxxxxxx; linux-pci@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Jia, Pei P <pei.p.jia@xxxxxxxxx> Subject: Re: [PATCH 4/5] PCI: only return true when dev io state is really changed On Thu, Sep 24, 2020 at 10:34:22PM -0400, Ethan Zhao wrote: > When uncorrectable error happens, AER driver and DPC driver interrupt > handlers likely call > pcie_do_recovery()->pci_walk_bus()->report_frozen_detected() with > pci_channel_io_frozen the same time. Call chains are better to read if they split like foo() -> bar() -> baz() > If pci_dev_set_io_state() return true even if the original state is > pci_channel_io_frozen, that will cause AER or DPC handler re-enter the > error detecting and recovery procedure one after another. > The result is the recovery flow mixed between AER and DPC. > So simplify the pci_dev_set_io_state() function to only return true > when dev->error_state is changed. ... > + if (dev->error_state != new) { > dev->error_state = new; > + changed = true; > + } > return changed; Perhaps if (dev->error_state == new) return changed; dev->error_state = new; return true; ? -- With Best Regards, Andy Shevchenko