From patchwork Tue Feb 16 22:03:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 583753 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id AAFFD1402BF; Wed, 17 Feb 2016 09:03:24 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical-com.20150623.gappssmtp.com header.i=@canonical-com.20150623.gappssmtp.com header.b=u1BDYBvr; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1aVniK-0003jf-3t; Tue, 16 Feb 2016 22:03:20 +0000 Received: from mail-ig0-f181.google.com ([209.85.213.181]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.76) (envelope-from ) id 1aVniE-0003jL-Pe for kernel-team@lists.ubuntu.com; Tue, 16 Feb 2016 22:03:14 +0000 Received: by mail-ig0-f181.google.com with SMTP id y8so1048493igp.1 for ; Tue, 16 Feb 2016 14:03:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id; bh=bkHdzoMNCjG168DEYRjuxHBD1D4ZR/CW3dYIDi4JrKc=; b=u1BDYBvrUfQb8WKOvSnAV8eRnpOkHXjIIhrT3lx1vGRrZqYMIwEyq3+k0yIOe5/SCj OEQYDQuIiTt9CzjQFUD5CrPz7pwIA3SFC+O89l9cofPCtkVUHAjiZO+8tvqXo/H6ln9x OnbViqI8NveyrTepA0+mpT3sKtDIyXD6u5dcTr2WPFe/7ZQsdlEjv0ZjQIya5567pDnE TNlL+KJoBEBeWNXOVwhzkreNlj6Pc2XGGAkfudQlR8Dbn7XWOQb8o0bXlTq7vBHVqNrj lFWjxRndgaBqY3EPJ9iFExY/+UIDSZkvsZ1vGmMakd+w5D00xCi1//UklWY96P6LSbe4 dqIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=bkHdzoMNCjG168DEYRjuxHBD1D4ZR/CW3dYIDi4JrKc=; b=Pmvnn63d4nPRiVwwysKtizt3p7rK7m0vKWUyxV2inKcupY9Rko5cfwtgFFqhblVOKl JYx8oc/IzO2y+JzkCZQkyAJc2ciWz1EAVU/6iBVud/P6+j2gBYuqm6kVpuNcYfLu1LVp DNnWSZHFJ8Y12pydxe5xBn8o1QG1eAC8VOVWFru/fKX+Fzq9Hk+S/DWwFbe7l2zqjbIV KpZ5NTAxyUaDMDJHMz7UHm3Yph4K8qm/Cu04F89AtvpzTRSEfQr6C5lS3Ffprodfn/e/ uj02lFrVqhENwXgzL9Lf1ksXwoXeh27VSEDimTtz/b985AeN2o2NbwgwGP+jR8uPls47 lrNQ== X-Gm-Message-State: AG10YOROzY5aG65You9qDs+Z80k+ASbF5PyITrgJsXpQkBqnoa1FEtil9mlPm9pI5aJA2jkG X-Received: by 10.202.83.142 with SMTP id h136mr18217045oib.131.1455660193705; Tue, 16 Feb 2016 14:03:13 -0800 (PST) Received: from localhost.localdomain (host-98-127-250-84.bln-mt.client.bresnan.net. [98.127.250.84]) by smtp.gmail.com with ESMTPSA id q4sm19106767oew.6.2016.02.16.14.03.12 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Feb 2016 14:03:12 -0800 (PST) From: tim.gardner@canonical.com To: kernel-team@lists.ubuntu.com Subject: [PATCH Wily SRU] powerpc/powernv: Fix stale PE primary bus Date: Tue, 16 Feb 2016 15:03:11 -0700 Message-Id: <1455660191-18081-1-git-send-email-tim.gardner@canonical.com> X-Mailer: git-send-email 2.7.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Gavin Shan BugLink: http://bugs.launchpad.net/bugs/1546145 When PCI bus is unplugged during full hotplug for EEH recovery, the platform PE instance (struct pnv_ioda_pe) isn't released and it dereferences the stale PCI bus that has been released. It leads to kernel crash when referring to the stale PCI bus. This fixes the issue by correcting the PE's primary bus when it's oneline at plugging time, in pnv_pci_dma_bus_setup() which is to be called by pcibios_fixup_bus(). Cc: stable@vger.kernel.org # v4.1+ Reported-by: Andrew Donnellan Reported-by: Pradipta Ghosh Signed-off-by: Gavin Shan Tested-by: Andrew Donnellan Signed-off-by: Michael Ellerman (cherry picked from linux-next commit 1bc74f1ccd457832dc515fc1febe6655985fdcd2) Signed-off-by: Tim Gardner --- arch/powerpc/platforms/powernv/pci-ioda.c | 1 + arch/powerpc/platforms/powernv/pci.c | 20 ++++++++++++++++++++ arch/powerpc/platforms/powernv/pci.h | 1 + 3 files changed, 22 insertions(+) diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index e3edd4b..da0a5f2 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -3064,6 +3064,7 @@ static void pnv_pci_ioda_shutdown(struct pci_controller *hose) static const struct pci_controller_ops pnv_pci_ioda_controller_ops = { .dma_dev_setup = pnv_pci_dma_dev_setup, + .dma_bus_setup = pnv_pci_dma_bus_setup, #ifdef CONFIG_PCI_MSI .setup_msi_irqs = pnv_setup_msi_irqs, .teardown_msi_irqs = pnv_teardown_msi_irqs, diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index bcbe2bf..5e9e0dd 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -762,6 +762,26 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev) phb->dma_dev_setup(phb, pdev); } +void pnv_pci_dma_bus_setup(struct pci_bus *bus) +{ + struct pci_controller *hose = bus->sysdata; + struct pnv_phb *phb = hose->private_data; + struct pnv_ioda_pe *pe; + + list_for_each_entry(pe, &phb->ioda.pe_list, list) { + if (!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL))) + continue; + + if (!pe->pbus) + continue; + + if (bus->number == ((pe->rid >> 8) & 0xFF)) { + pe->pbus = bus; + break; + } + } +} + void pnv_pci_shutdown(void) { struct pci_controller *hose; diff --git a/arch/powerpc/platforms/powernv/pci.h b/arch/powerpc/platforms/powernv/pci.h index 93a319a..aa127cd 100644 --- a/arch/powerpc/platforms/powernv/pci.h +++ b/arch/powerpc/platforms/powernv/pci.h @@ -234,6 +234,7 @@ extern void pnv_pci_reset_secondary_bus(struct pci_dev *dev); extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option); extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev); +extern void pnv_pci_dma_bus_setup(struct pci_bus *bus); extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type); extern void pnv_teardown_msi_irqs(struct pci_dev *pdev);