Message ID | 195320871bdf0299a9718f93aeec7456f319ce4f.1529525056.git.joseph.salisbury@canonical.com |
---|---|
State | New |
Headers | show |
Series | scsi: hpsa: disable device during shutdown | expand |
On 08/10/18 22:45, Joseph Salisbury wrote: > From: Sinan Kaya <okaya@codeaurora.org> > > BugLink: http://bugs.launchpad.net/bugs/1771467 > > 'Commit cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during > shutdown")' has been added to kernel to shutdown pending PCIe port service > interrupts during reboot so that a newly started kexec kernel wouldn't > observe pending interrupts. > > pcie_port_device_remove() is disabling the root port and switches by > calling pci_disable_device() after all PCIe service drivers are shutdown. > > This has been found to cause crashes on HP DL360 Gen9 machines during > reboot due to hpsa driver not clearing the bus master bit during the > shutdown procedure by calling pci_disable_device(). > > Disable device as part of the shutdown sequence. > > Signed-off-by: Sinan Kaya <okaya@codeaurora.org> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=199779 > Fixes: cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during shutdown") > Cc: stable@vger.kernel.org > Reported-by: Ryan Finnie <ryan@finnie.org> > Tested-by: Don Brace <don.brace@microsemi.com> > Acked-by: Don Brace <don.brace@microsemi.com> > Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> > (cherry picked from commit 0d98ba8d70b0070ac117452ea0b663e26bbf46bf) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > drivers/scsi/hpsa.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c > index b54d17b..d3dde05 100644 > --- a/drivers/scsi/hpsa.c > +++ b/drivers/scsi/hpsa.c > @@ -8844,7 +8844,7 @@ static void hpsa_disable_rld_caching(struct ctlr_info *h) > kfree(options); > } > > -static void hpsa_shutdown(struct pci_dev *pdev) > +static void __hpsa_shutdown(struct pci_dev *pdev) > { > struct ctlr_info *h; > > @@ -8859,6 +8859,12 @@ static void hpsa_shutdown(struct pci_dev *pdev) > hpsa_disable_interrupt_mode(h); /* pci_init 2 */ > } > > +static void hpsa_shutdown(struct pci_dev *pdev) > +{ > + __hpsa_shutdown(pdev); > + pci_disable_device(pdev); > +} > + > static void hpsa_free_device_info(struct ctlr_info *h) > { > int i; > @@ -8902,7 +8908,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) > scsi_remove_host(h->scsi_host); /* init_one 8 */ > /* includes hpsa_free_irqs - init_one 4 */ > /* includes hpsa_disable_interrupt_mode - pci_init 2 */ > - hpsa_shutdown(pdev); > + __hpsa_shutdown(pdev); > > hpsa_free_device_info(h); /* scan */ > >
On 2018-08-10 16:45:34 , Joseph Salisbury wrote: > From: Sinan Kaya <okaya@codeaurora.org> > > BugLink: http://bugs.launchpad.net/bugs/1771467 > > 'Commit cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during > shutdown")' has been added to kernel to shutdown pending PCIe port service > interrupts during reboot so that a newly started kexec kernel wouldn't > observe pending interrupts. > > pcie_port_device_remove() is disabling the root port and switches by > calling pci_disable_device() after all PCIe service drivers are shutdown. > > This has been found to cause crashes on HP DL360 Gen9 machines during > reboot due to hpsa driver not clearing the bus master bit during the > shutdown procedure by calling pci_disable_device(). > > Disable device as part of the shutdown sequence. > > Signed-off-by: Sinan Kaya <okaya@codeaurora.org> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=199779 > Fixes: cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during shutdown") > Cc: stable@vger.kernel.org > Reported-by: Ryan Finnie <ryan@finnie.org> > Tested-by: Don Brace <don.brace@microsemi.com> > Acked-by: Don Brace <don.brace@microsemi.com> > Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> > (cherry picked from commit 0d98ba8d70b0070ac117452ea0b663e26bbf46bf) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> > --- > drivers/scsi/hpsa.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c > index b54d17b..d3dde05 100644 > --- a/drivers/scsi/hpsa.c > +++ b/drivers/scsi/hpsa.c > @@ -8844,7 +8844,7 @@ static void hpsa_disable_rld_caching(struct ctlr_info *h) > kfree(options); > } > > -static void hpsa_shutdown(struct pci_dev *pdev) > +static void __hpsa_shutdown(struct pci_dev *pdev) > { > struct ctlr_info *h; > > @@ -8859,6 +8859,12 @@ static void hpsa_shutdown(struct pci_dev *pdev) > hpsa_disable_interrupt_mode(h); /* pci_init 2 */ > } > > +static void hpsa_shutdown(struct pci_dev *pdev) > +{ > + __hpsa_shutdown(pdev); > + pci_disable_device(pdev); > +} > + > static void hpsa_free_device_info(struct ctlr_info *h) > { > int i; > @@ -8902,7 +8908,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) > scsi_remove_host(h->scsi_host); /* init_one 8 */ > /* includes hpsa_free_irqs - init_one 4 */ > /* includes hpsa_disable_interrupt_mode - pci_init 2 */ > - hpsa_shutdown(pdev); > + __hpsa_shutdown(pdev); > > hpsa_free_device_info(h); /* scan */ > Acked-by: Khalid Elmously <khalid.elmously@canonical.com>
..to bionic/master-next On 2018-08-10 16:45:34 , Joseph Salisbury wrote: > From: Sinan Kaya <okaya@codeaurora.org> > > BugLink: http://bugs.launchpad.net/bugs/1771467 > > 'Commit cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during > shutdown")' has been added to kernel to shutdown pending PCIe port service > interrupts during reboot so that a newly started kexec kernel wouldn't > observe pending interrupts. > > pcie_port_device_remove() is disabling the root port and switches by > calling pci_disable_device() after all PCIe service drivers are shutdown. > > This has been found to cause crashes on HP DL360 Gen9 machines during > reboot due to hpsa driver not clearing the bus master bit during the > shutdown procedure by calling pci_disable_device(). > > Disable device as part of the shutdown sequence. > > Signed-off-by: Sinan Kaya <okaya@codeaurora.org> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=199779 > Fixes: cc27b735ad3a ("PCI/portdrv: Turn off PCIe services during shutdown") > Cc: stable@vger.kernel.org > Reported-by: Ryan Finnie <ryan@finnie.org> > Tested-by: Don Brace <don.brace@microsemi.com> > Acked-by: Don Brace <don.brace@microsemi.com> > Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> > (cherry picked from commit 0d98ba8d70b0070ac117452ea0b663e26bbf46bf) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> > --- > drivers/scsi/hpsa.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c > index b54d17b..d3dde05 100644 > --- a/drivers/scsi/hpsa.c > +++ b/drivers/scsi/hpsa.c > @@ -8844,7 +8844,7 @@ static void hpsa_disable_rld_caching(struct ctlr_info *h) > kfree(options); > } > > -static void hpsa_shutdown(struct pci_dev *pdev) > +static void __hpsa_shutdown(struct pci_dev *pdev) > { > struct ctlr_info *h; > > @@ -8859,6 +8859,12 @@ static void hpsa_shutdown(struct pci_dev *pdev) > hpsa_disable_interrupt_mode(h); /* pci_init 2 */ > } > > +static void hpsa_shutdown(struct pci_dev *pdev) > +{ > + __hpsa_shutdown(pdev); > + pci_disable_device(pdev); > +} > + > static void hpsa_free_device_info(struct ctlr_info *h) > { > int i; > @@ -8902,7 +8908,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) > scsi_remove_host(h->scsi_host); /* init_one 8 */ > /* includes hpsa_free_irqs - init_one 4 */ > /* includes hpsa_disable_interrupt_mode - pci_init 2 */ > - hpsa_shutdown(pdev); > + __hpsa_shutdown(pdev); > > hpsa_free_device_info(h); /* scan */ > > -- > 2.7.4 > > > -- > kernel-team mailing list > kernel-team@lists.ubuntu.com > https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index b54d17b..d3dde05 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -8844,7 +8844,7 @@ static void hpsa_disable_rld_caching(struct ctlr_info *h) kfree(options); } -static void hpsa_shutdown(struct pci_dev *pdev) +static void __hpsa_shutdown(struct pci_dev *pdev) { struct ctlr_info *h; @@ -8859,6 +8859,12 @@ static void hpsa_shutdown(struct pci_dev *pdev) hpsa_disable_interrupt_mode(h); /* pci_init 2 */ } +static void hpsa_shutdown(struct pci_dev *pdev) +{ + __hpsa_shutdown(pdev); + pci_disable_device(pdev); +} + static void hpsa_free_device_info(struct ctlr_info *h) { int i; @@ -8902,7 +8908,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) scsi_remove_host(h->scsi_host); /* init_one 8 */ /* includes hpsa_free_irqs - init_one 4 */ /* includes hpsa_disable_interrupt_mode - pci_init 2 */ - hpsa_shutdown(pdev); + __hpsa_shutdown(pdev); hpsa_free_device_info(h); /* scan */