Address error and recovery for AER and DPC
Subsystems (2)
v13 cover Address error and recovery for AER and DPC
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get triggered (for e.g. ERR_FATAL), callbacks are handled appropriately.
DPC should behave identical to AER as far as error handling is concerned. DPC should remove the devices and not to do recovery for hotplug enabled system.
Changes since v13:
Bjorn's and Keith's Comments addressed.
> Made DPC and AER error handling identical <aligned err.c>
> hanldled cases for hotplug enabled system differently.
Changes since v11:
Bjorn's comments addressed.
> rename pcie-err.c to err.c
> removed EXPORT_SYMBOL
> made generic find_serivce function in port driver.
> removed mutex patch as no need to have mutex in pcie_do_recovery > brough in DPC_FATAL in aer.h
> so now all the error codes (AER and DPC) are unified in aer.h
Changes since v10:
Christoph Hellwig's, David Laight's and Randy Dunlap's
comments addressed.
> renamed pci_do_recovery to pcie_do_recovery
> removed inner braces in conditional statements.
> restrctured the code in pci_wait_for_link
> EXPORT_SYMBOL_GPL
Changes since v9:
Sinan's comments addressed.
> bool active = true; unnecessary variable removed.
Changes since v8:
Fixed Kbuild errors.
Changes since v7:
Rebased the code on pci master
> https://kernel.googlesource.com/pub/scm/linux/kernel/git/helgaas/pci
Changes since v6:
Sinan's and Stefan's comments implemented.
> reordered patch 6 and 7
> cleaned up
Changes since v5:
Sinan's and Keith's comments incorporated.
> made separate patch for mutex
> unified error repotting codes into driver/pci/pci.h
> got rid of wait link active/inactive and
made generic function in driver/pci/pci.c
Changes since v4:
Bjorn's comments incorporated.
> Renamed only do_recovery.
> moved the things more locally to drivers/pci/pci.h
Changes since v3:
Bjorn's comments incorporated.
> Made separate patch renaming generic pci_err.c
> Introduce pci_err.h to contain all the error types and recovery > removed all the dependencies on pci.h
Changes since v2:
Based on feedback from Keith:
"
When DPC is triggered due to receipt of an uncorrectable error Message, the Requester ID from the Message is recorded in the DPC Error Source ID register and that Message is discarded and not forwarded Upstream. "
Removed the patch where AER checks if DPC service is active
Changes since v1:
Kbuild errors fixed:
> pci_find_dpc_dev made static
> ras_event.h updated
> pci_find_aer_service call with CONFIG check
> pci_find_dpc_service call with CONFIG check
Oza Pawandeep (6):
PCI/AER: Rename error recovery to generic PCI naming PCI/AER: Factor out error reporting from AER PCI/PORTDRV: Implement generic find service PCI/DPC: Unify and plumb error handling into DPC
PCI: Unify wait for link active into generic PCI PCI/DPC: Do not do recovery for hotplug enabled system
drivers/pci/hotplug/pciehp_hpc.c | 20 +-- drivers/pci/pci.c | 29 ++++ drivers/pci/pci.h | 5 + drivers/pci/pcie/Makefile | 2 +- drivers/pci/pcie/aer/aerdrv.h | 30 ---- drivers/pci/pcie/aer/aerdrv_core.c | 317 +--------------------------------- drivers/pci/pcie/err.c | 340 +++++++++++++++++++++++++++++++++++++ drivers/pci/pcie/pcie-dpc.c | 107 +++++++++--- drivers/pci/pcie/portdrv.h | 2 + drivers/pci/pcie/portdrv_core.c | 45 +++++ include/linux/aer.h | 2 + 11 files changed, 509 insertions(+), 390 deletions(-) create mode 100644 drivers/pci/pcie/err.c
Signature · 1 line
2.7.4
PATCH v13 1/6 PCI/AER: Rename error recovery to generic PCI naming
This patch renames error recovery to generic name with pcie prefix
drivers/pci/pci.h +3 -0
@@ -342,6 +342,9 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,void pci_enable_acs (struct pci_dev *dev); +/* PCI error reporting and recovery */ +void pcie_do_recovery (struct pci_dev *dev,int severity); +#ifdef CONFIG_PCIEASPM void pcie_aspm_init_link_state (struct pci_dev *pdev);void pcie_aspm_exit_link_state (struct pci_dev *pdev);
drivers/pci/pcie/aer/aerdrv_core.c +4 -4
@@ -478,7 +478,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev) }/** -* do_recovery - handle nonfatal/fatal error recovery process +* pcie_do_recovery - handle nonfatal/fatal error recovery process * @dev: pointer to a pci_dev data structure of agent detecting an error * @severity: error severity type *
@@ -486,7 +486,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev)* error detected message to all downstream drivers within a hierarchy in * question and return the returned code. */ -static void do_recovery (struct pci_dev *dev,int severity) +static void pcie_do_recovery (struct pci_dev *dev,int severity) {pci_ers_result_t status, result =PCI_ERS_RESULT_RECOVERED ;enum pci_channel_state state;
@@ -566,7 +566,7 @@ static void handle_error_source(struct pcie_device *aerdev,pci_write_config_dword (dev, pos +PCI_ERR_COR_STATUS , info->status); }else -do_recovery (dev, info->severity); +pcie_do_recovery (dev, info->severity); }#ifdef CONFIG_ACPI_APEI_PCIEAER
@@ -631,7 +631,7 @@ static void aer_recover_work_func(struct work_struct *work) }cper_print_aer (pdev, entry.severity, entry.regs);if (entry.severity !=AER_CORRECTABLE ) -do_recovery (pdev, entry.severity); +pcie_do_recovery (pdev, entry.severity);pci_dev_put (pdev); } }
Signature · 1 line
2.7.4
Re: [PATCH v13 1/6] PCI/AER: Rename error recovery to generic PCI naming
Quoted 3 lines · Oza Pawandeep
This patch renames error recovery to generic name with pcie prefix
Signed-off-by Oza Pawandeep <[email protected]>
Looks fine.
PATCH v13 2/6 PCI/AER: Factor out error reporting from AER
In reply to Oza PawandeepThis patch factors out error reporting callbacks, which are currently tightly coupled with AER.
DPC should be able to register callbacks and attempt recovery when DPC trigger event occurs.
drivers/pci/pcie/Makefile +1 -1
@@ -6,7 +6,7 @@ # Build PCI Express ASPM if needed obj-$(CONFIG_PCIEASPM) += aspm.o -pcieportdrv-y := portdrv_core.o portdrv_pci.o portdrv_bus.o +pcieportdrv-y := portdrv_core.o portdrv_pci.o portdrv_bus.o err.o pcieportdrv-$(CONFIG_ACPI) += portdrv_acpi.o obj-$(CONFIG_PCIEPORTBUS) += pcieportdrv.o
drivers/pci/pcie/aer/aerdrv.h +0 -30
@@ -76,36 +76,6 @@ struct aer_rpc {*/ }; -struct aer_broadcast_data { -enum pci_channel_state state; -enum pci_ers_result result; -}; - -static inline pci_ers_result_t merge_result (enum pci_ers_result orig, -enum pci_ers_result new) -{ -if (new ==PCI_ERS_RESULT_NO_AER_DRIVER ) -return PCI_ERS_RESULT_NO_AER_DRIVER ; - -if (new ==PCI_ERS_RESULT_NONE ) -return orig; - -switch (orig) { -case PCI_ERS_RESULT_CAN_RECOVER : -case PCI_ERS_RESULT_RECOVERED : - orig = new; -break ; -case PCI_ERS_RESULT_DISCONNECT : -if (new ==PCI_ERS_RESULT_NEED_RESET ) - orig =PCI_ERS_RESULT_NEED_RESET ; -break ; -default : -break ; - } - -return orig; -} -extern struct bus_type pcie_port_bus_type;void aer_isr (struct work_struct *work);void aer_print_error (struct pci_dev *dev,struct aer_err_info *info);
drivers/pci/pcie/aer/aerdrv_core.c +2 -287
313 lines not on this page · raw message
drivers/pci/pcie/err.c new file +332 -0
332 lines not on this page · raw message
drivers/pci/pcie/portdrv.h +1 -0
@@ -79,4 +79,5 @@ static inline void pcie_port_platform_notify(struct pci_dev *port, int *mask)static inline void pcie_port_platform_notify (struct pci_dev *port,int *mask){}#endif /* !CONFIG_ACPI */ +struct pcie_port_service_driver *find_aer_service (struct pci_dev *dev);#endif /* _PORTDRV_H_ */
Signature · 1 line
2.7.4
Re: [PATCH v13 2/6] PCI/AER: Factor out error reporting from AER
Quoted 7 lines · Oza Pawandeep
This patch factors out error reporting callbacks, which are currently tightly coupled with AER.
DPC should be able to register callbacks and attempt recovery when DPC trigger event occurs.
Signed-off-by Oza Pawandeep <[email protected]>
Looks fine.
kbuild test robot
build botRe: [PATCH v13 2/6] PCI/AER: Factor out error reporting from AER
In reply to Oza PawandeepThank you for the patch! Yet something to improve:
Hi Oza,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on v4.16]
[cannot apply to pci/next linus/master next-20180410]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Oza-Pawandeep/Address-error-and-recovery-for-AER-and-DPC/20180410-045644
config: x86_64-randconfig-s4-04101607 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 Note: the linux-review/Oza-Pawandeep/Address-error-and-recovery-for-AER-and-DPC/20180410-045644 HEAD db413d3e52b272ef8e6f03ff125e65468abd31e6 builds fine.
It only hurts bisectibility.
All errors (new ones prefixed by >>):
drivers/pci/pcie/err.o: In function `reset_link':
>> drivers/pci/pcie/err.c:197: undefined reference to `find_aer_service'
vim +197 drivers/pci/pcie/err.c
181
182 static pci_ers_result_t reset_link(struct pci_dev *dev)
183 {
184 struct pci_dev *udev;
185 pci_ers_result_t status;
186 struct pcie_port_service_driver *driver = NULL;
187
188 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
189 /* Reset this port for all subordinates */
190 udev = dev;
191 } else {
192 /* Reset the upstream component (likely downstream port) */
193 udev = dev->bus->self;
194 }
195
196 /* Use the aer driver of the component firstly */
> 197 driver = find_aer_service(udev);
198
199 if (driver && driver->reset_link) {
200 status = driver->reset_link(udev);
201 } else if (udev->has_secondary_link) {
202 status = default_reset_link(udev);
203 } else {
204 pci_printk(KERN_DEBUG, dev,
205 "no link-reset support at upstream device %s\n",
206 pci_name(udev));
207 return PCI_ERS_RESULT_DISCONNECT;
208 }
209
210 if (status != PCI_ERS_RESULT_RECOVERED) {
211 pci_printk(KERN_DEBUG, dev,
212 "link reset at upstream device %s failed\n",
213 pci_name(udev));
214 return PCI_ERS_RESULT_DISCONNECT;
215 }
216
217 return status;
218 }
219
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
PATCH v13 3/6 PCI/PORTDRV: Implement generic find service
In reply to Oza PawandeepThis patch implements generic pcie_port_find_service() routine.
drivers/pci/pcie/aer/aerdrv_core.c +0 -26
@@ -231,32 +231,6 @@ static bool find_source_device(struct pci_dev *parent,return true; } -static int find_aer_service_iter (struct device *device,void *data) -{ -struct pcie_port_service_driver *service_driver, **drv; - - drv = (struct pcie_port_service_driver **) data; - -if (device->bus == &pcie_port_bus_type && device->driver) { - service_driver =to_service_driver (device->driver); -if (service_driver->service ==PCIE_PORT_SERVICE_AER ) { - *drv = service_driver; -return 1 ; - } - } - -return 0 ; -} - -struct pcie_port_service_driver *find_aer_service (struct pci_dev *dev) -{ -struct pcie_port_service_driver *drv =NULL ; - -device_for_each_child (&dev->dev, &drv, find_aer_service_iter); - -return drv; -} -/** * handle_error_source - handle logging error into an event log * @aerdev: pointer to pcie_device data structure of the root port
drivers/pci/pcie/err.c +1 -1
@@ -194,7 +194,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev) }/* Use the aer driver of the component firstly */ - driver =find_aer_service (udev); + driver =pcie_port_find_service (udev,PCIE_PORT_SERVICE_AER );if (driver && driver->reset_link) { status = driver->reset_link (udev);
drivers/pci/pcie/portdrv.h +2 -1
@@ -79,5 +79,6 @@ static inline void pcie_port_platform_notify(struct pci_dev *port, int *mask)static inline void pcie_port_platform_notify (struct pci_dev *port,int *mask){}#endif /* !CONFIG_ACPI */ -struct pcie_port_service_driver *find_aer_service (struct pci_dev *dev); +struct pcie_port_service_driver *pcie_port_find_service (struct pci_dev *dev, +u32 service);#endif /* _PORTDRV_H_ */
drivers/pci/pcie/portdrv_core.c +45 -0
57 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v13 3/6] PCI/PORTDRV: Implement generic find service
Quoted 3 lines · Oza Pawandeep
This patch implements generic
pcie_port_find_service()routine.Signed-off-by Oza Pawandeep <[email protected]>
Looks good.
PATCH v13 4/6 PCI/DPC: Unify and plumb error handling into DPC
In reply to Oza PawandeepCurrent DPC driver does not do recovery, e.g. calling end-point's driver's callbacks, which sanitize the sw.
DPC driver implements link_reset callback, and calls pci_do_recovery().
drivers/pci/pcie/err.c +14 -6
@@ -19,6 +19,7 @@#include <linux/aer.h> #include <linux/pcieport_if.h> #include "portdrv.h" +#include "./../pci.h" struct aer_broadcast_data {enum pci_channel_state state;
@@ -179,11 +180,12 @@ static pci_ers_result_t default_reset_link(struct pci_dev *dev)return PCI_ERS_RESULT_RECOVERED ; } -static pci_ers_result_t reset_link (struct pci_dev *dev) +static pci_ers_result_t reset_link (struct pci_dev *dev,int severity) {struct pci_dev *udev;pci_ers_result_t status;struct pcie_port_service_driver *driver =NULL ; +u32 service;if (dev->hdr_type ==PCI_HEADER_TYPE_BRIDGE ) {/* Reset this port for all subordinates */
@@ -193,8 +195,12 @@ static pci_ers_result_t reset_link(struct pci_dev *dev) udev = dev->bus->self; } -/* Use the aer driver of the component firstly */ - driver =pcie_port_find_service (udev,PCIE_PORT_SERVICE_AER ); +if (severity ==DPC_FATAL ) + service =PCIE_PORT_SERVICE_DPC ; +else + service =PCIE_PORT_SERVICE_AER ; + + driver =pcie_port_find_service (udev, service);if (driver && driver->reset_link) { status = driver->reset_link (udev);
@@ -281,7 +287,8 @@ void pcie_do_recovery(struct pci_dev *dev, int severity)pci_ers_result_t status, result =PCI_ERS_RESULT_RECOVERED ;enum pci_channel_state state; -if (severity ==AER_FATAL ) +if ((severity ==AER_FATAL ) || + (severity ==DPC_FATAL )) state = pci_channel_io_frozen;else state = pci_channel_io_normal;
@@ -291,8 +298,9 @@ void pcie_do_recovery(struct pci_dev *dev, int severity)"error_detected" , report_error_detected); -if (severity ==AER_FATAL ) { - result =reset_link (dev); +if ((severity ==AER_FATAL ) || + (severity ==DPC_FATAL )) { + result =reset_link (dev, severity);if (result !=PCI_ERS_RESULT_RECOVERED ) goto failed; }
drivers/pci/pcie/pcie-dpc.c +58 -6
109 lines not on this page · raw message
include/linux/aer.h +2 -0
@@ -15,6 +15,8 @@#define AER_FATAL 1#define AER_CORRECTABLE 2 +#define DPC_FATAL 4 +struct pci_dev ;struct aer_header_log_regs {
Signature · 1 line
2.7.4
Re: [PATCH v13 4/6] PCI/DPC: Unify and plumb error handling into DPC
Quoted 16 lines · Oza Pawandeep
drivers/pci/pcie/pcie-dpc.c +16
-0+static int find_dpc_dev_iter (struct device *device,void *data) +{ +struct pcie_port_service_driver *service_driver; +struct device **dev; + + dev = (struct device **) data; + +if (device->bus == &pcie_port_bus_type && device->driver) { + service_driver =to_service_driver (device->driver); +if (service_driver->service ==PCIE_PORT_SERVICE_DPC ) { + *dev = device; +return 1 ; + } + } + +return 0 ;
drivers/pci/pcie/pcie-dpc.c static const char * const rp_pio_error_string[] = { · line 74
Quoted 10 lines
drivers/pci/pcie/pcie-dpc.c +10
-0+} + +static struct device *pci_find_dpc_dev (struct pci_dev *pdev) +{ +struct device *dev =NULL ; + +device_for_each_child (&pdev->dev, &dev, find_dpc_dev_iter); + +return dev; +}
The only caller of this doesn't seem to care to use struct device. This should probably just extract struct dpc_dev directly from in here.
Re: [PATCH v13 4/6] PCI/DPC: Unify and plumb error handling into DPC
Quoted 22 lines · Keith Busch
Quoted 21 lines · Oza Pawandeep
drivers/pci/pcie/pcie-dpc.c +21
-0+static int find_dpc_dev_iter (struct device *device,void *data) +{ +struct pcie_port_service_driver *service_driver; +struct device **dev; + + dev = (struct device **) data; + +if (device->bus == &pcie_port_bus_type && device->driver) { + service_driver =to_service_driver (device->driver); +if (service_driver->service ==PCIE_PORT_SERVICE_DPC ) { + *dev = device; +return 1 ; + } + } + +return 0 ; +} + +static struct device *pci_find_dpc_dev (struct pci_dev *pdev) +{ +struct device *dev =NULL ;
Quoted 9 lines
drivers/pci/pcie/pcie-dpc.c static const char * const rp_pio_error_string[] = { · line 74
Quoted 5 lines
drivers/pci/pcie/pcie-dpc.c +5
-0+ +device_for_each_child (&pdev->dev, &dev, find_dpc_dev_iter); + +return dev; +}The only caller of this doesn't seem to care to use struct device. This should probably just extract struct
dpc_devdirectly from in here.
Bjorn wants to kill the port service driver infrastructure but that is a much bigger task.
How do we obtain the DPC object from the parent object directly? Each port service driver object is a children.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 4/6] PCI/DPC: Unify and plumb error handling into DPC
Quoted 33 lines · Sinan Kaya
Quoted 22 lines · Keith Busch
Quoted 21 lines · Oza Pawandeep
drivers/pci/pcie/pcie-dpc.c +21
-0+static int find_dpc_dev_iter (struct device *device,void *data) +{ +struct pcie_port_service_driver *service_driver; +struct device **dev; + + dev = (struct device **) data; + +if (device->bus == &pcie_port_bus_type && device->driver) { + service_driver =to_service_driver (device->driver); +if (service_driver->service ==PCIE_PORT_SERVICE_DPC ) { + *dev = device; +return 1 ; + } + } + +return 0 ; +} + +static struct device *pci_find_dpc_dev (struct pci_dev *pdev) +{ +struct device *dev =NULL ;Quoted 9 lines
drivers/pci/pcie/pcie-dpc.c static const char * const rp_pio_error_string[] = { · line 74
Quoted 5 lines
drivers/pci/pcie/pcie-dpc.c +5
-0+ +device_for_each_child (&pdev->dev, &dev, find_dpc_dev_iter); + +return dev; +}The only caller of this doesn't seem to care to use struct device. This should probably just extract struct
dpc_devdirectly from in here.
Quoted 6 lines
Bjorn wants to kill the port service driver infrastructure but that is a much bigger task.
How do we obtain the DPC object from the parent object directly? Each port service driver object is a children.
How about implementing pcie_port_find_service_dev() as a follow up patch to "PCI/PORTDRV: Implement generic find service" similar to what was done for pcie_port_find_service()?
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
PATCH v13 5/6 PCI: Unify wait for link active into generic PCI
In reply to Oza PawandeepClients such as HP, DPC are using pcie_wait_link_active(), which waits till the link becomes active or inactive.
Made generic function and moved it to drivers/pci/pci.c
drivers/pci/hotplug/pciehp_hpc.c +3 -17
@@ -231,25 +231,11 @@ bool pciehp_check_link_active(struct controller *ctrl)return ret; } -static void __pcie_wait_link_active (struct controller *ctrl,bool active) -{ -int timeout =1000 ; - -if (pciehp_check_link_active (ctrl) == active) -return ; -while (timeout >0 ) { -msleep (10 ); - timeout -=10 ; -if (pciehp_check_link_active (ctrl) == active) -return ; - } -ctrl_dbg (ctrl,"Data Link Layer Link Active not %s in 1000 msec\n" , - active ?"set" :"cleared" ); -} -static void pcie_wait_link_active (struct controller *ctrl) { -__pcie_wait_link_active (ctrl, true); +struct pci_dev *pdev =ctrl_dev (ctrl); + +pcie_wait_for_link (pdev, true); }static bool pci_bus_check_dev (struct pci_bus *bus,int devfn)
drivers/pci/pci.c +29 -0
@@ -4176,6 +4176,35 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)return 0 ; } +/** +* pcie_wait_for_link - Wait for link till it's active/inactive +* @pdev: Bridge device +* @active: waiting for active or inactive ? +* +* Use this to wait till link becomes active or inactive. +*/ +bool pcie_wait_for_link (struct pci_dev *pdev,bool active) +{ +int timeout =1000 ; +bool ret; +u16 lnk_status; + +for (;;) { +pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); + ret = !!(lnk_status &PCI_EXP_LNKSTA_DLLLA ); +if (ret == active) +return true; +if (timeout <=0 ) +break ; + timeout -=10 ; + } + +pci_info (pdev,"Data Link Layer Link Active not %s in 1000 msec\n" , + active ?"set" :"cleared" ); + +return false; +} +void pci_reset_secondary_bus (struct pci_dev *dev) {u16 ctrl;
drivers/pci/pci.h +2 -0
@@ -345,6 +345,8 @@ void pci_enable_acs(struct pci_dev *dev);/* PCI error reporting and recovery */ void pcie_do_recovery (struct pci_dev *dev,int severity); +bool pcie_wait_for_link (struct pci_dev *pdev,bool active); +#ifdef CONFIG_PCIEASPM void pcie_aspm_init_link_state (struct pci_dev *pdev);void pcie_aspm_exit_link_state (struct pci_dev *pdev);
drivers/pci/pcie/pcie-dpc.c +1 -11
@@ -95,19 +95,9 @@ static int dpc_wait_rp_inactive(struct dpc_dev *dpc)static void dpc_wait_link_inactive (struct dpc_dev *dpc) { -unsigned long timeout = jiffies +HZ ;struct pci_dev *pdev = dpc->dev->port; -struct device *dev = &dpc->dev->device; -u16 lnk_status; -pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); -while (lnk_status &PCI_EXP_LNKSTA_DLLLA && - !time_after (jiffies, timeout)) { -msleep (10 ); -pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); - } -if (lnk_status &PCI_EXP_LNKSTA_DLLLA ) -dev_warn (dev,"Link state not disabled for DPC event\n" ); +pcie_wait_for_link (pdev, false); }/**
Signature · 1 line
2.7.4
Re: [PATCH v13 5/6] PCI: Unify wait for link active into generic PCI
Quoted 12 lines · Oza Pawandeep
drivers/pci/pci.c +12
-0+/** +* pcie_wait_for_link - Wait for link till it's active/inactive +* @pdev: Bridge device +* @active: waiting for active or inactive ? +* +* Use this to wait till link becomes active or inactive. +*/ +bool pcie_wait_for_link (struct pci_dev *pdev,bool active) +{ +int timeout =1000 ; +bool ret; +u16 lnk_status;
drivers/pci/pci.c static int pci_pm_reset(struct pci_dev *dev, int probe) · line 4200
Quoted 10 lines
drivers/pci/pci.c +10
-0+ +for (;;) { +pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); + ret = !!(lnk_status &PCI_EXP_LNKSTA_DLLLA ); +if (ret == active) +return true; +if (timeout <=0 ) +break ; + timeout -=10 ; + }
This is missing an msleep(10) at each iteration.
Quoted 6 lines
drivers/pci/pci.c +6
-0+ +pci_info (pdev,"Data Link Layer Link Active not %s in 1000 msec\n" , + active ?"set" :"cleared" ); + +return false; +}
Re: [PATCH v13 5/6] PCI: Unify wait for link active into generic PCI
Quoted 17 lines · Keith Busch
Quoted 16 lines · Oza Pawandeep
drivers/pci/pci.c +16
-0+/** +* pcie_wait_for_link - Wait for link till it's active/inactive +* @pdev: Bridge device +* @active: waiting for active or inactive ? +* +* Use this to wait till link becomes active or inactive. +*/ +bool pcie_wait_for_link (struct pci_dev *pdev,bool active) +{ +int timeout =1000 ; +bool ret; +u16 lnk_status; + +for (;;) { +pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , &lnk_status); + ret = !!(lnk_status &PCI_EXP_LNKSTA_DLLLA );
Quoted 8 lines
drivers/pci/pci.c static int pci_pm_reset(struct pci_dev *dev, int probe) · line 4200
Quoted 6 lines
drivers/pci/pci.c +6
-0+if (ret == active) +return true; +if (timeout <=0 ) +break ; + timeout -=10 ; + }This is missing an msleep(10) at each iteration.
will take care.
Quoted 7 lines
Quoted 7 lines
drivers/pci/pci.c +6
-0+ +pci_info (pdev,"Data Link Layer Link Active not %s in 1000 msec\n" , + active ?"set" :"cleared" ); + +return false; +}
PATCH v13 6/6 PCI/DPC: Do not do recovery for hotplug enabled system
In reply to Oza PawandeepDPC and AER should attempt recovery in the same way, except the cases where system is with hotplug enabled.
drivers/pci/pcie/pcie-dpc.c +25 -16
@@ -108,8 +108,6 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc)*/ static pci_ers_result_t dpc_reset_link (struct pci_dev *pdev) { -struct pci_bus *parent = pdev->subordinate; -struct pci_dev *dev, *temp;struct dpc_dev *dpc;struct pcie_device *pciedev;struct device *devdpc;
@@ -120,19 +118,6 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) dpc =get_service_data (pciedev); cap = dpc->cap_pos; -pci_lock_rescan_remove (); -list_for_each_entry_safe_reverse (dev, temp, &parent->devices, - bus_list) { -pci_dev_get (dev); -pci_dev_set_disconnected (dev,NULL ); -if (pci_has_subordinate (dev)) -pci_walk_bus (dev->subordinate, - pci_dev_set_disconnected,NULL ); -pci_stop_and_remove_bus_device (dev); -pci_dev_put (dev); - } -pci_unlock_rescan_remove (); -dpc_wait_link_inactive (dpc);if (dpc->rp_extensions &&dpc_wait_rp_inactive (dpc))return PCI_ERS_RESULT_DISCONNECT ;
@@ -152,13 +137,37 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev)return PCI_ERS_RESULT_RECOVERED ; } +static void dpc_reset_link_remove_dev (struct pci_dev *pdev) +{ +struct pci_bus *parent = pdev->subordinate; +struct pci_dev *dev, *temp; + +pci_lock_rescan_remove (); +list_for_each_entry_safe_reverse (dev, temp, &parent->devices, + bus_list) { +pci_dev_get (dev); +pci_dev_set_disconnected (dev,NULL ); +if (pci_has_subordinate (dev)) +pci_walk_bus (dev->subordinate, + pci_dev_set_disconnected,NULL ); +pci_stop_and_remove_bus_device (dev); +pci_dev_put (dev); + } +pci_unlock_rescan_remove (); + +dpc_reset_link (pdev); +} +static void dpc_work (struct work_struct *work) { struct dpc_dev *dpc = container_of(work, struct dpc_dev, work);struct pci_dev *pdev = dpc->dev->port;/* From DPC point of view error is always FATAL. */ -pcie_do_recovery (pdev,DPC_FATAL ); +if (!pdev->is_hotplug_bridge) +pcie_do_recovery (pdev,DPC_FATAL ); +else +dpc_reset_link_remove_dev (pdev); }static void dpc_process_rp_pio_error (struct dpc_dev *dpc) {
Signature · 1 line
2.7.4
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 2 lines · Oza Pawandeep
DPC and AER should attempt recovery in the same way, except the cases where system is with hotplug enabled.
What's the connection with hotplug? I see from the patch that for hotplug bridges you remove the tree below the bridge, and otherwise you just reset the secondary link (I think).
The changelog should explain why we need the difference.
I'm a little skeptical to begin with, because I'm not sure why we should handle a DPC event differently just because a bridge has the *capability* of hotplug. Even if a hotplug bridge reports a DPC event, that doesn't necessarily mean a hotplug has occurred.
Quoted 77 lines
Signed-off-by Oza Pawandeep <[email protected]>drivers/pci/pcie/pcie-dpc.c +25
-16@@ -108,8 +108,6 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc)*/ static pci_ers_result_t dpc_reset_link (struct pci_dev *pdev) { -struct pci_bus *parent = pdev->subordinate; -struct pci_dev *dev, *temp;struct dpc_dev *dpc;struct pcie_device *pciedev;struct device *devdpc;@@ -120,19 +118,6 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) dpc =get_service_data (pciedev); cap = dpc->cap_pos; -pci_lock_rescan_remove (); -list_for_each_entry_safe_reverse (dev, temp, &parent->devices, - bus_list) { -pci_dev_get (dev); -pci_dev_set_disconnected (dev,NULL ); -if (pci_has_subordinate (dev)) -pci_walk_bus (dev->subordinate, - pci_dev_set_disconnected,NULL ); -pci_stop_and_remove_bus_device (dev); -pci_dev_put (dev); - } -pci_unlock_rescan_remove (); -dpc_wait_link_inactive (dpc);if (dpc->rp_extensions &&dpc_wait_rp_inactive (dpc))return PCI_ERS_RESULT_DISCONNECT ;@@ -152,13 +137,37 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev)return PCI_ERS_RESULT_RECOVERED ; } +static void dpc_reset_link_remove_dev (struct pci_dev *pdev) +{ +struct pci_bus *parent = pdev->subordinate; +struct pci_dev *dev, *temp; + +pci_lock_rescan_remove (); +list_for_each_entry_safe_reverse (dev, temp, &parent->devices, + bus_list) { +pci_dev_get (dev); +pci_dev_set_disconnected (dev,NULL ); +if (pci_has_subordinate (dev)) +pci_walk_bus (dev->subordinate, + pci_dev_set_disconnected,NULL ); +pci_stop_and_remove_bus_device (dev); +pci_dev_put (dev); + } +pci_unlock_rescan_remove (); + +dpc_reset_link (pdev); +} +static void dpc_work (struct work_struct *work) { struct dpc_dev *dpc = container_of(work, struct dpc_dev, work);struct pci_dev *pdev = dpc->dev->port;/* From DPC point of view error is always FATAL. */ -pcie_do_recovery (pdev,DPC_FATAL ); +if (!pdev->is_hotplug_bridge) +pcie_do_recovery (pdev,DPC_FATAL ); +else +dpc_reset_link_remove_dev (pdev); }static void dpc_process_rp_pio_error (struct dpc_dev *dpc) {Signature · 1 line
2.7.4
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 6 lines · Bjorn Helgaas
Quoted 2 lines
DPC and AER should attempt recovery in the same way, except the cases where system is with hotplug enabled.
What's the connection with hotplug? I see from the patch that for hotplug bridges you remove the tree below the bridge, and otherwise you just reset the secondary link (I think).
Quoted 7 lines
The changelog should explain why we need the difference.
I'm a little skeptical to begin with, because I'm not sure why we should handle a DPC event differently just because a bridge has the *capability* of hotplug. Even if a hotplug bridge reports a DPC event, that doesn't necessarily mean a hotplug has occurred.
Let's do a recap on what we have discussed about this until now.
There are two conflicting error recovery mechanisms for PCIe.
If a system supports both hotplug and DPC, endpoint can be removed and inserted safely. DPC driver shuts down the driver on link down. When link comes back up, hotplug driver takes over and initiates an enumeration process.
Keith mentioned the stop and re-enumerate design was chosen because someone could remove a drive and insert an unrelated drive back to the system. We can't really save and restore state as we do in the AER path.
Now, let's assume a system without hotplug capability.
Second mechanism is to go through DPC/AER path and do an automatic link down recovery via DPC retrain/secondary bus reset including register save and restore. Second mechanism is more suitable for handling "surprise link down" event. The goal is to retrain the link and continue driver operation.
The goal of this patch to separate these two cases from each other as the DPC driver needs to work on both contexts. Current DPC code doesn't handle the second use case.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
[+cc Alex because of his interest in device reset]
For context, here's the part of the patch we're discussing:
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
static void
dpc_work(struct work_struct *work){ struct dpc_dev *dpc = container_of(work, struct dpc_dev, work); struct pci_dev *pdev = dpc->dev->port;
Quoted 7 lines
Quoted 7 lines
drivers/pci/pcie/pcie-dpc.c static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) · line 171
Quoted 7 lines
/* From DPC point of view error is always FATAL. */drivers/pci/pcie/pcie-dpc.c +4
-1-pcie_do_recovery (pdev,DPC_FATAL ); +if (!pdev->is_hotplug_bridge) +pcie_do_recovery (pdev,DPC_FATAL ); +else +dpc_reset_link_remove_dev (pdev); }
This is at the point where DPC has been triggered in the hardware and the DPC driver is starting recovery, and I'm wondering why we need to handle the "!pdev->is_hotplug_bridge" case differently.
Quoted 33 lines · Sinan Kaya
Quoted 6 lines · Bjorn Helgaas
Quoted 2 lines
DPC and AER should attempt recovery in the same way, except the cases where system is with hotplug enabled.
What's the connection with hotplug? I see from the patch that for hotplug bridges you remove the tree below the bridge, and otherwise you just reset the secondary link (I think).
Quoted 6 lines
The changelog should explain why we need the difference.
I'm a little skeptical to begin with, because I'm not sure why we should handle a DPC event differently just because a bridge has the *capability* of hotplug. Even if a hotplug bridge reports a DPC event, that doesn't necessarily mean a hotplug has occurred.
Let's do a recap on what we have discussed about this until now.
There are two conflicting error recovery mechanisms for PCIe.
If a system supports both hotplug and DPC, endpoint can be removed and inserted safely. DPC driver shuts down the driver on link down. When link comes back up, hotplug driver takes over and initiates an enumeration process. Keith mentioned the stop and re-enumerate design was chosen because someone could remove a drive and insert an unrelated drive back to the system. We can't really save and restore state as we do in the AER path.
Now, let's assume a system without hotplug capability. Second mechanism is to go through DPC/AER path and do an automatic link down recovery via DPC retrain/secondary bus reset including register save and restore. Second mechanism is more suitable for handling "surprise link down" event. The goal is to retrain the link and continue driver operation.
Quoted 3 lines
The goal of this patch to separate these two cases from each other as the DPC driver needs to work on both contexts. Current DPC code doesn't handle the second use case.
I think the scenario you are describing is two systems that are identical except that in the first, the endpoint is below a hotplug bridge, while in the second, it's below a non-hotplug bridge. There's no physical hotplug (no drive removed or inserted), and DPC is triggered in both systems.
I suggest that DPC should be handled identically in both systems:
- The PCI core should have the same view of the endpoint: it should be removed and re-added in both cases (or in neither case).
- The endpoint itself should not be able to tell the difference: it should see a link down event, followed by a link retrain, followed by the same sequence of config accesses, etc.
- The endpoint driver should not be able to tell the difference, i.e., we should be calling the same pci_error_handlers callbacks in both cases.
It's true that in the non-hotplug system, pciehp probably won't start re-enumeration, so we might need an alternate path to trigger that.
But that's not what we're doing in this patch. In this patch we're adding a much bigger difference: for hotplug bridges, we stop and remove the hierarchy below the bridge; for non-hotplug bridges, we do the AER-style flow of calling pci_error_handlers callbacks.
Bjorn
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 78 lines · Bjorn Helgaas
[+cc Alex because of his interest in device reset]
For context, here's the part of the patch we're discussing:
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
static void
dpc_work(struct work_struct *work){ struct dpc_dev *dpc = container_of(work, struct dpc_dev, work); struct pci_dev *pdev = dpc->dev->port;Quoted 7 lines
Quoted 7 lines
drivers/pci/pcie/pcie-dpc.c static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) · line 171
Quoted 7 lines
/* From DPC point of view error is always FATAL. */drivers/pci/pcie/pcie-dpc.c +4
-1-pcie_do_recovery (pdev,DPC_FATAL ); +if (!pdev->is_hotplug_bridge) +pcie_do_recovery (pdev,DPC_FATAL ); +else +dpc_reset_link_remove_dev (pdev); }This is at the point where DPC has been triggered in the hardware and the DPC driver is starting recovery, and I'm wondering why we need to handle the "!pdev->is_hotplug_bridge" case differently.
Quoted 33 lines · Sinan Kaya
Quoted 6 lines · Bjorn Helgaas
Quoted 2 lines
DPC and AER should attempt recovery in the same way, except the cases where system is with hotplug enabled.
What's the connection with hotplug? I see from the patch that for hotplug bridges you remove the tree below the bridge, and otherwise you just reset the secondary link (I think).
Quoted 6 lines
The changelog should explain why we need the difference.
I'm a little skeptical to begin with, because I'm not sure why we should handle a DPC event differently just because a bridge has the *capability* of hotplug. Even if a hotplug bridge reports a DPC event, that doesn't necessarily mean a hotplug has occurred.
Let's do a recap on what we have discussed about this until now.
There are two conflicting error recovery mechanisms for PCIe.
If a system supports both hotplug and DPC, endpoint can be removed and inserted safely. DPC driver shuts down the driver on link down. When link comes back up, hotplug driver takes over and initiates an enumeration process. Keith mentioned the stop and re-enumerate design was chosen because someone could remove a drive and insert an unrelated drive back to the system. We can't really save and restore state as we do in the AER path.
Now, let's assume a system without hotplug capability. Second mechanism is to go through DPC/AER path and do an automatic link down recovery via DPC retrain/secondary bus reset including register save and restore. Second mechanism is more suitable for handling "surprise link down" event. The goal is to retrain the link and continue driver operation.
Quoted 3 lines
The goal of this patch to separate these two cases from each other as the DPC driver needs to work on both contexts. Current DPC code doesn't handle the second use case.
I think the scenario you are describing is two systems that are identical except that in the first, the endpoint is below a hotplug bridge, while in the second, it's below a non-hotplug bridge. There's no physical hotplug (no drive removed or inserted), and DPC is triggered in both systems.
I suggest that DPC should be handled identically in both systems:
- The PCI core should have the same view of the endpoint: it should be removed and re-added in both cases (or in neither case).
- The endpoint itself should not be able to tell the difference: it should see a link down event, followed by a link retrain, followed by the same sequence of config accesses, etc.
- The endpoint driver should not be able to tell the difference, i.e., we should be calling the same
pci_error_handlerscallbacks in both cases.
Quoted 7 lines
It's true that in the non-hotplug system, pciehp probably won't start re-enumeration, so we might need an alternate path to trigger that.
But that's not what we're doing in this patch. In this patch we're adding a much bigger difference: for hotplug bridges, we stop and remove the hierarchy below the bridge; for non-hotplug bridges, we do the AER-style flow of calling
pci_error_handlerscallbacks.
Our approach on V12 was to go to AER style recovery for all DPC events regardless of hotplug support or not.
Keith was not comfortable with this approach. That's why, we special cased hotplug.
If we drop 6/6 on this patch on v13, we achieve this. We still have to take care of Keith's inputs on individual patches.
we have been struggling with the direction for a while.
Keith, what do you think?
Quoted 3 lines
Bjorn
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 35 lines · Sinan Kaya
Quoted 20 lines · Bjorn Helgaas
I think the scenario you are describing is two systems that are identical except that in the first, the endpoint is below a hotplug bridge, while in the second, it's below a non-hotplug bridge. There's no physical hotplug (no drive removed or inserted), and DPC is triggered in both systems.
I suggest that DPC should be handled identically in both systems:
- The PCI core should have the same view of the endpoint: it should be removed and re-added in both cases (or in neither case).
- The endpoint itself should not be able to tell the difference: it should see a link down event, followed by a link retrain, followed by the same sequence of config accesses, etc.
- The endpoint driver should not be able to tell the difference, i.e., we should be calling the same
pci_error_handlerscallbacks in both cases.Quoted 7 lines
It's true that in the non-hotplug system, pciehp probably won't start re-enumeration, so we might need an alternate path to trigger that.
But that's not what we're doing in this patch. In this patch we're adding a much bigger difference: for hotplug bridges, we stop and remove the hierarchy below the bridge; for non-hotplug bridges, we do the AER-style flow of calling
pci_error_handlerscallbacks.Our approach on V12 was to go to AER style recovery for all DPC events regardless of hotplug support or not.
Keith was not comfortable with this approach. That's why, we special cased hotplug.
Quoted 6 lines
If we drop 6/6 on this patch on v13, we achieve this. We still have to take care of Keith's inputs on individual patches.
we have been struggling with the direction for a while.
Keith, what do you think?
My only concern was for existing production environments that use DPC for handling surprise removal, and I don't wish to break the existing uses.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 39 lines · Keith Busch
Quoted 38 lines · Sinan Kaya
Quoted 20 lines · Bjorn Helgaas
I think the scenario you are describing is two systems that are identical except that in the first, the endpoint is below a hotplug bridge, while in the second, it's below a non-hotplug bridge. There's no physical hotplug (no drive removed or inserted), and DPC is triggered in both systems.
I suggest that DPC should be handled identically in both systems:
- The PCI core should have the same view of the endpoint: it should be removed and re-added in both cases (or in neither case).
- The endpoint itself should not be able to tell the difference: it should see a link down event, followed by a link retrain, followed by the same sequence of config accesses, etc.
- The endpoint driver should not be able to tell the difference, i.e., we should be calling the same
pci_error_handlerscallbacks in both cases.Quoted 7 lines
It's true that in the non-hotplug system, pciehp probably won't start re-enumeration, so we might need an alternate path to trigger that.
But that's not what we're doing in this patch. In this patch we're adding a much bigger difference: for hotplug bridges, we stop and remove the hierarchy below the bridge; for non-hotplug bridges, we do the AER-style flow of calling
pci_error_handlerscallbacks.Our approach on V12 was to go to AER style recovery for all DPC events regardless of hotplug support or not.
Keith was not comfortable with this approach. That's why, we special cased hotplug.
If we drop 6/6 on this patch on v13, we achieve this. We still have to take care of Keith's inputs on individual patches.
Quoted 7 lines
Quoted 3 lines
we have been struggling with the direction for a while.
Keith, what do you think?
My only concern was for existing production environments that use DPC for handling surprise removal, and I don't wish to break the existing uses.
Also, I thought the plan was to keep hotplug and non-hotplug the same, except for the very end: if not a hotplug bridge, initiate the rescan automatically after releasing from containment, otherwise let pciehp handle it when the link reactivates.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 44 lines · Keith Busch
Quoted 43 lines · Keith Busch
Quoted 41 lines · Sinan Kaya
Quoted 20 lines · Bjorn Helgaas
I think the scenario you are describing is two systems that are identical except that in the first, the endpoint is below a hotplug bridge, while in the second, it's below a non-hotplug bridge. There's no physical hotplug (no drive removed or inserted), and DPC is triggered in both systems.
I suggest that DPC should be handled identically in both systems:
- The PCI core should have the same view of the endpoint: it should be removed and re-added in both cases (or in neither case).
- The endpoint itself should not be able to tell the difference: it should see a link down event, followed by a link retrain, followed by the same sequence of config accesses, etc.
- The endpoint driver should not be able to tell the difference, i.e., we should be calling the same
pci_error_handlerscallbacks in both cases.Quoted 7 lines
It's true that in the non-hotplug system, pciehp probably won't start re-enumeration, so we might need an alternate path to trigger that.
But that's not what we're doing in this patch. In this patch we're adding a much bigger difference: for hotplug bridges, we stop and remove the hierarchy below the bridge; for non-hotplug bridges, we do the AER-style flow of calling
pci_error_handlerscallbacks.Our approach on V12 was to go to AER style recovery for all DPC events regardless of hotplug support or not.
Keith was not comfortable with this approach. That's why, we special cased hotplug.
If we drop 6/6 on this patch on v13, we achieve this. We still have to take care of Keith's inputs on individual patches.
we have been struggling with the direction for a while.
Keith, what do you think?
Quoted 9 lines
Quoted 3 lines
My only concern was for existing production environments that use DPC for handling surprise removal, and I don't wish to break the existing uses.
Also, I thought the plan was to keep hotplug and non-hotplug the same, except for the very end: if not a hotplug bridge, initiate the rescan automatically after releasing from containment, otherwise let pciehp handle it when the link reactivates.
Hmm...
AER driver doesn't do stop and rescan approach for fatal errors. AER driver makes an error callback followed by secondary bus reset and finally driver the resume callback on the endpoint only if link recovery is successful. Otherwise, AER driver bails out with recovery unsuccessful message.
Why do we need an additional rescan in the DPC driver if the link is up and driver resumes operation?
If hotplug is supported and somebody removed the device, link won't come up. The AER error recovery sequence will fail after timeout.
When the drive is inserted, hotplug driver observes a link up interrupt, Hotplug driver does a rescan. Drive is functional one more time.
This should satisfy both use cases, right?
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 8 lines · Sinan Kaya
Quoted 6 lines · Keith Busch
Also, I thought the plan was to keep hotplug and non-hotplug the same, except for the very end: if not a hotplug bridge, initiate the rescan automatically after releasing from containment, otherwise let pciehp handle it when the link reactivates.
Quoted 6 lines
Hmm...
AER driver doesn't do stop and rescan approach for fatal errors. AER driver makes an error callback followed by secondary bus reset and finally driver the resume callback on the endpoint only if link recovery is successful. Otherwise, AER driver bails out with recovery unsuccessful message.
I'm not sure if that's necessarily true. People have reported AER handling triggers PCIe hotplug events, and creates some interesting race conditions:
https://marc.info/?l=linux-pci&m=152336615707640&w=2
https://www.spinics.net/lists/linux-pci/msg70614.html
Quoted 2 lines
Why do we need an additional rescan in the DPC driver if the link is up and driver resumes operation?
I thought the plan was to have DPC always go through the removal path to ensure all devices are properly configured when containment is released. In order to reconfigure those, you'll need to initiate the rescan from somewhere.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 11 lines · Keith Busch
Quoted 10 lines · Sinan Kaya
Quoted 6 lines · Keith Busch
Also, I thought the plan was to keep hotplug and non-hotplug the same, except for the very end: if not a hotplug bridge, initiate the rescan automatically after releasing from containment, otherwise let pciehp handle it when the link reactivates.
Hmm...
Quoted 8 lines
Quoted 4 lines
AER driver doesn't do stop and rescan approach for fatal errors. AER driver makes an error callback followed by secondary bus reset and finally driver the resume callback on the endpoint only if link recovery is successful. Otherwise, AER driver bails out with recovery unsuccessful message.
I'm not sure if that's necessarily true. People have reported AER handling triggers PCIe hotplug events, and creates some interesting race conditions:
By reading the code, I don't see a stop and rescan in the AER error recovery path.
As both logs indicate, stop and rescan is initiated in response to link down and link up interrupts triggered by the secondary bus reset.
The SW entity handling these is not AER driver. It is the hotplug driver running asynchronous to the AER driver.
AER driver should have tried a slot reset before attempting to do a secondary bus reset.
/**
* pci_reset_slot - reset a PCI slot
* @slot: PCI slot to reset
*
* A PCI bus may host multiple slots, each slot may support a reset mechanism
* independent of other slots. For instance, some slots may support slot power
* control. In the case of a 1:1 bus to slot architecture, this function may
* wrap the bus reset to avoid spurious slot related events such as hotplug.
* Generally a slot reset should be attempted before a bus reset. All of the
* function of the slot and any subordinate buses behind the slot are reset
* through this function. PCI config space of all devices in the slot and
* behind the slot is saved before and restored after reset.
*
* Return 0 on success, non-zero on error.
*/
int pci_reset_slot(struct pci_slot *slot)
Slot reset is there to mask hotplug interrupts before the reset and unmask them after reset.
Quoted 5 lines
Quoted 8 lines
Quoted 2 lines
Why do we need an additional rescan in the DPC driver if the link is up and driver resumes operation?
I thought the plan was to have DPC always go through the removal path to ensure all devices are properly configured when containment is released. In order to reconfigure those, you'll need to initiate the rescan from somewhere.
This is where the contradiction is.
Bjorn is asking for a unified error handling for both AER and DPC.
Current AER error recovery framework is error callback + secondary bus reset + resume callback.
How does this stop + rescan model fit?
Do we want to change the error recovery framework? I suppose this will become a bigger conversation as there are more customers of this.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Hi Keith, Bjorn;
Quoted 70 lines · Sinan Kaya
Quoted 11 lines · Keith Busch
Quoted 10 lines · Sinan Kaya
Quoted 6 lines · Keith Busch
Also, I thought the plan was to keep hotplug and non-hotplug the same, except for the very end: if not a hotplug bridge, initiate the rescan automatically after releasing from containment, otherwise let pciehp handle it when the link reactivates.
Hmm...
Quoted 8 lines
Quoted 4 lines
AER driver doesn't do stop and rescan approach for fatal errors. AER driver makes an error callback followed by secondary bus reset and finally driver the resume callback on the endpoint only if link recovery is successful. Otherwise, AER driver bails out with recovery unsuccessful message.
I'm not sure if that's necessarily true. People have reported AER handling triggers PCIe hotplug events, and creates some interesting race conditions:
By reading the code, I don't see a stop and rescan in the AER error recovery path.
As both logs indicate, stop and rescan is initiated in response to link down and link up interrupts triggered by the secondary bus reset.
The SW entity handling these is not AER driver. It is the hotplug driver running asynchronous to the AER driver.AER driver should have tried a slot reset before attempting to do a secondary bus reset.
/**
*pci_reset_slot- reset a PCI slot
* @slot: PCI slot to reset
*
* A PCI bus may host multiple slots, each slot may support a reset mechanism
* independent of other slots. For instance, some slots may support slot power
* control. In the case of a 1:1 bus to slot architecture, this function may
* wrap the bus reset to avoid spurious slot related events such as hotplug.
* Generally a slot reset should be attempted before a bus reset. All of the
* function of the slot and any subordinate buses behind the slot are reset
* through this function. PCI config space of all devices in the slot and
* behind the slot is saved before and restored after reset.
*
* Return 0 on success, non-zero on error.
*/
intpci_reset_slot(struct pci_slot *slot)Slot reset is there to mask hotplug interrupts before the reset and unmask them after reset.
Quoted 5 lines
Quoted 8 lines
Quoted 2 lines
Why do we need an additional rescan in the DPC driver if the link is up and driver resumes operation?
I thought the plan was to have DPC always go through the removal path to ensure all devices are properly configured when containment is released. In order to reconfigure those, you'll need to initiate the rescan from somewhere.
This is where the contradiction is.
Bjorn is asking for a unified error handling for both AER and DPC.
Quoted 8 lines
Current AER error recovery framework is error callback + secondary bus reset + resume callback.
How does this stop + rescan model fit?
Do we want to change the error recovery framework? I suppose this will become a bigger conversation as there are more customers of this.
I also want to highlight that the PCI Error recovery sequence is well documented here.
https://www.kernel.org/doc/Documentation/PCI/pci-error-recovery.txt
We don't really have to guess what Linux does.
IMO, the hotplug issues Keith is seeing are orthogonal and needs to be addressed independent of this series by following the pci slot reset procedure.
Hotplug driver handles link up/down events due to insertion/removal. Hotplug driver is expected to do the re-enumeration.
I don't understand why we need to do another re-enumeration if system observes a PCIe error handled by the AER/DPC driver.
These two are independent events.
PCIe error recovery framework does the reset callback + SBR + resume behavior today.
Bjorn,
You indicated that you want to unify the AER and DPC behavior. Let's settle on what we want to do one more time. We have been going forth and back on the direction.
We are on V13. I hope we won't hit V20 :)
Sinan
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 3 lines · Sinan Kaya
You indicated that you want to unify the AER and DPC behavior. Let's settle on what we want to do one more time. We have been going forth and back on the direction.
My thinking is that as much as possible, similar events should be handled similarly, whether the mechanism is AER, DPC, EEH, etc. Ideally, drivers shouldn't have to be aware of which mechanism is in use.
Error recovery includes conventional PCI as well, but right now I think we're only concerned with PCIe. The following error types are from PCIe r4.0, sec 6.2.2:
ERR_COR
Corrected by hardware with no software intervention. Software involved for logging only.
Handled by AER via pci_error_handlers; DPC is never involved.
Link is unaffected.
ERR_NONFATAL
A transaction is unreliable but the link is fully functional.
If DPC is not supported, handled by AER via pci_error_handlers and the link is unaffected.
If DPC supported, handled by DPC (because we set PCI_EXP_DPC_CTL_EN_NONFATAL) via remove/re-enumerate.
ERR_FATAL
The link is unreliable.
If DPC is not supported, handled by AER via pci_error_handlers and the link is reset.
If DPC supported, handled by DPC via remove/re-enumerate.
It doesn't seem right to me that we handle both ERR_NONFATAL and ERR_FATAL events differently if we happen to have DPC support in a switch.
Maybe we should consider triggering DPC only on ERR_FATAL? That would keep DPC out of the ERR_NONFATAL cases.
For ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?
Bjorn
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 47 lines · Bjorn Helgaas
Quoted 3 lines · Sinan Kaya
You indicated that you want to unify the AER and DPC behavior. Let's settle on what we want to do one more time. We have been going forth and back on the direction.
My thinking is that as much as possible, similar events should be handled similarly, whether the mechanism is AER, DPC, EEH, etc. Ideally, drivers shouldn't have to be aware of which mechanism is in use.
Error recovery includes conventional PCI as well, but right now I think we're only concerned with PCIe. The following error types are from PCIe r4.0, sec 6.2.2:
ERR_COR
Corrected by hardware with no software intervention. Software involved for logging only.Handled by AER via
pci_error_handlers; DPC is never involved.Link is unaffected.
ERR_NONFATAL
A transaction is unreliable but the link is fully functional.If DPC is not supported, handled by AER via
pci_error_handlersand the link is unaffected.If DPC supported, handled by DPC (because we set
PCI_EXP_DPC_CTL_EN_NONFATAL) via remove/re-enumerate.
ERR_FATAL
The link is unreliable.If DPC is not supported, handled by AER via
pci_error_handlersand the link is reset.If DPC supported, handled by DPC via remove/re-enumerate.
It doesn't seem right to me that we handle both
ERR_NONFATALandERR_FATALevents differently if we happen to have DPC support in a switch.Maybe we should consider triggering DPC only on
ERR_FATAL? That would keep DPC out of theERR_NONFATALcases.
Quoted 7 lines
For
ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?Bjorn
This had crossed my mind when I first looked at the code.
DPC is getting triggered for both ERR_NONFATAL and ERR_FATAL case.
I thought the primary purpose of DPC to recover fatal errors, by triggering HW recovery. but what if some platform wants to handle both FATAL and NON_FATAL with DPC ?
As you said AER FATAL cases and DPC FATAL cases should be handled similarly. e.g. remove/re-enumerate the devices.
while NON_FATAL case; only AER would come into picture.
if some platform would like to handle DPC NON_FATAL then it should follow AER NON_FATAL path (where it does not do remove/re-enumerate)
And the case where hotplug is enabled, remove/re-enumerate more sense in case of ERR_FATAL.
And the case where hotplug is disabled, only re-enumeration is required. (no need to remove the devices)
but then do we need to handle this case specifically, what is the harm in removing the devices in all the cases followed by re-enumerate ?
Regards,
Oza.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 69 lines · On 2018-04-16 11:03, [email protected] wrote:
Quoted 47 lines · Bjorn Helgaas
Quoted 3 lines · Sinan Kaya
You indicated that you want to unify the AER and DPC behavior. Let's settle on what we want to do one more time. We have been going forth and back on the direction.
My thinking is that as much as possible, similar events should be handled similarly, whether the mechanism is AER, DPC, EEH, etc. Ideally, drivers shouldn't have to be aware of which mechanism is in use.
Error recovery includes conventional PCI as well, but right now I think we're only concerned with PCIe. The following error types are from PCIe r4.0, sec 6.2.2:
ERR_COR
Corrected by hardware with no software intervention. Software involved for logging only.Handled by AER via
pci_error_handlers; DPC is never involved.Link is unaffected.
ERR_NONFATAL
A transaction is unreliable but the link is fully functional.If DPC is not supported, handled by AER via
pci_error_handlersand the link is unaffected.If DPC supported, handled by DPC (because we set
PCI_EXP_DPC_CTL_EN_NONFATAL) via remove/re-enumerate.
ERR_FATAL
The link is unreliable.If DPC is not supported, handled by AER via
pci_error_handlersand the link is reset.If DPC supported, handled by DPC via remove/re-enumerate.
It doesn't seem right to me that we handle both
ERR_NONFATALandERR_FATALevents differently if we happen to have DPC support in a switch.Maybe we should consider triggering DPC only on
ERR_FATAL? That would keep DPC out of theERR_NONFATALcases.Quoted 7 lines
For
ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?Bjorn
This had crossed my mind when I first looked at the code.
DPC is getting triggered for bothERR_NONFATALandERR_FATALcase. I thought the primary purpose of DPC to recover fatal errors, by triggering HW recovery.
but what if some platform wants to handle both FATAL andNON_FATALwith DPC ?As you said AER FATAL cases and DPC FATAL cases should be handled similarly. e.g. remove/re-enumerate the devices.
while
NON_FATALcase; only AER would come into picture.
if some platform would like to handle DPCNON_FATALthen it should follow AERNON_FATALpath (where it does not do remove/re-enumerate)
Quoted 6 lines
And the case where hotplug is enabled, remove/re-enumerate more sense in case of
ERR_FATAL.
And the case where hotplug is disabled, only re-enumeration is required. (no need to remove the devices)
but then do we need to handle this case specifically, what is the harm in removing the devices in all the cases followed by re-enumerate ?
To Clarify the last line, what I meant here was, in case of ERR_FATAL we can always remove/re-enumerate the devices irrespective of hotplug is enabled or not.
and in case of ERR_NONFATAL, DPC will follow AER path (where it just tries to recover)
although I am not very sure that how to handle ERR_NONFATAL case if hotplug is enabled. Because as Keith suggested device might have been changed run-time.
Quoted 3 lines
Regards,
Oza.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 55 lines · On Mon, Apr 16, 2018 at 11:21:15AM +0530, [email protected] wrote:
Quoted 54 lines · On 2018-04-16 11:03, [email protected] wrote:
Quoted 53 lines · Bjorn Helgaas
Quoted 3 lines · Sinan Kaya
You indicated that you want to unify the AER and DPC behavior. Let's settle on what we want to do one more time. We have been going forth and back on the direction.
My thinking is that as much as possible, similar events should be handled similarly, whether the mechanism is AER, DPC, EEH, etc. Ideally, drivers shouldn't have to be aware of which mechanism is in use.
Error recovery includes conventional PCI as well, but right now I think we're only concerned with PCIe. The following error types are from PCIe r4.0, sec 6.2.2:
ERR_COR
Corrected by hardware with no software intervention. Software involved for logging only.Handled by AER via
pci_error_handlers; DPC is never involved.Link is unaffected.
ERR_NONFATAL
A transaction is unreliable but the link is fully functional.If DPC is not supported, handled by AER via
pci_error_handlersand the link is unaffected.If DPC supported, handled by DPC (because we set
PCI_EXP_DPC_CTL_EN_NONFATAL) via remove/re-enumerate.
ERR_FATAL
The link is unreliable.If DPC is not supported, handled by AER via
pci_error_handlersand the link is reset.If DPC supported, handled by DPC via remove/re-enumerate.
It doesn't seem right to me that we handle both
ERR_NONFATALandERR_FATALevents differently if we happen to have DPC support in a switch.Maybe we should consider triggering DPC only on
ERR_FATAL? That would keep DPC out of theERR_NONFATALcases.For
ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?
Quoted 8 lines
Quoted 8 lines
Quoted 1 line
Bjorn
This had crossed my mind when I first looked at the code. DPC is getting triggered for both
ERR_NONFATALandERR_FATALcase. I thought the primary purpose of DPC to recover fatal errors, by triggering HW recovery.
but what if some platform wants to handle both FATAL andNON_FATALwith DPC ?
AER usage is coordinated between the platform and the OS via _OSC (PCI Firmware spec r3.2, sec 4.5.1) My understanding is that if the platform grants the OS permission to control AER, the OS is free to set the AER control registers however it wishes. If the platform depends on certain AER control settings, it must decline to grant AER control to the OS.
As far as I know, there's nothing new in _OSC related to DPC, but based on the implementation note in PCIe r4.0, sec 6.2.10, we currently assume the OS controls DPC if and only if it controls AER.
Therefore, if a platform depends on certain DPC control settings, e.g., if it wants to handle both ERR_FATAL and ERR_NONFATAL with DPC, I would argue that the platform needs to retain control over AER.
If the platform grants AER control to the OS, I think the OS is free to set both AER and DPC control registers as it desires.
Quoted 14 lines
Quoted 7 lines
As you said AER FATAL cases and DPC FATAL cases should be handled similarly. e.g. remove/re-enumerate the devices.
while
NON_FATALcase; only AER would come into picture. if some platform would like to handle DPCNON_FATALthen it should follow AERNON_FATALpath (where it does not do remove/re-enumerate)Quoted 6 lines
And the case where hotplug is enabled, remove/re-enumerate more sense in case of
ERR_FATAL. And the case where hotplug is disabled, only re-enumeration is required. (no need to remove the devices) but then do we need to handle this case specifically, what is the harm in removing the devices in all the cases followed by re-enumerate ?
Quoted 3 lines
To Clarify the last line, what I meant here was, in case of
ERR_FATALwe can always remove/re-enumerate the devices irrespective of hotplug is enabled or not.
ERR_FATAL means the link is unreliable. A hotplug event may have occurred. In this case, I think remove/re-enumerate is a safe option. It might be more than is needed in some cases, but I'm not sure we can reliably determine when we don't need it, and if we remove/re-enumerate for some ERR_FATAL errors but not others, I think it complicates the situation for drivers and other higher-level software.
Quoted 4 lines
and in case of
ERR_NONFATAL, DPC will follow AER path (where it just tries to recover) although I am not very sure that how to handleERR_NONFATALcase if hotplug is enabled. Because as Keith suggested device might have been changed run-time.
ERR_NONFATAL means a particular transaction might be unreliable but the link itself is fully functional. No hotplug is possible if the link has stayed fully functional.
Bjorn
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
In reply to Bjorn HelgaasQuoted 8 lines · Bjorn Helgaas
It doesn't seem right to me that we handle both
ERR_NONFATALandERR_FATALevents differently if we happen to have DPC support in a switch.Maybe we should consider triggering DPC only on
ERR_FATAL? That would keep DPC out of theERR_NONFATALcases.From reliability perspective, it makes sense. DPC handles NONFATAL errors
by bringing down the link. If error happened behind a switch and root port is handling DPC, we are impacting a lot of devices operation because of one faulty device.
Keith, do you have any preference on this direction?
Quoted 5 lines
For
ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?
Sure, we can go to this route as well.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system
Quoted 15 lines · Sinan Kaya
Quoted 7 lines · Bjorn Helgaas
It doesn't seem right to me that we handle both
ERR_NONFATALandERR_FATALevents differently if we happen to have DPC support in a switch.Maybe we should consider triggering DPC only on
ERR_FATAL? That would keep DPC out of theERR_NONFATALcases.From reliability perspective, it makes sense. DPC handles NONFATAL errors by bringing down the link. If error happened behind a switch and root port is handling DPC, we are impacting a lot of devices operation because of one faulty device.
Keith, do you have any preference on this direction?
Quoted 7 lines
Quoted 5 lines
For
ERR_FATAL, maybe we should bite the bullet and use remove/re-enumerate for AER as well as for DPC. That would be painful for higher-level software, but if we're willing to accept that pain for new systems that support DPC, maybe life would be better overall if it worked the same way on systems without DPC?Sure, we can go to this route as well.
ok so finally this is what is being proposed and so far Bjorn, Sinan and myself agreed on following:
I need to move the stop and re-enumerate code into the AER path instead of patch #6 for both DPC_FATAL and AER_FATAL error types. Also, I should turn off DPC NON_FATAL error detection.
Keith, please confirm if you are okay with above proposal.
Regards,
Oza.
Quoted 10 lines · Oza Pawandeep
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get triggered (for e.g.
ERR_FATAL), callbacks are handled appropriately.DPC should behave identical to AER as far as error handling is concerned. DPC should remove the devices and not to do recovery for hotplug enabled system.
Is there a specific bug that's fixed by these patches? I didn't see one mentioned in the changelogs.
Quoted 9 lines · Bjorn Helgaas
Quoted 8 lines · Oza Pawandeep
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get triggered (for e.g.
ERR_FATAL), callbacks are handled appropriately.
Quoted 6 lines
Quoted 2 lines
DPC should behave identical to AER as far as error handling is concerned. DPC should remove the devices and not to do recovery for hotplug enabled system.
Is there a specific bug that's fixed by these patches? I didn't see one mentioned in the changelogs.
There is no actual bug.
We realized that DPC and hotplug is heavily integrated today. We have use cases for systems without hotplug support but still support DPC. That's the problem we are trying to solve with this patchset.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Quoted 17 lines · Sinan Kaya
Quoted 9 lines · Bjorn Helgaas
Quoted 8 lines · Oza Pawandeep
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get triggered (for e.g.
ERR_FATAL), callbacks are handled appropriately.Quoted 6 lines
Quoted 2 lines
DPC should behave identical to AER as far as error handling is concerned. DPC should remove the devices and not to do recovery for hotplug enabled system.
Is there a specific bug that's fixed by these patches? I didn't see one mentioned in the changelogs.
Quoted 5 lines
There is no actual bug.
We realized that DPC and hotplug is heavily integrated today. We have use cases for systems without hotplug support but still support DPC. That's the problem we are trying to solve with this patchset.
Adding to what Sinan said;
DPC should handle the error handling and recovery similar to AER, because finally both
are attempting recovery in some or the other way,
and for that error handling and recovery framework has to be loosely coupled.
It achieves uniformity and transparency to the error handling agents such as AER, DPC, with respect to recovery and error handling.
So, this patch-set tries to unify lot of things between error agents and make them behave in a well defined way. (be it error (FATAL, NON_FATAL) handling or recovery).
Regards,
Oza.
Quoted 22 lines · On Mon, Apr 16, 2018 at 11:33:13AM +0530, [email protected] wrote:
Quoted 21 lines · Sinan Kaya
Quoted 19 lines · Bjorn Helgaas
Quoted 10 lines · Oza Pawandeep
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the
EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get
triggered (for e.g.ERR_FATAL), callbacks are handled appropriately.Quoted 4 lines
DPC should behave identical to AER as far as error handling is concerned.
DPC should remove the devices and not to do recovery for hotplug enabled system.Is there a specific bug that's fixed by these patches? I didn't see one mentioned in the changelogs.
Quoted 6 lines
Quoted 6 lines
There is no actual bug.
We realized that DPC and hotplug is heavily integrated today. We have use cases for systems without hotplug support but still support DPC. That's the problem we are trying to solve with this patchset.
Apparently there's a problem with systems that have DPC but not hotplug. It will be extremely helpful if you can articulate what that problem is and include it in the appropriate changelog.
Quoted 9 lines
Adding to what Sinan said;
DPC should handle the error handling and recovery similar to AER, because finally both are attempting recovery in some or the other way, and for that error handling and recovery framework has to be loosely coupled. It achieves uniformity and transparency to the error handling agents such as AER, DPC, with respect to recovery and error handling.
Quoted 3 lines
So, this patch-set tries to unify lot of things between error agents and make them behave in a well defined way. (be it error (FATAL,
NON_FATAL) handling or recovery).
I totally support this objective.
Bjorn
Quoted 43 lines · Bjorn Helgaas
Quoted 22 lines · On Mon, Apr 16, 2018 at 11:33:13AM +0530, [email protected] wrote:
Quoted 21 lines · Sinan Kaya
Quoted 19 lines · Bjorn Helgaas
Quoted 10 lines · Oza Pawandeep
This patch set brings in error handling support for DPC
The current implementation of AER and error message broadcasting to the
EP driver is tightly coupled and limited to AER service driver. It is important to factor out broadcasting and other link handling callbacks. So that not only when AER gets triggered, but also when DPC get
triggered (for e.g.ERR_FATAL), callbacks are handled appropriately.Quoted 4 lines
DPC should behave identical to AER as far as error handling is concerned.
DPC should remove the devices and not to do recovery for hotplug enabled system.Is there a specific bug that's fixed by these patches? I didn't see one mentioned in the changelogs.
Quoted 6 lines
Quoted 6 lines
There is no actual bug.
We realized that DPC and hotplug is heavily integrated today. We have use cases for systems without hotplug support but still support DPC. That's the problem we are trying to solve with this patchset.
Apparently there's a problem with systems that have DPC but not hotplug. It will be extremely helpful if you can articulate what that problem is and include it in the appropriate changelog.
Quoted 9 lines
Adding to what Sinan said;
DPC should handle the error handling and recovery similar to AER, because finally both are attempting recovery in some or the other way, and for that error handling and recovery framework has to be loosely coupled. It achieves uniformity and transparency to the error handling agents such as AER, DPC, with respect to recovery and error handling.
Quoted 5 lines
Quoted 3 lines
So, this patch-set tries to unify lot of things between error agents and make them behave in a well defined way. (be it error (FATAL,
NON_FATAL) handling or recovery).I totally support this objective.
Thanks Bjorn, I will include this objective in Changelog along with Sinan's text.
I am not clear on one last thing Bjorn; which is;
do we need last patch ? patch-6 which handles hotplug case.
Also I think we could take this patch-set as basic changes/attempt to unify the code which it does.
And, in the next follow-up patches we can improve upon the things such as,
whether to do different actions for FATAL cases and NON_FATAL cases. And then I can make needed changes to AER and DPC Please let me know how this sounds.
Quoted 2 lines
Bjorn
Quoted 8 lines · Bjorn Helgaas
Quoted 4 lines
Quoted 4 lines
We realized that DPC and hotplug is heavily integrated today. We have use cases for systems without hotplug support but still support DPC. That's the problem we are trying to solve with this patchset.
Apparently there's a problem with systems that have DPC but not hotplug. It will be extremely helpful if you can articulate what that problem is and include it in the appropriate changelog.
At a higher level, the DPC driver performs the stop operation regardless of hotplug. However, DPC driver relies on hotplug driver observing link up to re-enumerate.
Of course, when the system didn't support hotplug; there was nobody to restore functionality.
Our initial attempt was to also do a re-enumeration in the DPC driver regardless of hotplug driver in the system or not.
If hotplug driver is present, it would observe two enumerations. It still worked as long as these were protected by a mutex.
Then, we got your input that you want DPC and AER to behave the same. We started converging towards the AER path.
Signature · 3 lines
Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.