diff options
| author | Vaibhav Jain <vaibhav@linux.vnet.ibm.com> | 2017-04-27 01:23:25 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-25 09:44:36 -0400 |
| commit | 3935312995473ce0abc40582d5cda31da3594294 (patch) | |
| tree | d07bba619d6822c8b09e9b4cbdd4a26c63933fae /drivers/misc | |
| parent | fc6b678ab1d47085ee0ab3fae4d5289959b45552 (diff) | |
cxl: Force context lock during EEH flow
commit ea9a26d117cf0637c71d3e0076f4a124bf5859df upstream.
During an eeh event when the cxl card is fenced and card sysfs attr
perst_reloads_same_image is set following warning message is seen in the
kernel logs:
Adapter context unlocked with 0 active contexts
------------[ cut here ]------------
WARNING: CPU: 12 PID: 627 at
../drivers/misc/cxl/main.c:325 cxl_adapter_context_unlock+0x60/0x80 [cxl]
Even though this warning is harmless, it clutters the kernel log
during an eeh event. This warning is triggered as the EEH callback
cxl_pci_error_detected doesn't obtain a context-lock before forcibly
detaching all active context and when context-lock is released during
call to cxl_configure_adapter from cxl_pci_slot_reset, a warning in
cxl_adapter_context_unlock is triggered.
To fix this warning, we acquire the adapter context-lock via
cxl_adapter_context_lock() in the eeh callback
cxl_pci_error_detected() once all the virtual AFU PHBs are notified
and their contexts detached. The context-lock is released in
cxl_pci_slot_reset() after the adapter is successfully reconfigured
and before the we call the slot_reset callback on slice attached
device-drivers.
Fixes: 70b565bbdb91 ("cxl: Prevent adapter reset if an active context exists")
Reported-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
Acked-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Reviewed-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Tested-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/cxl/pci.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index dd99b06e121a..80b1a7e87888 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c | |||
| @@ -1496,8 +1496,6 @@ static int cxl_configure_adapter(struct cxl *adapter, struct pci_dev *dev) | |||
| 1496 | if ((rc = cxl_native_register_psl_err_irq(adapter))) | 1496 | if ((rc = cxl_native_register_psl_err_irq(adapter))) |
| 1497 | goto err; | 1497 | goto err; |
| 1498 | 1498 | ||
| 1499 | /* Release the context lock as adapter is configured */ | ||
| 1500 | cxl_adapter_context_unlock(adapter); | ||
| 1501 | return 0; | 1499 | return 0; |
| 1502 | 1500 | ||
| 1503 | err: | 1501 | err: |
| @@ -1596,6 +1594,9 @@ static struct cxl *cxl_pci_init_adapter(struct pci_dev *dev) | |||
| 1596 | if ((rc = cxl_sysfs_adapter_add(adapter))) | 1594 | if ((rc = cxl_sysfs_adapter_add(adapter))) |
| 1597 | goto err_put1; | 1595 | goto err_put1; |
| 1598 | 1596 | ||
| 1597 | /* Release the context lock as adapter is configured */ | ||
| 1598 | cxl_adapter_context_unlock(adapter); | ||
| 1599 | |||
| 1599 | return adapter; | 1600 | return adapter; |
| 1600 | 1601 | ||
| 1601 | err_put1: | 1602 | err_put1: |
| @@ -1893,6 +1894,13 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, | |||
| 1893 | cxl_ops->afu_deactivate_mode(afu, afu->current_mode); | 1894 | cxl_ops->afu_deactivate_mode(afu, afu->current_mode); |
| 1894 | pci_deconfigure_afu(afu); | 1895 | pci_deconfigure_afu(afu); |
| 1895 | } | 1896 | } |
| 1897 | |||
| 1898 | /* should take the context lock here */ | ||
| 1899 | if (cxl_adapter_context_lock(adapter) != 0) | ||
| 1900 | dev_warn(&adapter->dev, | ||
| 1901 | "Couldn't take context lock with %d active-contexts\n", | ||
| 1902 | atomic_read(&adapter->contexts_num)); | ||
| 1903 | |||
| 1896 | cxl_deconfigure_adapter(adapter); | 1904 | cxl_deconfigure_adapter(adapter); |
| 1897 | 1905 | ||
| 1898 | return result; | 1906 | return result; |
| @@ -1911,6 +1919,13 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) | |||
| 1911 | if (cxl_configure_adapter(adapter, pdev)) | 1919 | if (cxl_configure_adapter(adapter, pdev)) |
| 1912 | goto err; | 1920 | goto err; |
| 1913 | 1921 | ||
| 1922 | /* | ||
| 1923 | * Unlock context activation for the adapter. Ideally this should be | ||
| 1924 | * done in cxl_pci_resume but cxlflash module tries to activate the | ||
| 1925 | * master context as part of slot_reset callback. | ||
| 1926 | */ | ||
| 1927 | cxl_adapter_context_unlock(adapter); | ||
| 1928 | |||
| 1914 | for (i = 0; i < adapter->slices; i++) { | 1929 | for (i = 0; i < adapter->slices; i++) { |
| 1915 | afu = adapter->afu[i]; | 1930 | afu = adapter->afu[i]; |
| 1916 | 1931 | ||
