Message ID | 1469199511-32670-1-git-send-email-tim.gardner@canonical.com |
---|---|
State | New |
Headers | show |
There have been substantial changes to this code since v4.4. We'll need a different patch for Yakkety.
On 22.07.2016 16:58, Tim Gardner wrote: > From: Uma Krishnan <ukrishn@linux.vnet.ibm.com> > > BugLink: http://bugs.launchpad.net/bugs/1605405 > > If an EEH or some other hard error occurs while the > adapter instance was being initialized, on the subsequent > shutdown of the device, the system could crash with: > > [c000000f1da03b60] c0000000005eccfc pci_device_shutdown+0x6c/0x100 > [c000000f1da03ba0] c0000000006d67d4 device_shutdown+0x1b4/0x2c0 > [c000000f1da03c40] c0000000000ea30c kernel_restart_prepare+0x5c/0x80 > [c000000f1da03c70] c0000000000ea48c kernel_restart+0x2c/0xc0 > [c000000f1da03ce0] c0000000000ea970 SyS_reboot+0x1c0/0x2d0 > [c000000f1da03e30] c000000000009204 system_call+0x38/0xb4 > > This crash is due to the AFU not being mapped when the shutdown > notification routine is called and is a regression that was inserted > recently with Commit 704c4b0ddc03 ("cxlflash: Shutdown notify support > for CXL Flash cards"). > > As a fix, shutdown notification should only occur when the AFU is mapped. > > Fixes: 704c4b0ddc03 ("cxlflash: Shutdown notify support for CXL Flash cards") > Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com> > Signed-off-by: Tim Gardner <tim.gardner@canonical.com> > --- > drivers/scsi/cxlflash/main.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c > index 860008d..661bb94 100644 > --- a/drivers/scsi/cxlflash/main.c > +++ b/drivers/scsi/cxlflash/main.c > @@ -778,7 +778,7 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait) > { > struct afu *afu = cfg->afu; > struct device *dev = &cfg->dev->dev; > - struct sisl_global_map __iomem *global = &afu->afu_map->global; > + struct sisl_global_map __iomem *global; > struct dev_dependent_vals *ddv; > u64 reg, status; > int i, retry_cnt = 0; > @@ -787,6 +787,14 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait) > if (!(ddv->flags & CXLFLASH_NOTIFY_SHUTDOWN)) > return; > > + if (!afu || !afu->afu_map) { > + dev_dbg(dev, "%s: The problem state area is not mapped\n", > + __func__); > + return; > + } > + > + global = &afu->afu_map->global; > + > /* Notify AFU */ > for (i = 0; i < NUM_FC_PORTS; i++) { > reg = readq_be(&global->fc_regs[i][FC_CONFIG2 / 8]); >
diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c index 860008d..661bb94 100644 --- a/drivers/scsi/cxlflash/main.c +++ b/drivers/scsi/cxlflash/main.c @@ -778,7 +778,7 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait) { struct afu *afu = cfg->afu; struct device *dev = &cfg->dev->dev; - struct sisl_global_map __iomem *global = &afu->afu_map->global; + struct sisl_global_map __iomem *global; struct dev_dependent_vals *ddv; u64 reg, status; int i, retry_cnt = 0; @@ -787,6 +787,14 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait) if (!(ddv->flags & CXLFLASH_NOTIFY_SHUTDOWN)) return; + if (!afu || !afu->afu_map) { + dev_dbg(dev, "%s: The problem state area is not mapped\n", + __func__); + return; + } + + global = &afu->afu_map->global; + /* Notify AFU */ for (i = 0; i < NUM_FC_PORTS; i++) { reg = readq_be(&global->fc_regs[i][FC_CONFIG2 / 8]);