Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp3643837ima; Mon, 4 Feb 2019 02:42:07 -0800 (PST) X-Google-Smtp-Source: ALg8bN6LZBzVCiiK+FNSn1pjD3uyOQu4Rsfeh2Sfr/t66BkVxku/3MM9siO1B09BgnY9vnHEvas1 X-Received: by 2002:a62:6f49:: with SMTP id k70mr49989781pfc.7.1549276927320; Mon, 04 Feb 2019 02:42:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549276927; cv=none; d=google.com; s=arc-20160816; b=Vo3TPfMHDoICKKGecwrQDLlm9qEbCkNevwvtvk4qhmomxu7XLGzBATumKx9xmT+W43 RVtyRH/lRT/li0JGbqqiWq6XIYbNAXwXDZ4TX/0cVh/FFvY8a5X9H++N68RQ9/xCu9LY XHt7MndPsuwXK16fj8qDdwEGQtFvamHAhX0+0AxO+9Wde4kHounX7yMC1Tk9GS8RMVIX T/4NmMgvxyal3zGoMz0lSLSN/LZwtxyjsIQ8KSy5k/DqqdvZfJrD618GzlUy519bSVgw a5FwSzrn88IkVbqvbMq44H7FjkeXOtBxrwvPOTkusanYzuDh238W/L77rOjy5M/Pcso/ 6K7w== 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=HEgKjDD8GDwNhJ/y2hGlD9SE1rFG+71HInlkqJROLLg=; b=B9G8wh1zTfM0Mv+vw01iJ6Nz5fa4bz8qvjdkiuWMHwKDVecbvrs8OmaRoQ5qOahCV+ KgjAm3ZNywUJBQiuxUjfxbSrihy0wXVJv+Vo6J3WLdW2S4QAEHMVNRFA9h8GPEub4sHm Pbaqgll4B4b5jL04ECUS3ESk7OfwBgr6ovx0IC+YaSh7EvXApHvX77hgmXunxXVEfr9I yI9HNNgJx8G9cNP13joXXZVXQVlZz8Hd3c23dY0JOJWLEDseFRqaw3d/YwQhzRtlpqrk ozzuR2azMVkjv1uxp6zro1B9cDkzQzb9y/C3dHtP8anoprlC46/raFnc9/TEOwWZsIfo tHGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vLh0KTNo; 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 62si15562031plc.87.2019.02.04.02.41.51; Mon, 04 Feb 2019 02:42:07 -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=vLh0KTNo; 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 S1728906AbfBDKjl (ORCPT + 99 others); Mon, 4 Feb 2019 05:39:41 -0500 Received: from mail.kernel.org ([198.145.29.99]:37692 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728391AbfBDKjj (ORCPT ); Mon, 4 Feb 2019 05:39:39 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.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 205BD2075B; Mon, 4 Feb 2019 10:39:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1549276778; bh=gLsWGw+F7ZU7jb0+dscbM9k1DAYbCa/md2AxCGT7g4U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vLh0KTNonhQfkalGGO3QRVPR/TYdnB/dX3/niRT4o7Gf6WUNnc++D7NdZhcyPhI3e HWUTZlwifBnmUzhpj9FixDsqQV7jUPvQYHWj99ZqkdaRZCqvM2qvLSj75I22Yf577S TtMiQlyIhJuCzZj8fjtrf1NzzO1pWcZJLGn0f0JA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Gerald Schaefer , Martin Schwidefsky Subject: [PATCH 4.4 12/65] s390/smp: fix CPU hotplug deadlock with CPU rescan Date: Mon, 4 Feb 2019 11:36:05 +0100 Message-Id: <20190204103612.579164006@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190204103610.583715954@linuxfoundation.org> References: <20190204103610.583715954@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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: Gerald Schaefer commit b7cb707c373094ce4008d4a6ac9b6b366ec52da5 upstream. smp_rescan_cpus() is called without the device_hotplug_lock, which can lead to a dedlock when a new CPU is found and immediately set online by a udev rule. This was observed on an older kernel version, where the cpu_hotplug_begin() loop was still present, and it resulted in hanging chcpu and systemd-udev processes. This specific deadlock will not show on current kernels. However, there may be other possible deadlocks, and since smp_rescan_cpus() can still trigger a CPU hotplug operation, the device_hotplug_lock should be held. For reference, this was the deadlock with the old cpu_hotplug_begin() loop: chcpu (rescan) systemd-udevd echo 1 > /sys/../rescan -> smp_rescan_cpus() -> (*) get_online_cpus() (increases refcount) -> smp_add_present_cpu() (new CPU found) -> register_cpu() -> device_add() -> udev "add" event triggered -----------> udev rule sets CPU online -> echo 1 > /sys/.../online -> lock_device_hotplug_sysfs() (this is missing in rescan path) -> device_online() -> (**) device_lock(new CPU dev) -> cpu_up() -> cpu_hotplug_begin() (loops until refcount == 0) -> deadlock with (*) -> bus_probe_device() -> device_attach() -> device_lock(new CPU dev) -> deadlock with (**) Fix this by taking the device_hotplug_lock in the CPU rescan path. Cc: Signed-off-by: Gerald Schaefer Signed-off-by: Martin Schwidefsky Signed-off-by: Greg Kroah-Hartman --- arch/s390/kernel/smp.c | 4 ++++ drivers/s390/char/sclp_config.c | 2 ++ 2 files changed, 6 insertions(+) --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -1152,7 +1152,11 @@ static ssize_t __ref rescan_store(struct { int rc; + rc = lock_device_hotplug_sysfs(); + if (rc) + return rc; rc = smp_rescan_cpus(); + unlock_device_hotplug(); return rc ? rc : count; } static DEVICE_ATTR(rescan, 0200, NULL, rescan_store); --- a/drivers/s390/char/sclp_config.c +++ b/drivers/s390/char/sclp_config.c @@ -43,7 +43,9 @@ static void sclp_cpu_capability_notify(s static void __ref sclp_cpu_change_notify(struct work_struct *work) { + lock_device_hotplug(); smp_rescan_cpus(); + unlock_device_hotplug(); } static void sclp_conf_receiver_fn(struct evbuf_header *evbuf)