From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Subject: Re: [PATCH] PCI: Try to clean up resources via remove if shutdown doesn't exist References: <1527257063-15843-1-git-send-email-okaya@codeaurora.org> From: Sinan Kaya Message-ID: Date: Fri, 25 May 2018 10:36:49 -0700 MIME-Version: 1.0 In-Reply-To: <1527257063-15843-1-git-send-email-okaya@codeaurora.org> Content-Language: en-US List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: linux-pci@vger.kernel.org, timur@codeaurora.org Cc: Bjorn Helgaas , linux-arm-msm@vger.kernel.org, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, open list [+cc kexec] On 5/25/2018 7:04 AM, Sinan Kaya wrote: > It is up to a driver to implement shutdown() callback. If shutdown() > callback is not implemented, PCI device can have pending interrupt and > even do DMA transactions while the system is going down. > > If kexec is in use, this can damage the newly booting kexec kernel > or even prevent it from booting altogether. Fallback to calling the > remove() callback if shutdown() isn't implemented for a given driver. > > Signed-off-by: Sinan Kaya > --- > drivers/pci/pci-driver.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c > index 6ace470..4ac72e3 100644 > --- a/drivers/pci/pci-driver.c > +++ b/drivers/pci/pci-driver.c > @@ -475,8 +475,17 @@ static void pci_device_shutdown(struct device *dev) > > pm_runtime_resume(dev); > > + /* > + * Try shutdown callback if it exists, otherwise fallback to remove > + * callback. PCI drivers can do DMA and have pending interrupts. > + * Leaving the DMA and interrupts pending could damage the newly > + * booting kexec kernel as well as prevent it from booting altogether > + * if the pending interrupt is level. > + */ > if (drv && drv->shutdown) > drv->shutdown(pci_dev); > + else if (drv && drv->remove) > + drv->remove(pci_dev); > > /* > * If this is a kexec reboot, turn off Bus Master bit on the > -- 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. _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec