Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp3912433imm; Mon, 8 Oct 2018 11:34:32 -0700 (PDT) X-Google-Smtp-Source: ACcGV61QVG9hmr621PPJHvEcmeTBWvaED6KwkAUCFizPqC6jRxOxH3sc6nDn71iaajPF1S9PMzny X-Received: by 2002:a17:902:b198:: with SMTP id s24-v6mr24139532plr.70.1539023672184; Mon, 08 Oct 2018 11:34:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539023672; cv=none; d=google.com; s=arc-20160816; b=zcM7ol7Q2rfXJ2Q6mqTVJ10bxekdA/3zsGU22BuW0pzjgQZf2dSJZrke/jkfFTwDLw vm+fuHqDcla9OLG2X2mIpoVXaoXfDpjAi3lkzS7KWsi42Uh1wrBTRE5Up/fP9w5Qu7DC rFTCFNDXZcQJLL/1zDkgdWjZoHm1IOXmBIAjeGXTrgAM4JdvHswTeTpKoNSObgs/XilE 5ZaWSWy/kcJn0BjiOXcVqw3TPoKzlWDdO0JImBiquYxpXyY8yXSu0DYYm9a5bOhLotCx gyH5BmaUDMfRSgSx9Mb0IyiiHhkVtaOwsonFimsQ5yL4ADIqNE1vI/vh1YIsI27BT8Ak kUTw== 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=d2LuaJDwH3ewx3rW5km4r4MuJetMtKPYTyu1xEM2knQ=; b=x2VMD7EzvIqAl/x9hrZtCict6PM/O+/zHO6WTfn5N5shlTV5vFDIpDNS2DW6iXrBmG WnL7Ojj3SOWqpvq7NxLvYeMUnY/N+fVUW8SVHBWdlety2DbcfCqgWmtgq68aEsNkilwN 1KtAAYX68fQA9K4J90TnenmHb1i74qOjiutsxVqHvbGLxLxd7ND2wVH2T0HCzRl0evsy dXwgikLO1VHJCXlbKM5DZXZrEx4Bxg1uTyzCCCSlt2px9WvdkRjiCxO7E8oK0DtF8L9z Cdfgt4Sr6o7O3JZd1RKSOwGqxCig4Zbe5GM5zLqn+C/1eP5YEigFT+dUmEnVYs4sNtxo RFSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="zh4n/cMS"; 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 k10-v6si17198201plt.328.2018.10.08.11.34.17; Mon, 08 Oct 2018 11:34:32 -0700 (PDT) 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="zh4n/cMS"; 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 S1727267AbeJIBqm (ORCPT + 99 others); Mon, 8 Oct 2018 21:46:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:57040 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726460AbeJIBqm (ORCPT ); Mon, 8 Oct 2018 21:46:42 -0400 Received: from localhost (ip-213-127-77-176.ip.prioritytelecom.net [213.127.77.176]) (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 2A54E2089D; Mon, 8 Oct 2018 18:33:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1539023619; bh=WsEwiZX0SybsdVqPl4/bH8he6rwozqO8g/AgEwraJ6E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=zh4n/cMSchj9u2YPYsjADfjhTUFZ9VU2ZfbuzfmCxpy0Ev1MRMbHEx/7u8gewSj40 nnsdyI8rdQsE+kWqZdPjJ3n/Pw+lBxGedtBGow5/Qscw5lvkPM1xOhyDP9QW4zjv4C QXXvyfPce6CJQwshPYbiJRUIyZO36urQir3pmiL4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sebastian Reichel , Sudeep Holla , Sebastian Reichel , Sasha Levin Subject: [PATCH 4.4 007/113] power: vexpress: fix corruption in notifier registration Date: Mon, 8 Oct 2018 20:30:08 +0200 Message-Id: <20181008175531.219817187@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181008175530.864641368@linuxfoundation.org> References: <20181008175530.864641368@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review 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 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Sudeep Holla [ Upstream commit 09bebb1adb21ecd04adf7ccb3b06f73e3a851e93 ] Vexpress platforms provide two different restart handlers: SYS_REBOOT that restart the entire system, while DB_RESET only restarts the daughter board containing the CPU. DB_RESET is overridden by SYS_REBOOT if it exists. notifier_chain_register used in register_restart_handler by design relies on notifiers to be registered once only, however vexpress restart notifier can get registered twice. When this happen it corrupts list of notifiers, as result some notifiers can be not called on proper event, traverse on list can be cycled forever, and second unregister can access already freed memory. So far, since this was the only restart handler in the system, no issue was observed even if the same notifier was registered twice. However commit 6c5c0d48b686 ("watchdog: sp805: add restart handler") added support for SP805 restart handlers and since the system under test contains two vexpress restart and two SP805 watchdog instances, it was observed that during the boot traversing the restart handler list looped forever as there's a cycle in that list resulting in boot hang. This patch fixes the issues by ensuring that the notifier is installed only once. Cc: Sebastian Reichel Signed-off-by: Sudeep Holla Fixes: 46c99ac66222 ("power/reset: vexpress: Register with kernel restart handler") Signed-off-by: Sebastian Reichel Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/power/reset/vexpress-poweroff.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) --- a/drivers/power/reset/vexpress-poweroff.c +++ b/drivers/power/reset/vexpress-poweroff.c @@ -35,6 +35,7 @@ static void vexpress_reset_do(struct dev } static struct device *vexpress_power_off_device; +static atomic_t vexpress_restart_nb_refcnt = ATOMIC_INIT(0); static void vexpress_power_off(void) { @@ -99,10 +100,13 @@ static int _vexpress_register_restart_ha int err; vexpress_restart_device = dev; - err = register_restart_handler(&vexpress_restart_nb); - if (err) { - dev_err(dev, "cannot register restart handler (err=%d)\n", err); - return err; + if (atomic_inc_return(&vexpress_restart_nb_refcnt) == 1) { + err = register_restart_handler(&vexpress_restart_nb); + if (err) { + dev_err(dev, "cannot register restart handler (err=%d)\n", err); + atomic_dec(&vexpress_restart_nb_refcnt); + return err; + } } device_create_file(dev, &dev_attr_active);