Hi Michael, Thanks for the review. I will post a v3 with the following.
On Sun, Aug 02, 2026 at 05:10:21PM -0400, Michael S. Tsirkin wrote: > On Fri, Jul 31, 2026 at 11:17:00AM +0800, Xixin Liu wrote: > > virtio-pci only registered reset_prepare/reset_done. The PCI error > > recovery core treats devices without error_detected as NO_AER_DRIVER and > > does not deliver pci_channel_io_perm_failure to the driver after a failed > > recovery. > > Maybe it should? Agreed that the current PCI core behaviour is awkward for drivers that only wire reset_prepare/reset_done. Without .error_detected the recovery core votes NO_AER_DRIVER on the first broadcast, and report_perm_failure_detected skips the driver callback whenever overall status is not RECOVERED. That skip covers NO_AER_DRIVER even when subordinate reset succeeded. uevent DISCONNECT is still emitted. Changing the core would be a PCI-wide policy change. This series registers .error_detected and joins the existing ERS contract the same way other ERS-aware drivers do. Happy to follow up on the PCI side if that is preferred. > > + * permanent failure break virtqueues (follow-up may call driver > > + * .shutdown for block teardown). > > block specifically? this is common code. Right, that wording was wrong for virtio-pci. On perm_failure the common path only calls virtio_break_device() and returns DISCONNECT. Same for every virtio device. > > + return PCI_ERS_RESULT_NEED_RESET; > > so I guess pci will do slot reset? but what will call driver reset > later? confused. NEED_RESET asks for a PCI bus or slot reset. On AER that is aer_root_reset() then pci_bus_error_reset(). That path does not call .reset_prepare or .reset_done; those hooks still serve FLR. Driver restore after a successful reset is .slot_reset. v3 adds that hook and it restores config then calls virtio_device_reset_done(). Quiesce stays in error_detected on frozen via virtio_device_reset_prepare(). If the PCI reset fails, .slot_reset is skipped and perm_failure only breaks the device. > > + default: > > + break; > > + } > > + return PCI_ERS_RESULT_NEED_RESET; > > here, too, and we didn't virtio_device_reset_prepare either. Right. pci_channel_state_t today is only normal, frozen, and perm_failure. In v3 frozen and default share one path: quiesce via virtio_device_reset_prepare(), then NEED_RESET. Thanks, Xixin

