Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp1183790ybf; Thu, 27 Feb 2020 06:28:13 -0800 (PST) X-Google-Smtp-Source: APXvYqyEWugKNsLX0P9HNQrVRB0jbniZ1AcnE5bHs+qJs5qgbc1HqJvmdWIWl+dXVHXF/nX+uEKw X-Received: by 2002:a9d:63d6:: with SMTP id e22mr3638173otl.185.1582813693156; Thu, 27 Feb 2020 06:28:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582813693; cv=none; d=google.com; s=arc-20160816; b=tGPUqVBnDyowZbOXniPIDcOhd26AVw9rfjjSlq9aUfK/v5+dlACZtP74UmHm//Nw+P d3g2U89J1MFOhSZKjk4Xykaq1ZP26JPh0PK6fr5fWPN3YQgpN9QOaYLQPpGJUQtiL+fi meOfTaQcpmZqxQ0Rlbu5uBfQypHxA1W4MEOJQE0unankoqdHAJ598rFm3+J4lvn+grYC I57nAqLfVn7Rd56M9iOISh/saqg07BhT0pQE+ILZ/N5ws6TCwPnbhNJwuoOX62nXPG26 Mlnq+hDCOsNj9DDRa9BLnO/kXprHuUVsXuGqTlY2zDdNgJstzSipF6O2iG4nFj41mMaP Bx0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=W0WdXb2CsYpgxQbREN5d8aSCaYSRu84/qH9WiBGahCk=; b=XPBksxQmASsOqyuK65h13fPi24hY549xOZbL7q187cfDApOj/dyTmF5mapETwtj8cC 24UsHWIH9Ng/itI94MiRxBwXH6h9xVGUcDXZTIMlQLUk9nNUx//9g0pTaSUxgRv2mlud wxN6zvg+piMCWxT987a/LCbN84aJhm7XVoIXV01R+VcCOta2eTXI8ybVv+tPrLA1g6mj f8maYr8KzD30K/gW2siMmuMvIVHxEXEK++dEreO47vPPwfcRVgn2bDEVr6g8ahXORM/S 1ZinxYZ79+shrf55zuegRRtZ33nx1lW8Yu57sn+Bw2ro4ds+tkK0VuEclyx4eB/HjCzE +PlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=RYFeipOa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y24si1470631oih.24.2020.02.27.06.28.00; Thu, 27 Feb 2020 06:28:13 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=RYFeipOa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388259AbgB0OIb (ORCPT + 99 others); Thu, 27 Feb 2020 09:08:31 -0500 Received: from mail.kernel.org ([198.145.29.99]:46294 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388249AbgB0OI2 (ORCPT ); Thu, 27 Feb 2020 09:08:28 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4A32821D7E; Thu, 27 Feb 2020 14:08:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582812507; bh=dG1J/I8WKVAUK14Lul6+PWveA9+GuP9eZlvwnpNFn9k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RYFeipOa7loet1hNKl21Aucqw8LMSZ/UBIQ1VfxnvRLGKI4lZjrOGhIjOy1eJb+bg GDmNVQnwzmZ/ydMbYmsamFsi+Ai+PaO5x9qXMuGmMOMPNycAd8V0MH5Hm+9Lfe1sQw NDnOB93/qZExvm8Cx8659CLH2dOODHNrkpn9mMXw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sam Bobroff , Frederic Barrat , Michael Ellerman Subject: [PATCH 5.4 044/135] powerpc/eeh: Fix deadlock handling dead PHB Date: Thu, 27 Feb 2020 14:36:24 +0100 Message-Id: <20200227132235.604446318@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200227132228.710492098@linuxfoundation.org> References: <20200227132228.710492098@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sam Bobroff commit d4f194ed9eb9841a8f978710e4d24296f791a85b upstream. Recovering a dead PHB can currently cause a deadlock as the PCI rescan/remove lock is taken twice. This is caused as part of an existing bug in eeh_handle_special_event(). The pe is processed while traversing the PHBs even though the pe is unrelated to the loop. This causes the pe to be, incorrectly, processed more than once. Untangling this section can move the pe processing out of the loop and also outside the locked section, correcting both problems. Fixes: 2e25505147b8 ("powerpc/eeh: Fix crash when edev->pdev changes") Cc: stable@vger.kernel.org # 5.4+ Signed-off-by: Sam Bobroff Reviewed-by: Frederic Barrat Tested-by: Frederic Barrat Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/0547e82dbf90ee0729a2979a8cac5c91665c621f.1581051445.git.sbobroff@linux.ibm.com Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/kernel/eeh_driver.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -1200,6 +1200,17 @@ void eeh_handle_special_event(void) eeh_pe_state_mark(pe, EEH_PE_RECOVERING); eeh_handle_normal_event(pe); } else { + eeh_for_each_pe(pe, tmp_pe) + eeh_pe_for_each_dev(tmp_pe, edev, tmp_edev) + edev->mode &= ~EEH_DEV_NO_HANDLER; + + /* Notify all devices to be down */ + eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); + eeh_set_channel_state(pe, pci_channel_io_perm_failure); + eeh_pe_report( + "error_detected(permanent failure)", pe, + eeh_report_failure, NULL); + pci_lock_rescan_remove(); list_for_each_entry(hose, &hose_list, list_node) { phb_pe = eeh_phb_pe_get(hose); @@ -1208,16 +1219,6 @@ void eeh_handle_special_event(void) (phb_pe->state & EEH_PE_RECOVERING)) continue; - eeh_for_each_pe(pe, tmp_pe) - eeh_pe_for_each_dev(tmp_pe, edev, tmp_edev) - edev->mode &= ~EEH_DEV_NO_HANDLER; - - /* Notify all devices to be down */ - eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true); - eeh_set_channel_state(pe, pci_channel_io_perm_failure); - eeh_pe_report( - "error_detected(permanent failure)", pe, - eeh_report_failure, NULL); bus = eeh_pe_bus_get(phb_pe); if (!bus) { pr_err("%s: Cannot find PCI bus for "